外观
Agent 操作网站解决方案
AI 已经开始帮我们干活了——整理待办、归档文档、核对上线清单。但只要它要"动手",就绕不开一个老问题:给它什么身份?
这份页面把我们自己的答案写清楚:一套公钥认证 + 短效令牌 + 可撤销的 Agent 接入方案。它不是概念稿,是本站控制台里正在跑的东西。
问题:Agent 要干活,但口令不能满天飞
把账号口令交给 Agent,是最省事的做法,也是最差的做法:
| 问题 | 具体表现 |
|---|---|
| 泄漏面随机器数增长 | 5 台电脑上的 Agent 各存一份口令,就是 5 个泄漏点;口令还会被写进脚本、日志、剪贴板 |
| 撤销牵连所有人 | 想收回某台机器的权限,只能改口令——所有机器一起失效,还得挨个重发 |
| 分不清是谁干的 | 审计里只有"账号 A 做了 X",看不出是老板本人、还是他笔记本上的某个 Agent |
| 权限一刀切 | 口令背后是完整账号权限;Agent 只需要录个待办,却拿到了全部能力 |
结论:口令不是给机器用的凭证。 机器该用的是密钥。
方案总览
每台机器 / 每个 Agent 服务端
┌──────────────────────────┐ ┌──────────────────────────┐
│ 本地生成 ed25519 密钥对 │ │ 只存公钥(agent_keys 表) │
│ 私钥 0600,永不出机器 ───┼────────────┼──> 公钥 + 名称 + 机器 + 指纹 │
└──────────────────────────┘ └──────────────────────────┘
│ │
│ ① 取一次性 nonce │
├───────────────────────────────────────>│
│ ② 用私钥对 nonce 签名(签名可公开传) │
├───────────────────────────────────────>│ ③ 验签
│ ④ 拿到 12 小时令牌 │
│<───────────────────────────────────────┤
│ ⑤ 带令牌调运营接口(能干什么由角色卡决定) │
└───────────────────────────────────────>│为什么用公私钥,而不是口令或长期 API Key
| 账号口令 | 长期 API Key | 本方案(公钥签名) | |
|---|---|---|---|
| 服务端存什么 | 口令哈希 | Key 明文/哈希 | 只存公钥 |
| 传输什么 | 口令(可被截获重放) | Key(同上) | 一次性 nonce 的签名(反推不出私钥,且 nonce 用过即焚) |
| 机器上存什么 | 口令 | Key | 私钥(不传输,本地签名) |
| 撤销粒度 | 整个账号 | 单把 Key | 单把钥匙(那台机器立刻失效,不牵连别人) |
| 身份可追溯 | 只到账号 | 到 Key | 到"哪台机器的哪个 Agent" |
关键差别在于:口令和 API Key 都是"出示即通过"的共享秘密,一旦泄漏,攻击者和你拥有同样的东西;而私钥从不离开生成它的那台机器,网络上跑的只是签名——签名泄漏了也没用。
认证流程(四步)
- 取挑战:Agent 向服务端要一个一次性随机串(nonce,2 分钟内有效)
- 签名:用本机私钥对这个串签名
- 验签换令牌:服务端用登记过的公钥验签;通过则发一枚 12 小时令牌
- 调用:Agent 拿令牌调运营接口,做的事记在绑定账号名下
三处刻意的设计:
- nonce 一次性:验完即焚,同一个 nonce 不能重放
- 令牌短效(12 小时):把"撤销多久生效"压到可接受范围——密钥被撤销后,已发出的令牌最多再活 12 小时
- 签名与权限解耦:令牌绑定的是某个账号,所以"能干什么"仍由该账号的角色卡决定,密钥本身不携带任何权限
权限边界:Agent 能做什么、不能做什么
能做(运营动作):录待办、整理文档、登记图床目录、核对上线清单等日常运营。
不能做(管理动作):admin 级动作不向 Agent 开放。
这条边界是刻意的,和本站控制台"管理员角色卡不能从页面发放"是同一条口径:Agent 是干活的,不是发号施令的。就算某台机器的私钥泄漏,攻击者拿到的也只是"运营权限 + 一个可被立即撤销的身份"。
多台电脑怎么开权限
不需要复制任何密钥——每台机器有自己的钥匙:
- 老板在控制台点「发配对码」,得到一串 8 位一次性码(10 分钟内有效、只能用一次)
- 把那串码给新机器
- 新机器生成自己的密钥对,用这串码登记公钥
- 登记完成,那台机器的 Agent 立刻可用
为什么用配对码而不是"上传公钥":公钥本身不敏感,但"谁有权登记公钥"敏感。配对码把这件事收在一次、限时、由管理员发起的动作里——不需要任何人在两台机器之间搬运长期凭证。
撤销与轮换
- 撤销一把钥匙:控制台一键置为 revoked,那台机器的私钥立刻作废,其他机器不受影响
- 换机器:新机器重新走一次配对码流程即可,不需要动老机器
- 疑似泄漏:直接撤销那把钥匙,然后看审计里它最后用在哪
我们实际怎么用它
本站所有 Agent 共用一把钥匙,私钥放在本机统一位置(~/.chensibo/agent-key.pem,权限 0600),任何 Agent 按约定找到它即可操作:
bash
# 一次性:生成本机密钥
node scripts/agent-key.mjs init --name "潘的 MacBook"
# 用控制台发的配对码登记公钥
node scripts/agent-key.mjs register --code XXXX2345
# 之后随时可用(令牌自动续,无感)
node scripts/agent-key.mjs whoami
node scripts/agent-key.mjs call GET /api/console/team/tasks
node scripts/agent-key.mjs call POST /api/console/team/tasks '{"title":"录一条待办"}'设计原则
四条,按重要性排序:
- 秘密不流动——私钥不出机器,网络上只跑签名;能不动的东西就别动
- 权限不随身——密钥不携带权限,权限永远在账号的角色卡上;这样"泄漏一把钥匙"永远不等于"提权"
- 撤销要便宜——撤销粒度是"一把钥匙",且秒级生效(配合短效令牌)
- 审计要认人——每把钥匙有名字和机器,写动作能追到"哪台机器的哪个 Agent",而不是笼统的"账号干了什么"

本页讨论
0 条评论还没有评论,来说第一句。