资讯详情

资讯详情

给 AI Agent 最小权限:git-ai 安全模型——Token 身份、RPC 白名单与分支策略

【免费下载链接】git-aiGit designed for AI agents.项目地址https://gitcode.com/gh_mirrors/op/git-ai点击查看免费下载当 AI Agent 开始自动提交代码如何保证它不会写坏主分支、更不会把仓库拖下水git-ai 项目Graft一款为 AI Agent 设计的 Git给出的答案是完整的最小权限安全模型每个 Agent 持有独立的 Token 身份所有 gRPC 请求受RPC 白名单约束每一次分支更新再经过分支策略裁决。三层防线层层收紧让 Agent能干完活但动不了不该动的东西。这篇文章带你从零看懂这套机制为什么 Agent 需要最小权限、Token 身份如何防冒充、白名单里有什么和绝不能有什么、分支策略规则怎么写以及上线前该记住的 6 步清单。为什么 AI Agent 必须用最小权限 Agent 是自动化写作者——它的价值就在于无需人工干预就能落地变更这同时意味着风险如果 Agent 能创建/删除仓库它可以安装服务端钩子甚至把仓库内容推送到任意外部地址数据外泄如果 Agent 能随意更新引用它可以绕过保护分支直接改写main如果请求体里的用户名可以伪装身份Agent 可以冒充别的 Agent 给自己批审核。git-ai 的安全模型针对这三类风险设计了三道闸门防线解决的问题关键配置① Token 身份你是谁能否冒充别人[[graft.agent]]② RPC 白名单你能调用哪些接口agent_rpcs③ 分支策略你能改哪些分支[[graft.policy]]完整定义见官方文档 AGENT-SECURITY.md。Token 身份每个 Agent 一张独立工牌 给每个 Agent 发独立 Token每个 Agent 在配置文件中占一个[[graft.agent]]条目用token_file指向自己的密钥文件或直接用token字段[[graft.agent]] name planner token_file /etc/graft/tokens/planner [[graft.agent]] name builder token_file /etc/graft/tokens/builder启动时服务器会严格校验配置名字为空、重名、两个 Agent 共用一个 Token、Agent Token 与共享auth.token相同都会直接拒绝启动。注释完整的示例配置在 examples/graft/config.toml。认证细节常量时间比较 HMAC 时效窗口认证逻辑在 auth/token.go 与 internal/gitaly/server/auth/agent.go 中实现有两处值得新手注意常量时间比较Token 比对使用crypto/subtle防止攻击者通过响应耗时差异猜测密钥v2 HMAC 格式除明文 bearer 外还接受用 Agent Token 作为密钥计算的 HMAC-SHA256 签名 Token带时间戳且只有约 30 秒的有效期窗口——重放旧 Token 无效。身份只来自 Token不来自请求体这是最关键的设计身份取自 Token绝不取自请求。Agent 请求里携带的用户 ID 字段gl_id、gl_username会被服务器统一覆写为 Token 对应的 Agent 名。也就是说builder拿着自己的 Token、却在请求里自称planner去更新main依然会被当成builder来裁决——直接拒绝。Agent 身份通过 internal/graft/identity/identity.go 中的Identity结构在请求全链路传递changelog、策略裁决、审核记录用的都是这个身份。⚠️ 共享auth.token是运维凭证不是 Agent。它保留给备份工具、校验器等管理端组件绝不能发给 Agent 使用。RPC 白名单Agent 能调什么绝不能调什么 ️通过 Token 认证的 Agent下一步还要过 RPC 白名单。白名单定义在 internal/gitaly/server/auth/agent_methods.go分三层理解内置允许恰好够 Agent 干活的接口内置白名单正是 SDK、graftCLI 和缓存层实际用到的最小集合读类接口对象/树读取ObjectService、变更集ChangesetService只读、派生数据、代码搜索SearchService只读访问器commit/ref/blob/diff 等服务的Find*、List*、Get*方法审核ReviewService全部接口——它的写操作只写审核存储、绝不碰引用且记录的是 Token 身份Agent 无法替别的 Agent 批审核落地与提交UserLand、UserCommitFiles、UserCreateBranch、UserDeleteBranch且全部要过分支策略杂项ServerInfo、RepositoryExists与健康检查。永久禁止连配置也开不了的红线有一批接口对 Agent永远关闭即使你写进agent_rpcs也不行启动时会被直接报错拦下禁止的接口为什么危险CreateRepository、CreateRepositoryFromURL/Snapshot等可从任意 URL 拉数据建库快照甚至可携带钩子文件构成服务端请求伪造与钩子植入BackupRepository、RemoveRepository、ReplicateRepository可把仓库数据写到调用者指定的任意位置外泄UpdateRemoteMirror、FindRemoteRepository向调用者自选的 URL 推数据/发请求外泄与 SSRFUpdateReferences、DeleteRefs、WriteRef绕开策略直接写引用HookService、CleanupService、PartitionService等伪造钩子回调、破坏存储结构等管理操作代码中对每条红线都写了注释说明攻击场景可以对照 agent_methods.go 阅读。默认拒绝 可控扩展白名单之外的接口默认全部拒绝错误码PermissionDenied且信息不泄露更多细节。如果确实需要额外接口比如查仓库大小可以用全限定 gRPC 方法名扩展[graft] agent_rpcs [/gitaly.RepositoryService/RepositorySize]服务器启动时逐条校验方法未注册、或属于红线清单都会拒绝启动而不是静默忽略。值得一提的是SSHService也不在内置白名单里——Agent 默认无法通过 Git 协议 fetch/push这堵住了绕过UserLand冲突处理直接推分支的口子。两类夹带私货的请求也会被拒白名单只管调哪个方法还有两个请求级检查专门防绕过git_config_options一律拒收Git 会应用客户端传入的配置Agent 可以借此覆写core.hooksPath跳过访问检查甚至用uploadpack.packObjectsHook执行任意命令gitaly-servers元数据一律拒收它指定服务器地址与 TokenAgent 可借它让服务器连接任意内网地址。分支策略用几行 TOML 决定谁能动哪个分支 前两层管你是谁、能调什么最后一层管能改什么。策略规则写在[[graft.policy]]定义见 CONFIGURATION.md每个规则只有三个字段actor执行者 glob匹配 Token 对应的 Agent 名refs引用 glob 列表refs/heads/**可匹配任意深度allow是否放行。规则按顺序求值第一条actor 匹配且 refs 全部匹配的规则说了算没有任何规则命中的引用 拒绝一次更新触及多个规则管辖的引用时必须全部放行才算数。保护main的推荐写法与 examples/graft/config.toml 一致# 1. planner 可以更新 main [[graft.policy]] actor planner refs [refs/heads/main] allow true # 2. 其他人不能碰 main [[graft.policy]] refs [refs/heads/main] allow false # 3. 其余分支对所有认证者开放 [[graft.policy]] refs [refs/heads/**] allow true两个新手容易忽略的细节HEAD也在管辖范围内策略覆盖HEAD符号引用Agent 无法通过偷偷把HEAD指到别处绕过保护分支策略对 Agent 的每一次引用更新生效不止UserLandpre-receive 钩子检查推送与 OperationService 调用reference-transaction 钩子还会在引用加锁、变更之前再查一遍所以没有 pre-receive 的 RPC 也逃不掉。被拒的更新整体中止、不写入 changelog服务器日志会记下是哪条规则拒绝的。边界情况汇总见 LIMITATIONS.md。审计追溯谁动过仓库一条日志说清楚 最小权限的最后一块拼图是事后可查。Agent 的每次变更都会写入变更集日志记录的是Token 对应的身份而非请求自称的用户用graft log即可逐条查看操作者。认证失败也会被 Prometheus 指标gitaly_authentication_errors_total分类计数——HMAC 签名错误Token 过期各有独立标签异常调用一查便知。请求在服务器内部的完整路径同样可观测下图是一次 gRPC 请求经过各服务与拦截器的调用链路认证与安全检查正是发生在这一层。如果搭建了 ELK 日志栈还可以按字段过滤 Agent 请求、认证错误与钩子回调记录把安全事件从日志里捞出来复核。新手上线清单6 步给 Agent 配好最小权限 源自官方 AGENT-SECURITY.md 的运维检查清单照着做即可一 Agent 一 Token每个 Agent 独立token_file文件权限只对 Agent 自身账号可读共享auth.token只留给自己交给运维与工具绝不发给 Agent保护关键分支用[[graft.policy]]锁住默认分支与 release 分支其他分支放开自动解冲突按需开启[graft.land.resolver]默认关闭只对你信任的 actor 和路径启用隔离特权组件graft-resolve与校验器尽量放在独立账号上它们用运维凭证而非 Agent 凭证写入定期审计用graft log检查变更集日志每条记录都带着操作者身份。小结git-ai 的安全模型可以浓缩成一句话身份来自 Token接口受白名单分支看策略。三层都是默认拒绝、显式放行配置错误宁可拒绝启动也不静默降级红线接口连配置都无法打开。对新手来说只要记住 Token 三不不共用、不发给 Agent 共享 Token、不在请求体里自称身份、白名单两禁git_config_options、gitaly-servers、策略一原则没规则命中就是拒绝就能为自动化流水线配出一套既好用又安全的 AI Agent 环境。赞分享【免费下载链接】git-aiGit designed for AI agents.项目地址https://gitcode.com/gh_mirrors/op/git-ai点击查看免费下载相关推荐F3D 3D查看器指南一条命令打开 60 多种 3D 格式还能批量导出截图F3D 3D查看器指南一条命令打开 60 多种 3D 格式还能批量导出截图 同事发来一个 glb 模型、供应商给了一份 stp、实验室里还有一个 ply 和桌面应用图形学3D渲染数据可视化launch-your-agent的三层安全护栏always_ask权限策略、网络白名单与预算上限launch your agent的三层安全护栏always_ask权限策略、网络白名单与预算上限 launch your agent 是一个 Claude三步恢复任务栏用 ExplorerPatcher 找回 Windows 11 经典界面三步恢复任务栏用 ExplorerPatcher 找回 Windows 11 经典界面 Windows 11 的居中任务栏和磁贴式开始菜单让你回不去 Win1桌面应用逆向工程上一篇.NET Windows Desktop Runtime桌面应用开发的革命性解决方案下一篇如何轻松搞定AutoHotkey版本升级一键完成脚本转换的终极方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →