Linux 上 Jenkins 安全设置与最佳实践
一 基础加固与网络边界
- 保持系统与组件更新:定期更新 Jenkins LTS、插件与操作系统补丁,及时修复已知漏洞。
- 最小暴露面:仅开放必要端口,例如 8080/TCP(Jenkins Web)、22/TCP(SSH);使用 UFW 或 firewalld 限制来源 IP。
示例(UFW):sudo ufw allow 8080/tcp;示例(firewalld):sudo firewall-cmd --permanent --add-port=8080/tcp && sudo firewall-cmd --reload。
- 反向代理与 HTTPS:使用 Nginx/Apache 终止 TLS,部署 Let’s Encrypt 证书,禁用明文 HTTP 访问。
- 禁用或保护 JNLP 代理端口:JNLP 端口默认禁用;如必须使用,选择“随机端口”或“固定端口”并做好防火墙策略。
- 主机加固:SSH 使用密钥登录、禁用 root 远程登录、限制 sudo 权限、开启 fail2ban。
二 身份与访问控制
- 启用安全配置:在 Manage Jenkins → Configure Global Security 启用安全,避免“任何人都可以做任何事”。
- 安全域(认证):优先使用 Jenkins 专有用户数据库 或对接 LDAP/AD 等外部身份源,集中账号生命周期管理。
- 授权策略:避免“登录用户可做任何事”,采用 基于矩阵 或 项目矩阵授权策略;推荐安装 Role-Based Authorization Strategy 插件实现 RBAC,按“全局角色/项目角色”精细化授权。
- 强制登录与细粒度 ACL:为生产环境禁用匿名访问,按团队与项目分配最小权限;必要时为关键作业设置项目级 ACL。
- 增强认证:按需启用 双因素认证(2FA) 插件,提高账号安全性。
三 凭据、通信与构建环境
- 凭据管理:使用 Credentials Binding 插件以加密方式存储 SSH 密钥、API Token、用户名/密码 等敏感信息,避免在脚本或代码库明文存放。
- 通信加密:全站启用 HTTPS/TLS,设置 HSTS,仅开放 443;反向代理正确传递协议头(如 X-Forwarded-Proto)。
- 主节点隔离:禁止在主节点执行构建,所有任务在 代理(Agent) 上运行;必要时用 Jobs Restrictions 等插件限制主节点作业。
- 代理与隔离:优先使用 Docker Agent 或专用构建节点,构建、测试与部署环境相互隔离,降低横向移动风险。
- 凭据最小权限:为代理与流水线分配仅够用的凭据,定期轮换 API Token/SSH 密钥。
四 日志审计、备份与持续监测
- 日志与审计:集中收集并长期保留 /var/log/jenkins/jenkins.log,监控关键事件(登录、权限变更、作业创建/删除、凭据使用等);必要时对接 SIEM。
- 备份与恢复:定期备份 JENKINS_HOME(作业配置、构建历史、插件与凭据等),可使用 ThinBackup 或 Periodic Backup 插件;验证恢复演练。
- 安全公告与插件治理:订阅 Jenkins 安全公告,及时升级受影响组件;减少非必要插件,评估插件维护状态与评分。
- 漏洞扫描:在流水线中集成 OWASP Dependency-Check 等工具,扫描依赖组件漏洞并阻断高风险构建。
五 快速检查清单
| 检查项 |
推荐配置 |
| 版本与插件 |
运行 Jenkins LTS,插件保持最新 |
| 认证与授权 |
外部 LDAP/AD 或内置用户库 + RBAC(项目/全局角色) |
| 匿名访问 |
禁用 |
| 传输加密 |
仅 HTTPS/TLS,禁用 HTTP |
| 构建位置 |
禁止主节点构建,统一在 代理/Agent |
| 代理通信 |
JNLP 端口默认禁用;如启用,固定端口并限制来源 |
| 凭据管理 |
Credentials Binding 加密存储,定期轮换 |
| 防火墙 |
仅开放 8080/443/22,限制来源 IP |
| 日志与备份 |
集中日志、长期保留;定期备份 JENKINS_HOME |
| 安全公告 |
订阅并及时升级修复 |
以上清单可作为上线前与安全巡检的基线参考。