首页/开发/CI/CD 与发布速查/流水线权限最小化
流水线设计54 条

流水线权限最小化

CI 令牌按最小权限发放:默认只读起步,按作业申请写入范围,避免单个作业被利用后横向扩散。

CI/CD 与发布速查开发更新于 2026-10-13

流水线权限最小化是什么

CI 令牌默认只读起步,按作业需要逐项申请写入范围,避免单个作业(或被利用的第三方步骤)横向扩散。三家模型差异要清楚:GitHub 用 permissions 字段声明 GITHUB_TOKEN 范围,未声明时按仓库默认设置(可能是读写);GitLab 的 CI_JOB_TOKEN 提供有限访问,配合受保护分支与成员权限;Jenkins 让凭据只在需要的步骤内绑定。核心动作是把发布级权限隔离到发布作业。

基本信息

GitHubpermissions 字段声明 GITHUB_TOKEN 的范围,未声明默认按仓库设置
GitLabCI_JOB_TOKEN 提供有限的项目访问,配合受保护分支与权限模型
Jenkins凭据仅在需要的步骤内绑定使用
原则默认只读;写权限逐作业声明;发布凭据只给发布作业

典型权限范围速查

权限用途风险
contents: read检出代码低
contents: write打标签、发 Release可改仓库内容
packages: write推镜像或包可污染制品仓库
id-token: write换取 OIDC 令牌可换云侧临时凭据

典型使用场景

  • 新建仓库默认收紧:组织级把默认令牌设为只读,写权限随用随批
  • 发布作业隔离:打标签、推包权限只在发布作业声明
  • 第三方步骤管控:用已审计的 action 并叠加权限最小化
  • 审计收窄:定期统计各作业实际用到的权限,与声明比对
  • 多环境分级:预发用只读令牌,生产发布单独凭据

GitHub 最小权限

GitHub 最小权限
permissions:
  contents: read
  packages: read
  id-token: write   # 仅在需要 OIDC 的作业上
发布作业单独授权:审查每个作业真正需要写什么,逐项收窄。
治理从组织级设置入手覆盖面最大:组织策略可以限制仓库放宽默认权限。

落地检查清单

  • 盘点:导出平台审计日志,列出每个作业实际用到的写动作
  • 声明:按盘点结果逐作业写权限声明,未声明处保持只读
  • 隔离:发布凭据只绑定发布作业与受保护环境
  • 护栏:组织级默认禁止放宽,例外走审批并记录在案
  • 复核:定期比对声明与实际使用,回收闲置与漂移权限

易错点

  • 默认令牌全写权限:任意步骤(含第三方 action)都可用它改仓库内容
  • 凭据暴露给全局环境变量:所有步骤(含调试输出)都能读到,改为按步注入
  • 不区分构建与发布:构建阶段被入侵即拿到发布权限,按阶段拆分作业与令牌
  • fork 场景触发方式误配:pull_request_target 等触发器会用主仓令牌与密钥,等于把权限交给外部代码
  • 工作流复用不查权限:被复用的工作流自带权限声明,调用方很少逐行审阅,复用前把权限段纳入审查清单

数据来源与参考

  • GitHub Docs《Security hardening for GitHub Actions》
  • GitLab Docs《Job token》
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌