用户、权限和短期凭据
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
SSO(Single Sign-On)是单点登录;OIDC(OpenID Connect)是身份认证协议;RBAC(Role-Based Access Control)是基于角色的访问控制。目标:开发者能看日志和发起测试,发布经理能批准生产,平台管理员才能改全局安全配置。
1. 建立角色和身份#
先在隔离实例安装企业批准的 OIDC 或 SAML(Security Assertion Markup Language)插件,配置 issuer/回调地址/客户端秘密/组声明。管理员组必须使用身份系统实际返回的稳定组名;别把所有已登录用户授为管理员。
使用 Matrix Authorization(矩阵授权)或 Role Strategy(二选一):
| 身份 | 授权范围 |
|---|---|
| platform-admins | 全局管理、插件、Agent、共享库与安全配置 |
| developers | 自己 Folder 的 Read、Build、Cancel、日志/报告读取 |
| release-managers | 生产审批;是否可手动触发发布按组织策略决定 |
| automation | 限定 Job 的 API 调用,独立账号与短期/可轮换 token |
生产 Job 的 Configure、Replay、凭据管理和可信库写入权限只给受信维护者;能修改将获得生产身份的脚本,本质上就能使用该身份。input submitter 限定审批人,但 Jenkins 管理员仍具有管理权限,不能宣称实现了对管理员的强隔离。
操作顺序:先保留已验证管理员会话,在 Manage Jenkins → Security 选择授权策略;给三个真实组授予必要的 Overall/Read,只有 platform-admins 获得 Overall/Administer。使用项目矩阵授权时,在对应 Folder 开启项目授权,按表分配 Job/Read、Job/Build、Job/Cancel;核对继承策略,避免从父级继承宽权限。release-managers 需能读取发布任务,审批允许组在 Jenkinsfile 单独配置。每改一组立即用该组测试账号重新登录验证,确认无误再退出管理员会话。
验收:用开发者账号尝试修改发布 Job、读取其他 Folder、访问 Script Console,均应拒绝;发布经理可以批准但不能随意修改流水线。确认企业身份故障后的应急流程,再移除 bootstrap 本地身份配置。Jenkins 安全
2. 凭据作用域与绑定#
凭据放在最小 Folder/用途范围;只给单一步骤绑定,不设成整个流水线的全局环境变量。示例在独立测试账号上执行:
withCredentials([string(credentialsId: 'staging-api-token', variable: 'API_TOKEN')]) {
sh '''#!/usr/bin/env bash
set -euo pipefail
set +x
# Token goes through stdin, not command-line arguments.
printf 'header = "Authorization: Bearer %s"\n' "$API_TOKEN" |
curl --config - --fail --silent --show-error https://api.staging.example.com/healthz
'''
}避免 Groovy 双引号插值秘密,不打印环境变量或开启 shell tracing。日志遮罩只能减少意外泄漏,恶意代码仍能编码/外传秘密;有秘密的 Agent 不与其他信任域共享进程、工作目录或缓存。凭据说明
3. 云 API 优先短期身份#
AWS:构建节点使用 EC2 instance profile,或 EKS 的 Pod Identity/IRSA(IAM Roles for Service Accounts);必要时 AssumeRole 进入限定发布角色。GCP:使用附加的服务账号或工作负载身份联合。Jenkins 不会自动像 GitHub Actions 一样为每个 Job 提供可信 OIDC token,身份联合要有受支持的签发者、明确 audience 和声明约束。
综合项目将构建、预生产、生产身份分到独立节点。每个 Agent 只一个执行器;生产节点不运行 PR 代码。云权限至少拆分为推送指定镜像仓库、描述指定集群、限定命名空间的发布访问。参考 EKS 身份、GCP 身份联合。
演练:撤销测试凭据后任务应失败;轮换后无需修改源码恢复;日志、归档和镜像中无秘密。发现泄漏先撤销/轮换,再处理日志、制品与 Git 历史,单纯遮罩旧输出不使凭据失效。
4. 按真实 Job 验收身份隔离#
在预生产复制同一套 Folder、Agent 和云角色配置,测试资源只含合成数据;不拿生产凭据验证不可信代码。审批角色、能改脚本的角色、实际执行 Job 的云身份分别记录。
| 测试路径 | 预期结果 |
|---|---|
| 开发者运行普通构建 | 只能使用构建身份,不能选生产 Agent 或获得生产凭据 |
| 开发者修改生产 Job、Replay 或可信库 | 拒绝;检查继承权限和间接仓库写权限 |
| 构建身份访问其他应用仓库/秘密 | 云端权限拒绝;日志不输出秘密正文 |
| 获批生产 Job | 云审计显示独立发布角色,运行时应用仍使用另一身份 |
| 撤销测试角色资源授权,再用原 Agent 会话访问 | 传播完成后拒绝;若 Agent 自动换取凭据,还要核对会话来源 |
| 轮换测试外部凭据 | 新连接通过,旧凭据在实际签发方失效,源码不需改动 |
AWS 在实际 Agent 的受控步骤执行 aws sts get-caller-identity,对照预期账号/角色,再运行该资源允许与拒绝测试;身份查询成功不能作为撤权失败的证据。GCP 联合身份按 身份验收与撤权 检查调用者及资源授权。
撤销 Jenkins 登录/API token 只关闭该入口,不一定停止已运行 Job 或清除 Agent 已拿到的云会话。事件处理中同时停止受影响任务、隔离 Agent、处理云会话与实际资源权限;清理工作目录或日志遮罩不能代替凭据撤销。AWS 会话边界。