【免费下载链接】claude-code-base-action
This repo is a mirror of the contents of base-action in https://github.com/anthropics/claude-code-action.
🔐 claude-code-base-action 是用于在 GitHub Actions 工作流中运行 Claude Code 的官方基础 Action。本文将带你吃透它的信任模型(Trust Model),并给出一套可落地的安全最佳实践,帮助你从根本上避免 API Key 泄露——从静态密钥到无密钥的 Workload Identity Federation,每一步都有源码依据。
一、先搞清楚:claude-code-base-action 的信任模型是什么
理解安全的前提,是先知道这个 Action"会做什么"和"不会做什么"。
它是一个"薄包装",不替你设防
根据 README.md 中的 Trust model 章节(README.md#L18-L24),这个 Action 的核心定位是:
一个薄封装(thin wrapper),负责安装并运行 Claude Code,本身不强制执行任何信任边界。
它会在你指定的工作目录中启动 Claude Code,而 Claude Code 会读取该目录下的项目级配置(.claude/、CLAUDE.md、.mcp.json等)。也就是说:
| 你的工作流做 | 实际等效于 |
|---|---|
| 在此目录运行 base-action | 在此目录直接运行 Claude Code CLI |
关键结论:调用方(也就是你)有责任确保"工作目录可信 + prompt 可信"。
处理 Issue / Fork PR 等不可信输入时的坑
如果你的工作流会处理外部不可信输入(Issues、fork 拉出的 PR、外部评论),官方建议改用带权限检查的anthropics/claude-code-action(上层封装),它会:
- ✅ 校验触发者(actor)的权限
- ✅ 在 PR 场景下从 base ref 恢复项目配置,防止恶意
.claude/、.mcp.json配置被执行
而 base-action 适合的场景是:你自己仓库中、你自己控制的 prompt 与目录,比如依赖升级、代码审查流水线等。
二、三种认证方式:密钥泄露风险的"光谱"
API Key 泄露的第一源头,就是长期静态凭据。claude-code-base-action 支持三类认证方式,风险从"高"到"低"排列如下(定义见 action.yml#L28-L68):
| 方式 | 输入参数 | 凭据生命周期 | 泄露风险 |
|---|---|---|---|
| 静态 API Key | anthropic_api_key | 永久,直到手动吊销 | ⚠️ 高:一旦落盘/进日志即泄露 |
| OAuth Token | claude_code_oauth_token | 较长 | ⚠️ 中:同样属于静态凭据 |
| Workload Identity Federation | anthropic_federation_rule_id等 | 短期访问令牌 | ✅ 低:无静态密钥 |
方式一:静态 API Key(最常见,也最容易泄露)
这是默认方式,源码会在运行时对凭据做校验(src/validate-env.ts#L30-L41:三者必须提供其一,否则直接报错终止)。
官方在 README.md#L529-L563 中给出了明确红线:
# ❌ 错误做法:API Key 明文写进工作流文件,随仓库一起泄露 anthropic_api_key: "sk-ant-..." # ✅ 正确做法:密钥存入 GitHub Actions Secrets,工作流只引用 anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}操作路径:仓库 Settings → Secrets and variables → Actions → 新建名为ANTHROPIC_API_KEY的 Secret。任何情况下都不要把密钥直接 commit 到仓库,这条适用于所有敏感值(API key、访问令牌、数据库凭据)。
方式二:Workload Identity Federation(推荐的终极方案)
如果你厌倦了管理静态密钥,可以启用工作负载身份联合认证(Workload Identity Federation):工作流获取 GitHub 的 OIDC 令牌(JWT),由 Claude Code CLI 将其换取一个短期的 Anthropic 访问令牌——整个链路中不存在任何静态 API Key,天然防泄露。
完整实现见 src/workload-identity.ts,它内建了三道防线:
- 令牌即时脱敏:每次获取 OIDC 令牌后立即调用
core.setSecret(),让 GitHub Actions 自动在日志中打码(src/workload-identity.ts#L146-L151); - 最严文件权限:令牌写入
RUNNER_TEMP下的临时文件,目录权限0700、文件权限0600,仅限当前进程可读; - 用完即焚:步骤结束时
stop()会删除令牌文件、federation profile 和缓存凭据,绝不跨越步骤存活(src/workload-identity.ts#L186-L195)。
启用配置示例(注意id-token: write权限):
permissions: contents: read id-token: write steps: - name: Run Claude Code with workload identity federation uses: anthropics/claude-code-base-action@beta with: prompt: "Your prompt here" anthropic_federation_rule_id: fdrl_xxxxxxxxxxxx anthropic_organization_id: 00000000-0000-0000-0000-000000000000 anthropic_service_account_id: svac_xxxxxxxxxxxx💡 注意:如果同时配置了
anthropic_api_key或 OAuth token,静态凭据会优先,federation 不会生效,Action 会给出警告(src/workload-identity.ts#L128-L136)。二者只选其一。
方式三:云厂商 OIDC(Bedrock / Vertex / Foundry)
如果团队部署在 AWS Bedrock、Google Vertex AI 或 Microsoft Foundry,可将use_bedrock/use_vertex/use_foundry设为true,通过云侧 OIDC 认证访问,同样可以摆脱直连 API Key。必填变量校验逻辑见 src/validate-env.ts#L42-L83。
三、开工前必查:6 条安全最佳实践清单
✅ 把下面这份清单放进你的 Code Review 模板里:
1. 密钥只走 Secrets,永远不落库
settings输入中的env对象也支持引用 Secrets(如${{ secrets.STAGING_DB_URL }}),不要在 settings JSON 里硬编码任何凭据。
2. 最小化 Job 权限(permissions 原则)
只授予工作流必需的最小权限。例如官方的 Issue 分诊示例 examples/issue-triage.yml 只声明了:
permissions: contents: read issues: write启用 federation 时也只需追加id-token: write,而不是给整个contents: write。
3. 慎用show_full_output
这个开关会打印 Claude Code 的完整 JSON 输出,包含所有工具执行结果——其中可能含密钥、令牌等敏感信息,而这些日志在公开仓库中人人可见。它在 action.yml#L82-L85 中自带了 WARNING 说明,默认值为false。
建议:仅在非敏感环境的调试中临时开启,排查完立即关闭。
4. 用 allowedTools 收紧工具面
prompt 决定"让它干什么",allowedTools决定"它能干什么"。官方所有示例都显式限制了工具范围,例如 examples/issue-triage.yml#L105:
claude_args: '--allowedTools "Bash(git:*),Read,Glob,Grep"'工具面越小,凭据被"顺手"读走、外发的攻击面就越小。
5. 插件与 Marketplace 输入自带校验
如果你通过plugins/plugin_marketplaces输入安装插件,源码会在执行前做严格校验:插件名防路径穿越与命令注入(正则 + Unicode 归一化,src/install-plugins.ts#L60-L76),Marketplace 地址必须是指定的https://….git形式(src/install-plugins.ts#L30-L53)。请勿绕过 Action 自行拼接安装命令。
6. 执行日志不写进公开日志流
完整会话记录被写为claude-execution-output.json文件(存放于运行器的RUNNER_TEMP临时目录,src/execution-file.ts),而不是直接打印到 workflow log 中——这本身就是一种防泄露设计。需要时通过execution_file输出按需读取即可。
四、安全相关源码速查表
想深入审计这个 Action 的"信任模型"实现,从这几个入口读起即可:
| 模块 | 职责 |
|---|---|
| action.yml | 全部输入定义与凭据透传(第 28-68 行为认证输入) |
| src/index.ts | 主流程:身份设置 → 环境校验 → 执行(src/index.ts#L13-L81) |
| src/validate-env.ts | 按 Provider 校验凭据是否齐备 |
| src/workload-identity.ts | OIDC 令牌获取、脱敏、落盘与清理 |
| src/install-plugins.ts | 插件名 / Marketplace 输入的安全校验 |
| src/execution-file.ts | 执行日志的临时文件写入 |
| test/workload-identity.test.ts | federation 全流程的测试用例 |
五、写在最后
🎯 记住 claude-code-base-action 安全实践的一句话总结:
"目录可信、prompt 可信、密钥走 Secrets、令牌要短命、输出要克制。"
- 无法避免静态密钥时 → 用
${{ secrets.* }}引用 + 定期轮换; - 条件允许时 → 迁移到 Workload Identity Federation,让"泄露静态 API Key"这件事从物理上不可能发生;
- 处理外部不可信输入时 → 换用带权限检查的上层
claude-code-action。
按这套信任模型 + 最佳实践落地,你的 CI/CD 流水线可以放心地把 AI 能力交给 Claude Code 了。 🚀
【免费下载链接】claude-code-base-action
This repo is a mirror of the contents of base-action in https://github.com/anthropics/claude-code-action.
相关推荐
如何为 claude-code-base-action 配置认证:Anthropic API Key 与 OAuth Token 安全指南
如何为 claude code base action 配置认证:Anthropic API Key 与 OAuth Token 安全指南 📌 认证配置是什么
为什么选择dart-event-bus?Dart事件驱动开发的终极优势分析
为什么选择dart event bus?Dart事件驱动开发的终极优势分析 在构建现代Dart和Flutter应用时,事件驱动架构已经成为提升代码质量和可维护性
软件架构Haiku Animator Core插件开发:扩展自定义组件与渲染器的完整指南
Haiku Animator Core插件开发:扩展自定义组件与渲染器的完整指南 Haiku Animator Core是一款强大的Web交互式UI动画引擎,作
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考