Jenkins 安全加固实战:凭据保护与构建环境防护配置

Jenkins 安全加固是保障 CI/CD 供应链安全的关键环节,本文围绕凭据保护、插件供应链、脚本控制台与 Agent 隔离四个维度,给出可立即落地的 Jenkins 安全配置方案,防止构建环境成为攻击者进入生产系统的跳板。

适用场景

适用于自建 Jenkins 的研发团队、承接外部代码的构建服务商,以及需要满足等保或内部安全审计的 CI/CD 平台。重点解决三类风险:凭据明文泄露、恶意插件/恶意 Pipeline 注入、Agent 被攻破后横向扩散。

前置条件

  • 一台可联网的 Linux 服务器(建议 2 核 4 GB 以上)
  • JDK 17 环境
  • 管理员权限与域名访问控制(建议仅内网/白名单访问)

原理说明

Jenkins 的威胁面主要来自:凭据管理(明文密钥、Jenkinsfile 硬编码密码)、插件供应链(安装来源不受控、不更新)、Groovy 脚本控制台(拥有者可执行任意代码,等价于服务器 root)、Agent 信任边界(不可信 Agent 可窃取凭据与源码)。加固的核心原则是最小权限 + 凭据不落盘 + 执行环境隔离。

操作步骤

1. 安装与初始安全配置

sudo apt update
sudo apt install -y openjdk-17-jdk
sudo wget -O /usr/share/keyrings/jenkins-keyring.asc   https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]   https://pkg.jenkins.io/debian-stable binary/" | sudo tee   /etc/apt/sources.list.d/jenkins.list
sudo apt update && sudo apt install -y jenkins

访问 http://服务器IP:8080 完成解锁后,在 系统管理 → 安全 → 全局安全配置 中:授权策略选择 矩阵授权策略,删除 Anonymous 的 Read 权限;CSRF 防护保持启用;设置代理与 Host 头校验,防止 DNS 重绑定。

2. 凭据加密与绑定

# 系统管理 → 凭据 → 全局 → 添加凭据
# 类型选择: 用户名和密码 / 机密文本 / SSH 私钥
# 切勿在 Jenkinsfile 中明文写密码
// Jenkinsfile 中使用凭据绑定,凭据 ID 引用,日志自动脱敏
pipeline {
  agent any
  stages {
    stage('Deploy') {
      steps {
        withCredentials([string(credentialsId: 'aws_secret', variable: 'SECRET')]) {
          sh 'echo $SECRET | gpg --batch --yes --passphrase-fd 0 -c app.conf'
        }
      }
    }
  }
}

3. 插件供应链管控

# 系统管理 → 插件管理 → 高级
# 升级站点仅保留官方: https://updates.jenkins.io/update-center.json
# 定期执行插件更新,高危漏洞插件立即升级或禁用
sudo systemctl restart jenkins

4. 脚本控制台与 Pipeline 防护

# 系统管理 → 安全 → In-process Script Approval
# 限制 Pipeline 中使用 signature 未批准的 Groovy 方法
# 对不可信 SCM 仓库关闭 "允许来自 SCM 的 Pipeline" 选项

5. Agent 隔离

# 使用专用低权限账号运行 Agent,禁止 root
# 构建产物与工作空间挂载到独立分区
# 对外部提交者使用静态 Agent + 容器化执行 (Docker/Kubernetes 插件)

配置验证

# 1. 匿名访问验证: 未登录访问 /manage 应跳转登录
curl -s -o /dev/null -w "%{http_code}
" http://127.0.0.1:8080/manage
# 期望输出 403 或 302

# 2. 凭据遮蔽验证: 构建日志中 $SECRET 应显示 ****
# 3. 插件漏洞检查
curl -s "http://127.0.0.1:8080/pluginManager/api/json?depth=1&tree=plugins\[plugin\[shortName,version\]\]"   -u admin:密码 | python3 -m json.tool

常见问题

Q1: 忘记 Jenkins 管理员密码怎么办?

编辑 /var/lib/jenkins/config.xml,将 <useSecurity>true</useSecurity> 改为 false,重启后进入系统管理重新创建管理员,再恢复安全配置并重启。

Q2: 如何防止开发者在 Jenkinsfile 中泄露凭据?

强制使用 withCredentials 绑定并安装 Credentials Binding 插件;配置 Gitea/GitHub 分支保护,仅允许受信任维护者合并 Pipeline 文件;同时开启构建日志扫描(如 Secret Scanning 类插件)做兜底。

Q3: Agent 节点需要开放哪些端口?

建议使用 SSH 方式连接 Agent(仅 22 端口),避免开放 JNLP 随机端口;若必须用 JNLP,将入站 TCP 端口固定并在防火墙放行该端口,且为 Agent 创建独立受限账号。

总结

Jenkins 安全加固的落地顺序是:先收紧全局授权与 CSRF,再统一凭据管理杜绝明文,随后管控插件供应链并限制脚本执行能力,最后隔离 Agent 边界。本文给出的配置可直接复制到生产环境执行,建议每季度结合安全基线检查复核一次权限矩阵与插件版本。