18.2.6 安全配置最佳实践(CSRF、Agent安全、更新策略)
6. 安全配置最佳实践(CSRF、Agent安全、更新策略)#
原理草图:Jenkins 访问与 Agent 安全边界
- CSRF 防护(Crumb)
- 启用 “防止跨站请求伪造(CSRF)”,所有 POST 请求必须携带 crumb。
- 反向代理/API 调用需在请求头加入 crumb 与认证信息。
- Webhook 使用专用 Token + IP 白名单,避免匿名触发。
示例:获取 crumb 并触发构建
# 1) 获取 crumb(Jenkins URL 与账号/Token)
JENKINS_URL="https://jenkins.example.com"
USER="ci-bot"
TOKEN="xxxxxxxxxxxxxxxx"
CRUMB=$(curl -s -u "$USER:$TOKEN" \
"$JENKINS_URL/crumbIssuer/api/json" | jq -r .crumb)
# 2) 触发 Job(携带 crumb)
curl -X POST -u "$USER:$TOKEN" \
-H "Jenkins-Crumb: $CRUMB" \
"$JENKINS_URL/job/demo-build/build?token=BUILD_TOKEN"
反向代理头示例(Nginx)
# /etc/nginx/conf.d/jenkins.conf
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $remote_addr;
# 允许传递 Jenkins-Crumb
proxy_set_header Jenkins-Crumb $http_jenkins_crumb;
}
排错要点
- 401/403:确认是否携带 crumb 与账号 Token。
- 403 “No valid crumb”:crumb 过期或代理未转发 Jenkins-Crumb 头。
- Agent 安全
- 禁用不必要的 JNLP 直连,优先使用 SSH 代理或受控入站 Agent。
- Agent 运行用户最小权限,隔离工作目录与标签。
- 固定入站端口,防火墙仅允许管理网段访问。
示例:固定入站端口 + Agent 启动
# /etc/default/jenkins (Debian/Ubuntu)
JENKINS_ARGS="--httpPort=8080 --agentPort=50000"
# 重启服务
sudo systemctl restart jenkins
# 受控入站 Agent 启动(在 Agent 机器上)
JENKINS_URL="https://jenkins.example.com"
AGENT_NAME="agent-prod-01"
SECRET="agent-secret-from-ui"
java -jar agent.jar \
-url "$JENKINS_URL" \
-secret "$SECRET" \
-name "$AGENT_NAME" \
-workDir "/var/lib/jenkins-agent"
防火墙示例:仅允许管理网段访问 50000
# 允许 10.0.0.0/24 访问
sudo iptables -A INPUT -p tcp --dport 50000 -s 10.0.0.0/24 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 50000 -j DROP
排错要点
- Agent 离线:检查端口 50000 是否通、secret 是否匹配。
- 认证失败:确认 Agent 名称与 Secret 对应。
- 更新策略
- 使用 LTS 版本,规划升级窗口,先预生产验证插件兼容。
- 重大漏洞:先备份 Jenkins Home,再执行升级。
- 建立插件清单与回滚方案。
示例:备份 Jenkins Home
# 假设 Jenkins Home 为 /var/lib/jenkins
sudo tar -czf /backup/jenkins-home-$(date +%F).tgz /var/lib/jenkins
示例:Debian/Ubuntu 升级 LTS
# 检查当前版本
curl -s http://localhost:8080/api/json | jq -r .version
# 更新 Jenkins LTS 包
sudo apt-get update
sudo apt-get install -y jenkins
# 验证升级
curl -s http://localhost:8080/api/json | jq -r .version
排错要点
- 启动失败:查看日志 /var/log/jenkins/jenkins.log。
- 插件冲突:进入“安全模式”禁用插件排查。
- 通用加固建议
- 禁止匿名访问与脚本控制台;仅对审批过脚本开放权限。
- 启用 HTTPS,强密码与可选 MFA。
- 定期审计凭据、账号、节点与插件,清理废弃项。
练习
1. 为一个 API 调用脚本加入 crumb 获取与构建触发,验证返回码为 201/302。
2. 配置一个受控入站 Agent,并通过防火墙限制端口访问来源。
3. 制作 Jenkins Home 备份包并模拟一次 LTS 升级,记录版本变化与回滚步骤。