monitor

使用

登录与安全设置

配置 GitHub 单点登录,管理应急密码。

两条登录通道:GitHub 单点登录为主,本地应急密码为辅

应急密码不要删——GitHub 挂了、被墙了、OAuth App 配错了的时候,那是唯一的入口。

配置 GitHub 单点登录

1. 在 GitHub 建一个 OAuth App

Settings → Developer settings → OAuth Apps → New OAuth App

字段填什么
Application name随便,比如 monitor
Homepage URLhttps://hub.example.com
Authorization callback URLhttps://hub.example.com/api/auth/github/callback

回调路径必须精确是 /api/auth/github/callback 填错的表现极具迷惑性: GitHub 授权成功,浏览器回到站点看起来一切正常,但就是没登上。

2. 填进面板

安全 页填 Client ID 和 Client Secret,再填允许登录的 GitHub 用户名,逗号分隔。

白名单留空 = 拒绝所有人,不是放行所有人。配好 SSO 别忘了填自己的用户名。

Client Secret 只能写不能读:面板可以设置它,但读不回来,只能拿到一个「已设置」的标记。

只申请 read:user scope。

3. 改掉应急密码

同一页,最短 12 位,argon2id 哈希存储。

改密码会作废所有登录会话,包括正开着的实时推送流——那条流里带着每个节点的明文 token, 不断开的话,泄露出去的凭证会比被吊销的那个会话活得更久。

应急密码

首次启动时 hub 生成一个 24 字符的随机密码打印到日志,只打印这一次

journalctl -u monitor-hub | grep Emergency     # 二进制部署
docker logs monitor | grep Emergency           # 容器部署
bash

登录限流

同一来源地址 15 分钟内 5 次失败就锁死,成功登录清零。

另有一道并发闸门:同一时刻只允许一次密码校验,挤不进来的直接 429,不排队。 锁定管的是「一个地址试几次」,管不住「几个地址一起试」——而 IPv6 下攻击者手里的地址是一整个 /64

argon2 一次要 19 MiB 和大约十分之一秒的一个核。这个开销是故意的,但没有上界它就从防御变成杠杆。

用密码登录过的 hub,常驻内存会比没登录过的高不少(argon2 的那 19 MiB 留在 allocator 里, glibc 不还给系统)。这是正常的,且有封顶。用 SSO 登录不走这条路。

会话

  • 256 位随机 token,数据库里只存 sha256
  • cookie 是 HttpOnly + SameSite=Lax + Path=/,HTTPS 下加 Secure
  • 14 天过期,每小时清一次过期记录

SameSite=Lax 加同源 API 就是 CSRF 防护,没有额外的 CSRF token。

登录不通时怎么排查

先看日志,失败原因都在里面:

journalctl -u monitor-hub -f | grep sign-in
bash
日志里的话什么意思
no allowed GitHub users configured白名单是空的。空 = 拒绝所有人
GitHub user X is not on the allowed list用户名不在白名单里
GitHub returned access_denied在 GitHub 的授权页上点了拒绝
state mismatch or missing不是从登录页发起的,或者 state cookie 过期了(10 分钟)
incorrect_client_credentialsClient Secret 不对

同样的原因也会红字显示在登录页上。

唯一一种服务端没有任何日志的情况是回调路径填错了——那个路径压根没进任何 handler。 现在未匹配的 /api/ 会返回 404 而不是页面,所以这个错误会立刻现形。

完整白名单只进日志,不会显示在登录页上——任何一个 GitHub 账号都能走完授权拿到那句话, 带上白名单就等于把「值得钓鱼的那几个名字」发给所有人。