场景:AI 编码 Agent 要调用 API 时,你的密钥安全吗?AuthSec 给每个 Agent 一个「身份」
问题:Agent 有权限,但人没有安全感
当你的 Claude Code 或 Codex 需要调用内部 API、查询数据库、或者向第三方服务提交请求时,通常会用一个通用 API Key 来解决。这个 Key 被写进 .env、CLAUDE.md 或者直接硬编码在 Agent 的指令里。
结果是:谁拿了 Key 谁就能用,Agent 之间没有身份隔离,审计日志一片空白。
具体来说:
- 凭证共享:多个 Agent 用同一个 API Key,你无法区分哪个 Agent 调了哪个接口
- 无权限边界:一个只负责代码审查的 Agent 意外获得了写入生产数据库的权限
- 密钥泄露无溯源:Key 被泄露后,你根本不知道从哪个环节流出去的
- Agent 重启后重新认证:会话级别的令牌在 Agent 重启后丢失,每次都要重新配置
这个问题在 AI 编码 Agent 进入生产环境后会急剧放大。多个 Agent 并行工作、跨仓库操作、调度到云资源——没有一个统一的身份层,安全管理就是一团乱麻。
AuthSec:给每个 Agent 发一张「身份证」
AuthSec 是一个用 Go 编写的统一身份与访问管理(IAM)服务,专门为 AI Agent 场景设计。它不是一个通用的 OAuth 服务器——它的 API 路由模块直接面向 Agent 的身份生命周期设计。
核心能力一览:
| 功能 | 说明 | Agent 场景价值 |
|---|---|---|
| 用户认证 | 管理员/终端用户登录、注册、密码重置 | Agent 以用户身份登录系统 |
| OIDC 联盟 | Google/GitHub/Microsoft/SAML SSO | Agent 通过企业 IdP 获取身份 |
| WebAuthn/FIDO2 | 通行密钥、TOTP、短信验证码 | 高安全操作的二次确认 |
| CIBA | 推送式后台认证 | Agent 调用敏感 API 时触发用户审批 |
| 设备授权(RFC 8628) | 无浏览器设备授权 | 无头 Agent 的授权流 |
| SPIFFE/SPIRE | 工作负载身份 | Agent 进程级别的身份认证 |
| RBAC/ABAC 策略引擎 | 角色和属性权限控制 | 精确控制每个 Agent 能调什么 API |
| 外部服务注册 | Vault 托管的第三方凭证 | Agent 安全调用 GitHub/Slack/AWS |
快速上手:启动 AuthSec 服务
AuthSec 以单一二进制发布,依赖 PostgreSQL:
git clone https://github.com/authsec-ai/authsec-ai.git cd authsec-ai cp .env.example .env export DB_NAME=authsec_db export DB_USER=authsec export DB_PASSWORD=changeme export DB_HOST=localhost export DB_PORT=5432 go build -o authsec ./cmd/ ./authsec
服务默认运行在 7468 端口。启动后,健康检查确认一切正常:
curl http://localhost:7468/authsec/uflow/health
预期响应:
{"status": "healthy", "database": "connected", "timestamp": "2026-07-02T06:30:00Z"}
场景一:为 Claude Code 创建专用的 Agent 身份
假设你有一个 Claude Code 实例负责代码审查工作,另一个负责 CI/CD 部署。它们需要的权限完全不同。
1. 注册第一个管理员
curl -X POST http://localhost:7468/authsec/uflow/auth/admin/login/bootstrap \
-H "Content-Type: application/json" \
-d '{"email": "admin@team.dev", "password": "temp-password-123"}'
2. 创建项目和 OAuth 客户端
curl -X POST http://localhost:7468/authsec/uflow/auth/admin/login \
-H "Content-Type: application/json" \
-d '{"email": "admin@team.dev", "password": "temp-password-123"}'
curl -X POST http://localhost:7468/authsec/uflow/admin/projects \
-H "Authorization: Bearer $(ADMIN_TOKEN)" \
-H "Content-Type: application/json" \
-d '{"name": "Code Review Agent"}'
curl -X POST http://localhost:7468/authsec/clientms/tenants/{tenantId}/clients/create \
-H "Authorization: Bearer $(ADMIN_TOKEN)" \
-H "Content-Type: application/json" \
-d '{"client_name": "claude-code-review", "grant_types": ["client_credentials"]}'
场景二:用 CIBA 实现 Agent 操作的「人在回路」审批
有时候 Agent 需要执行高风险操作(比如修改生产环境配置或触发数据库迁移)。AuthSec 支持 CIBA(Client Initiated Backchannel Authentication)——Agent 发起操作请求,通过推送通知等待用户批准,用户批准后 Agent 才能拿到令牌继续执行。
curl -X POST http://localhost:7468/authsec/uflow/auth/ciba/initiate \
-H "Content-Type: application/json" \
-d '{
"client_id": "claude-code-review",
"scope": "write:production"
}'
curl -X POST http://localhost:7468/authsec/uflow/auth/ciba/token \
-H "Content-Type: application/json" \
-d '{"auth_req_id": "abc123", "client_id": "claude-code-review"}'
用户侧会收到推送通知(通过已注册的设备),确认或拒绝后,Agent 的轮询请求才会返回访问令牌。
这个流程特别适合以下场景:
- Agent 写了一个数据库 migration 脚本,需要人工确认后才能执行
- Agent 要修改生产环境的 IAM 策略
- Agent 要向外部 API 提交更改(比如发布到 npm 或 PyPI)
场景三:用 SPIFFE/SPIRE 实现 Agent 工作负载身份
对于运行在 Kubernetes 或云 VM 上的 Agent 进程,AuthSec 的 SPIRE Headless 模块提供了 SPIFFE 工作负载身份支持。每个 Agent 进程获得一个唯一的 SPIFFE ID(如 spiffe://team.dev/agent/claude-code-review),基于这个 ID 签发 JWT-SVID,无需任何 API Key 文件。
┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐
│ Claude Code │────▶│ SPIRE Agent │────▶│ AuthSec │
│ (Workload) │ │ (Workload API) │ │ (/spire/*) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
│ │
│ HTTPS + JWT-SVID │ Policy Check
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ Internal API │ │ PostgreSQL │
│ (验证 SVID) │ │ (RBAC 表) │
└─────────────────┘ └─────────────────┘
SPIRE Headless 模块的 OIDC 令牌端点可以签发与云厂商 Federation(AWS STS、Azure AD、GCP Access Token)交换的令牌:
curl -X POST http://localhost:7468/authsec/spire/oidc/exchange/aws \
-H "Content-Type: application/json" \
-d '{"svid": "spiffe://team.dev/agent/claude-code-review", "role_arn": "arn:aws:iam::123456:role/agent-readonly"}'
这意味着 Agent 无需任何长期凭证文件,就能以最小权限原则访问云资源。
架构设计
AuthSec 采用单二进制 + 可选插件的架构:
- 核心服务(authsec):单一 Go 二进制,Gin 框架,默认端口 7468
- 数据库:PostgreSQL(必需),存储用户、角色、权限、审计日志
- HashiCorp Vault(可选):托管 OIDC 提供商凭据和外部服务密钥
- Redis(可选):缓存会话和权限数据
- mt-plugin(可选):gRPC 微服务,提供多租户数据库隔离
所有 API 路由按模块划分前缀:
| 前缀 | 功能 |
|---|---|
/authsec/uflow/* | 用户认证、OIDC 联盟、SCIM、RBAC |
/authsec/webauthn/* | 通行密钥、TOTP、短信验证码 |
/authsec/clientms/* | OAuth 客户端生命周期管理 |
/authsec/hmgr/* | Ory Hydra 登录/同意、SAML SSO |
/authsec/oocmgr/* | OIDC 提供商配置 |
/authsec/authmgr/* | JWT 验证、权限检查 |
/authsec/exsvc/* | 外部服务注册(Vault 凭据) |
/authsec/spire/* | SPIFFE 工作负载身份、云令牌交换 |
为什么这比传统的 API Key 方案更好
| 方面 | 传统 API Key | AuthSec 身份层 |
|---|---|---|
| 身份粒度 | 一个 Key 供所有 Agent 共享 | 每个 Agent 有独立 OAuth 客户端 |
| 权限控制 | IP 白名单或静态 ACL | RBAC/ABAC 策略引擎,实时评估 |
| 审计追踪 | 日志中只有 Key 指纹 | 完整的用户/客户端/SPIFFE 身份追踪 |
| 密钥轮换 | 手动修改,影响所有服务 | 客户端密钥可独立轮换,零中断 |
| 高风险操作 | 无审批通道 | CIBA 推送认证 + 设备授权码 |
| 云平台集成 | 需要在 Agent 中嵌入云凭证 | SPIFFE SVID 与云 STS 直接交换 |
小结
当 AI 编码 Agent 从实验性工具升级为关键的日常生产力工具时,身份和访问管理不是一个可选项——它是 Agent 进入生产环境的必要条件。
AuthSec 提供了一个从基础到高级的完整 IAM 方案:从最基本的 client_credentials 客户端认证,到 CIBA 推送式审批、SPIFFE 工作负载身份、还有云平台 Federation。关键是它用 Go 写成一个单一二进制,部署和维护成本极低,但提供了企业级的功能覆盖范围。
对于那些已经在 Kubernetes 上运行 Claude Code、Codex 或者 OpenCode 的团队,AuthSec 的 SPIRE 集成可以直接与现有基础设施对接,让 Agent 用 SPIFFE ID 替代所有静态 API Key。
相关链接