创建第一个管理员
服务器自己管理自己。没有需要去日志里查找的预置密码,也没有 create-admin 命令——第一个管理员在浏览器中创建,而且只创建一次。
-
在一个刚完成初始化的部署上打开
/admin,例如http://localhost:3000/admin。 -
Create the first super admin 页面会要求输入一个电子邮件地址和一个至少十二个字符的密码。该账户会进入保留的「Administrators」用户桶,成为 Super administrators(其成员管理整个实例的组)的成员,并且像其他任何管理员一样获得一个个人组。
-
提交,然后用这些凭据登录。
一旦 Super administrators 有了一个活跃成员,设置路由就会关闭,此后一律返回 409 already_initialized。/admin 变成登录页面。后续的管理员在控制台的 Administrators 页面上通过 New administrator 创建,同样需要一个电子邮件地址和一个至少十二个字符的密码。超级管理员还可以在该页面的 Sign-in 标签页上开放注册,让人们自行注册,或者在 Identity providers 下连接你所在组织的身份提供商。无论通过哪种方式加入,新管理员都不会是超级管理员:这一身份要由超级管理员在账户菜单中通过 Make super administrator… 单独授予。(另外,普通组的成员资格是通过电子邮件邀请提供的。)如果你在一个本应已有管理员的部署上看到了设置页面,就值得调查一下:这意味着此服务器读取的账户集合里一个账户都没有。

管理员通过此服务器自己的签发者登录
Section titled “管理员通过此服务器自己的签发者登录”登录控制台是一次 OpenID Connect 授权码流程,针对的正是控制台所管理的这台服务器,使用的是 db:setup 预置的第一方 admin-panel 客户端。没有第二套密码存储,也没有仅供管理员使用的凭据路径:管理员就是保留管理员桶中的一个最终用户,管理 API 允许他们做什么,取决于他们所属的组。
由此产生两个后果,两者在实践中都会遇到:
- 预置客户端的重定向 URI 是
$ISSUER/admin/callback,只在该客户端首次插入时写入一次。如果在预置之后修改了ISSUER,登录会重定向到一个该客户端并未登记的 URI 并因此失败;重新运行db:setup无法修复它。处理方法参见 Compose 指南中的警告。 - 没有种子数据就无法访问控制台。如果
db:setup从未运行过,/admin/login会带着一个没有任何客户端匹配的client_id重定向到/auth。
开启第二因素认证
Section titled “开启第二因素认证”管理员桶是一扇暴露在公共互联网上、只靠密码把守的门,所以我们的建议是:在做其他任何事之前,先要求它使用身份验证器应用。在控制台中进入 Administrators 页面(仅限超级管理员),打开 Sign-in 标签页,开启 Require an authenticator app for password sign-in 并保存。控制台会先显示还有多少管理员没有绑定身份验证器,并请你确认。
之后登录除了密码,还需要一个六位数的验证码。开启它不会把任何人锁在门外:尚未绑定身份验证器的管理员会在下次登录时完成绑定。这也包括使用 database/mongodb.ts 预置的保留 admin-mcp 客户端登录的智能体,因为它走的是同一扇门。通过身份提供商登录的管理员则使用该提供商的第二因素;这项要求只适用于密码登录。
这件事比看上去更重要。失败的密码尝试按桶和电子邮件地址计数,达到上限的地址会在一段时间内被拒绝。按照设计,要求一次性验证码的桶无论被触发多少次,都停留在第一个锁定时间窗口:在那里猜中密码也无法让任何人登录。管理员也没有自助重置密码的途径来摆脱锁定。真正让这扇门变得坚固的是第二因素,而不是节流。节流本身的设置是设置参考中的 loginThrottle.failureCap、loginThrottle.windowSeconds 和 loginThrottle.windowCeilingSeconds。
管理员能触及什么
Section titled “管理员能触及什么”控制台的超级管理员功能覆盖实例本身:服务器设置、签名密钥、SMTP、管理员账户和故障存储。超级管理员的身份,就是保留的 Super administrators 组的成员资格;它的授予和撤回各自是独立的操作(Administrators 页面上的 Make super administrator… 和 Withdraw super administration…,对智能体而言则是 admin_super_grant 和 admin_super_withdraw);最后一个活跃成员既不能被撤回,也不能被停用。其他任何管理员都可以创建项目、桶和组,通过电子邮件邀请他人加入自己的普通组,并读取自己所属组的审计日志和 Usage 页面。所有权按组划分:属于某个容器的所属组,就是获得其访问权限的方式。
每一个改变状态的操作,无论来自控制台还是智能体,都会在变更发生之前写入只追加的审计日志,记录操作者、操作和目标。该存储不提供任何更新或删除接口。
如果你发现的是安全问题而非配置问题,项目的漏洞披露政策和联系方式见安全页面。