第48章|Jenkins 安全:凭证系统、权限模型与供应链防护

Jenkins 握着部署钥匙、制品上传账号与内网仓库凭据——它一旦失守,往往不是“丢一个 CI”,而是整条交付链被接管。 本章把防线拆成三块:Credentials(谁能拿什么秘密)、Authorization(谁能动什么按钮)、 Supply chain(插件与脚本从哪来、如何升级不翻车)。读完你应能画出自己组织的威胁模型 + 最小权限草图

Secrets

Credentials

  • scopes & folders
  • withCredentials
  • masking logs
Access

RBAC

  • matrix / roles
  • folder isolation
  • API tokens
Chain

Plugins & Groovy

  • update center
  • pin & audit
  • script approval

1. 威胁模型:攻击者想要什么?

典型目标包括:窃取 Credentials、篡改 共享库Pipeline 注入恶意步骤、利用高危插件 RCE、 从 agent 横向移动到内网。对策不是单点产品,而是纵深:网络隔离、身份、授权、审计、供应链治理一起上。

Layered Jenkins hardening Edge: TLS · reverse proxy · IP allowlist · SSO AuthZ: matrix / roles · folder ACL · least privilege Secrets: credentials scoped · withCredentials · no echo in logs Supply chain: pin plugins · review shared libs · script approvals agents: verify remoting · avoid root · network policies in K8s
图 1:从边缘到供应链——任何一层被洞穿都要假设会被利用,因此需要叠加控制与可观测性。

2. Credentials:类型、作用域与绑定

Credentials Plugin 把秘密从脚本里拽出来,集中存储并做权限控制。常见类型:Username with passwordSecret textSecret fileSSH Username with private key、证书等。 作用域可分 System(全局)、Global(用户可见范围受授权约束)、以及 Folder 级——多团队共用一台控制器时,按文件夹隔离凭据能显著缩小泄露半径。

pipeline {
  agent any
  stages {
    stage('Publish') {
      steps {
        withCredentials([
          usernamePassword(
            credentialsId: 'artifactory-deployer',
            usernameVariable: 'AF_USER',
            passwordVariable: 'AF_PASS'
          )
        ]) {
          sh './publish.sh'
        }
      }
    }
  }
}
日志:默认应避免 echo $AF_PASS;使用凭据绑定变量时结合 mask passwords 类能力(依插件)并审查构建日志留存策略。

3. 权限模型:从“全员管理员”毕业

常见策略插件:Matrix AuthorizationRole-based Authorization Strategy。实践上应为自动化服务账号分角色: 开发者能跑构建、不能改系统配置;平台管理员能装插件、不能随意浏览所有凭据(凭据访问也可细分)。 结合 Folder 做业务线隔离:每个 folder 一套 job + 凭据边界。

Folder isolation (multi-tenant controller) Folder: team-a jobs credentials A RBAC: dev-a cannot see folder B ACL boundary Folder: team-b jobs credentials B audit: who accessed which credential
图 2:共享控制器不是共享上帝视角——用 folder + 角色把爆炸半径关进笼子里。

4. 供应链:插件与共享库

每个插件都是代码与权限的集合体:定期 CVE、供应链投毒、停更插件。基线:只启用必要插件、在测试控制器验证升级、 生产钉版本与变更单。共享库(上一章)视为内部产品:签名 tag、评审、权限与 Jenkinsfile 一样纳入变更管理。 In-process Script Approval 对未签名 Groovy 调用敏感 API 时会拦截——不要无脑“全部批准”。

Plugin promotion pipeline Update center only trusted mirrors Canary controller run regression jobs CVE diff · breaking API Production pin exact plugin versions · backup before upgrade document rollback path
图 3:插件升级像发布应用——缺了金丝雀与回滚,就是在生产上“抽盲盒”。

5. Agent、Remoting 与暴露面

6. 审计与外部密钥系统

将长期机密放在 Vault / 云 Secret Manager,Pipeline 内短时拉取(OIDC、AppRole 等)能缩短泄露窗口——Jenkins 凭证更像“引用句柄”而非秘密本体。 审计日志对接 SIEM:登录、插件变更、凭据使用(能力依版本与插件而定)。

ACL No anonymous admin · rotate API tokens · review “Manage Jenkins” holders
图 4:安全是习惯——权限、凭据、插件三件事每月复盘一次,比一次渗透更有用。

7. 本章清单

  1. 清点 Manage Jenkins 持有者人数;启用 SSO/MFA(若可行)。
  2. 为凭据建立 folder/团队边界;删除僵尸凭据与过期的 API token。
  3. 建立插件升级流程:测试控制器 → 变更单 → 生产 → 回滚演练。
  4. 审查共享库与 Pipeline 变更的 CODEOWNERS;禁止未经评审的 Groovy 特权调用。
  5. 预告下一章:离开 Jenkins,进入 Kubernetes 原生 CI — Tekton
← 上一章:Agents 下一章:Tekton 入门 →