CentOS 上部署 Jenkins 的安全保障要点
一 系统与网络加固
- 保持系统与软件更新:执行 yum update -y,并定期更新 Jenkins 及插件,及时修复已知漏洞。
- 最小化暴露面:仅开放必要端口,例如 8080/HTTP 与 50000/Agent 通信,使用 firewall-cmd 精准放行;如对外服务,优先发布到内网或跳板机,仅放通管理网段。
- 强化系统账户与登录安全:禁用不必要的超级用户与默认账户,设置 强口令策略(≥10 位,含大小写数字特殊字符),限制 su 使用范围,设置 TMOUT=300 自动注销,必要时禁用 Ctrl+Alt+Delete 重启。
- 文件与权限防护:对关键文件(如 /etc/passwd、/etc/shadow、/etc/group、/etc/gshadow)设置不可变属性 chattr +i;限制 Jenkins 主目录与 secrets 的文件权限与属主,避免被非授权进程读取。
- 运行环境隔离:遵循 最小权限原则,避免在 Jenkins 控制器上直接执行构建,优先在 代理节点运行任务,降低主机被攻陷风险。
二 Jenkins 身份与访问控制
- 启用全局安全:在 Manage Jenkins → Configure Global Security 勾选 Enable security,禁用匿名访问,创建 管理员并设置强密码。
- 认证方式:优先对接 LDAP/企业 SSO;如使用内置数据库,强制 强密码与周期性更换。
- 授权模型:采用 Role-based Authorization Strategy 或 Matrix Authorization,按“全局角色/项目角色”分配权限,做到“最小权限”与“职责分离”。
- 安全特性:保持 CSRF 保护开启;谨慎调整默认安全项,变更前评估影响并在可控窗口实施。
三 数据安全 通信加密与凭据管理
- 全站加密:为 Jenkins Web 启用 HTTPS/TLS,使用有效证书(如 Let’s Encrypt 或企业 CA),避免明文传输凭据与构建产物。
- 凭据集中与加密:使用 Credentials Binding 等插件统一存储 用户名/密码、SSH 私钥、Secret 文件/文本 等敏感信息,避免在脚本或代码库硬编码。
- 代理通信安全:确保 JNLP/WebSocket 与 Agent→Controller 通信走 加密通道,并按需限制来源网段与端口。
- 备份与恢复:定期备份 JENKINS_HOME(含 jobs、config.xml、secrets 等),验证可恢复性并异地留存。
四 构建环境与运行隔离
- 控制器与代理分离:在 Manage Nodes and Clouds 将内置节点 执行器设为 0 或限制为“仅匹配标签的作业”,强制在代理节点构建,缩小攻击面。
- 代理与容器安全:代理以 非 root 运行;如使用容器/虚拟化,控制镜像来源、启用 内容信任(DCT),并遵循最小权限原则。
- 最小权限执行:在 Pipeline 中使用 agent 与 stage agent 精确限定执行节点与权限范围,避免越权访问。
- 审计与监控:开启并定期检查 系统日志、构建日志与审计日志,对异常登录、权限变更、凭据使用与构建异常进行告警。
五 快速加固清单
| 领域 |
关键动作 |
命令或路径示例 |
| 系统与网络 |
更新系统、仅开放 8080/50000、限制来源网段 |
firewall-cmd --permanent --add-port=8080/tcp; firewall-cmd --permanent --add-port=50000/tcp; firewall-cmd --reload |
| 身份与授权 |
启用安全、禁用匿名、配置 LDAP/SSO、RBAC/Matrix 授权 |
Manage Jenkins → Configure Global Security |
| 加密与凭据 |
启用 HTTPS、集中加密存储凭据 |
配置 TLS 证书;安装 Credentials Binding 插件 |
| 运行隔离 |
控制器不构建、代理非 root、容器最小权限 |
内置节点执行器=0;容器以 jenkins 非 root 运行 |
| 日志与备份 |
审计日志留存、定期备份 JENKINS_HOME |
定时备份 /var/lib/jenkins 并异地保存 |
以上清单可作为上线前的安全基线,后续结合变更与合规要求进行复审与加固。