Skip to content

Agent 操作网站解决方案 ​

2026-10-12 · 沉思波 · 让 AI 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 都是"出示即通过"的共享秘密,一旦泄漏,攻击者和你拥有同样的东西;而私钥从不离开生成它的那台机器,网络上跑的只是签名——签名泄漏了也没用。

认证流程(四步) ​

  1. 取挑战:Agent 向服务端要一个一次性随机串(nonce,2 分钟内有效)
  2. 签名:用本机私钥对这个串签名
  3. 验签换令牌:服务端用登记过的公钥验签;通过则发一枚 12 小时令牌
  4. 调用:Agent 拿令牌调运营接口,做的事记在绑定账号名下

三处刻意的设计:

  • nonce 一次性:验完即焚,同一个 nonce 不能重放
  • 令牌短效(12 小时):把"撤销多久生效"压到可接受范围——密钥被撤销后,已发出的令牌最多再活 12 小时
  • 签名与权限解耦:令牌绑定的是某个账号,所以"能干什么"仍由该账号的角色卡决定,密钥本身不携带任何权限

权限边界:Agent 能做什么、不能做什么 ​

能做(运营动作):录待办、整理文档、登记图床目录、核对上线清单等日常运营。

不能做(管理动作):admin 级动作不向 Agent 开放。

这条边界是刻意的,和本站控制台"管理员角色卡不能从页面发放"是同一条口径:Agent 是干活的,不是发号施令的。就算某台机器的私钥泄漏,攻击者拿到的也只是"运营权限 + 一个可被立即撤销的身份"。

多台电脑怎么开权限 ​

不需要复制任何密钥——每台机器有自己的钥匙:

  1. 老板在控制台点「发配对码」,得到一串 8 位一次性码(10 分钟内有效、只能用一次)
  2. 把那串码给新机器
  3. 新机器生成自己的密钥对,用这串码登记公钥
  4. 登记完成,那台机器的 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":"录一条待办"}'

设计原则 ​

四条,按重要性排序:

  1. 秘密不流动——私钥不出机器,网络上只跑签名;能不动的东西就别动
  2. 权限不随身——密钥不携带权限,权限永远在账号的角色卡上;这样"泄漏一把钥匙"永远不等于"提权"
  3. 撤销要便宜——撤销粒度是"一把钥匙",且秒级生效(配合短效令牌)
  4. 审计要认人——每把钥匙有名字和机器,写动作能追到"哪台机器的哪个 Agent",而不是笼统的"账号干了什么"

相关 ​

本页讨论

0 条评论

还没有评论,来说第一句。

Ctrl + Enter 发布