1. 威胁模型:攻击者想要什么?
典型目标包括:窃取 Credentials、篡改 共享库 或 Pipeline 注入恶意步骤、利用高危插件 RCE、 从 agent 横向移动到内网。对策不是单点产品,而是纵深:网络隔离、身份、授权、审计、供应链治理一起上。
2. Credentials:类型、作用域与绑定
Credentials Plugin 把秘密从脚本里拽出来,集中存储并做权限控制。常见类型:Username with password、 Secret text、Secret file、SSH 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'
}
}
}
}
}
3. 权限模型:从“全员管理员”毕业
常见策略插件:Matrix Authorization、Role-based Authorization Strategy。实践上应为人与自动化服务账号分角色: 开发者能跑构建、不能改系统配置;平台管理员能装插件、不能随意浏览所有凭据(凭据访问也可细分)。 结合 Folder 做业务线隔离:每个 folder 一套 job + 凭据边界。
4. 供应链:插件与共享库
每个插件都是代码与权限的集合体:定期 CVE、供应链投毒、停更插件。基线:只启用必要插件、在测试控制器验证升级、 生产钉版本与变更单。共享库(上一章)视为内部产品:签名 tag、评审、权限与 Jenkinsfile 一样纳入变更管理。 In-process Script Approval 对未签名 Groovy 调用敏感 API 时会拦截——不要无脑“全部批准”。
5. Agent、Remoting 与暴露面
- 校验 agent 身份;限制控制器到 agent 的网络路径;避免在 agent 上以 root 跑构建(除非不可避免且已审计)。
- 关闭不需要的入口:CLI over Remoting、匿名读取、危险诊断端点。
- K8s agent:用 NetworkPolicy 限制出站到仓库与 registry;最小化 ServiceAccount RBAC。
6. 审计与外部密钥系统
将长期机密放在 Vault / 云 Secret Manager,Pipeline 内短时拉取(OIDC、AppRole 等)能缩短泄露窗口——Jenkins 凭证更像“引用句柄”而非秘密本体。 审计日志对接 SIEM:登录、插件变更、凭据使用(能力依版本与插件而定)。
7. 本章清单
- 清点 Manage Jenkins 持有者人数;启用 SSO/MFA(若可行)。
- 为凭据建立 folder/团队边界;删除僵尸凭据与过期的 API token。
- 建立插件升级流程:测试控制器 → 变更单 → 生产 → 回滚演练。
- 审查共享库与 Pipeline 变更的 CODEOWNERS;禁止未经评审的 Groovy 特权调用。
- 预告下一章:离开 Jenkins,进入 Kubernetes 原生 CI — Tekton。