流水线权限最小化是什么
CI 令牌默认只读起步,按作业需要逐项申请写入范围,避免单个作业(或被利用的第三方步骤)横向扩散。三家模型差异要清楚:GitHub 用 permissions 字段声明 GITHUB_TOKEN 范围,未声明时按仓库默认设置(可能是读写);GitLab 的 CI_JOB_TOKEN 提供有限访问,配合受保护分支与成员权限;Jenkins 让凭据只在需要的步骤内绑定。核心动作是把发布级权限隔离到发布作业。
基本信息
| GitHub | permissions 字段声明 GITHUB_TOKEN 的范围,未声明默认按仓库设置 |
|---|---|
| GitLab | CI_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 的作业上发布作业单独授权:审查每个作业真正需要写什么,逐项收窄。
治理从组织级设置入手覆盖面最大:组织策略可以限制仓库放宽默认权限。
落地检查清单
- 盘点:导出平台审计日志,列出每个作业实际用到的写动作
- 声明:按盘点结果逐作业写权限声明,未声明处保持只读
- 隔离:发布凭据只绑定发布作业与受保护环境
- 护栏:组织级默认禁止放宽,例外走审批并记录在案
- 复核:定期比对声明与实际使用,回收闲置与漂移权限