第八章:安全配置
Jenkins 安全加固和权限管理,包括用户认证、授权策略、安全配置。
最后更新: 2024-01-15
页面目录
Jenkins 安全配置
安全是生产环境部署的重要考虑因素。本章介绍 Jenkins 的安全配置,包括认证、授权、凭据管理和安全加固。
安全配置概览
┌─────────────────────────────────────────────────────────────────┐
│ Jenkins 安全体系 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐│
│ │ 认证 │ │ 授权 │ │ 凭据 ││
│ │ • Jenkins 用户 │ │ • 矩阵授权 │ │ • 密钥管理 ││
│ │ • LDAP │ │ • 项目授权 │ │ • 密码加密 ││
│ │ • OAuth/GitHub │ │ • 基于角色 │ │ • 证书存储 ││
│ │ • SAML │ │ • 登录用户 │ │ • SSH 密钥 ││
│ └──────────────────┘ └──────────────────┘ └──────────────────┘│
│ │
│ ┌──────────────────┐ ┌──────────────────┐ │
│ │ 全局安全配置 │ │ 审计日志 │ │
│ │ • CSRF 防护 │ │ • 操作记录 │ │
│ │ • 脚本安全 │ │ • 构建历史 │ │
│ │ • Agent 通信 │ │ • 登录日志 │ │
│ └──────────────────┘ └──────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
访问控制配置
配置路径
系统管理 → 安全 → 全局安全配置
启用安全
| 配置项 | 推荐设置 | 说明 |
|---|---|---|
| 启用安全 | ✅ | 必须启用 |
| 安全域 | 根据需求选择 | 详见下方 |
| 授权策略 | 根据需求选择 | 详见下方 |
| 防止跨站请求伪造 | ✅ | 建议启用 |
| 代理兼容性 | ❌ | 除非需要 |
安全域配置
1. Jenkins 内置用户数据库
适用于小型团队:
安全域 → Jenkins 内置用户数据库
✅ 允许用户注册(可选)
2. LDAP 集成
适用于企业环境:
| 配置项 | 值 |
|---|---|
| 服务器 | ldap://ldap.example.com |
| 端口 | 389(或 636 SSL) |
| Root DN | dc=example,dc=com |
| 用户搜索基础 | ou=users |
| 用户搜索过滤器 | (uid={0}) |
| 组搜索基础 | ou=groups |
| 组搜索过滤器 | (member={0}) |
高级配置:
| 配置项 | 说明 |
|---|---|
| 管理员邮箱 | admin@example.com |
| 禁用 LDAP 邮件地址查找 | 根据需要 |
| 启用嵌套组 | ✅ 大型组织 |
3. OAuth/GitHub 集成
安全域 → GitHub Authentication Plugin
✅ Allow users to sign up
GitHub App:
- App ID: xxx
- Client ID: xxx
- Client secret: xxx
4. SAML 2.0 集成
适用于 SSO 场景:
| 配置项 | 值 |
|---|---|
| IdP 元数据 URL | https://idp.example.com/metadata |
| SP Entity ID | jenkins |
| SP 名称 ID 格式 | EmailAddress |
授权策略
1. 任何人都有所有权限
适用于开发/测试环境:
⚠️ 仅用于本地开发!
2. 登录用户可以做任何事情
适用于小型团队:
授权策略 → 登录用户可以做任何事情
3. 矩阵授权策略
精细化权限控制:
| 权限 | Admin | Developer | Viewer |
|---|---|---|---|
| Overall/Administer | ✅ | ❌ | ❌ |
| Overall/Read | ✅ | ✅ | ✅ |
| Overall/RunScripts | ✅ | ❌ | ❌ |
| Job/Read | ✅ | ✅ | ✅ |
| Job/Build | ✅ | ✅ | ❌ |
| Job/Configure | ✅ | ✅ | ❌ |
| Job/Create | ✅ | ✅ | ❌ |
| Job/Delete | ✅ | ✅ | ❌ |
| Job/Workspace | ✅ | ✅ | ✅ |
| Credentials/View | ✅ | ✅ | ❌ |
| Credentials/Update | ✅ | ✅ | ❌ |
4. 项目矩阵授权策略
针对项目级别的权限控制:
// Pipeline 中配置项目权限
properties([
authorizationMatrix([
user1: ['BUILD', 'CANCEL'],
user2: ['BUILD', 'CANCEL', 'CONFIGURE'],
'developers': ['BUILD', 'CANCEL', 'WORKSPACE']
])
])
5. 基于角色的授权
安装 Role-based Authorization Strategy 插件:
授权策略 → Role-Based Strategy
创建角色:
| 角色类型 | 角色名称 | 权限 |
|---|---|---|
| Global roles | admin | 所有权限 |
| Global roles | developer | Job 读写,构建 |
| Global roles | viewer | 只读 |
| Item roles | release-.* | 正则匹配 |
分配角色:
Manage and Assign Roles → Assign Roles
凭据管理
添加凭据
系统管理 → 安全 → Manage Credentials
→ Stores scoped to Jenkins → Jenkins → 全局凭据
凭据类型
| 类型 | 用途 |
|---|---|
| 用户名和密码 | Git 认证、数据库连接 |
| SSH 用户名和私钥 | SSH 连接、Git SSH |
| 密钥文件 | 证书、配置文件 |
| 秘密文本 | API Token、密钥 |
| 证书 | SSL 证书 |
Pipeline 中使用凭据
pipeline {
agent any
environment {
// 凭据会自动解密
API_TOKEN = credentials('api-token-secret')
}
stages {
stage('Build') {
steps {
withCredentials([string(credentialsId: 'my-secret', variable: 'SECRET')]) {
sh 'curl -H "Authorization: Bearer $SECRET" https://api.example.com'
}
}
}
}
}
凭据绑定
steps {
withCredentials([
// 用户名密码
usernamePassword(
credentialsId: 'github-credentials',
usernameVariable: 'GIT_USER',
passwordVariable: 'GIT_PASS'
),
// SSH 私钥
sshUserPrivateKey(
credentialsId: 'ssh-key',
usernameVariable: 'SSH_USER',
keyFileVariable: 'SSH_KEY'
),
// 文件
file(
credentialsId: 'config-file',
variable: 'CONFIG_PATH'
)
]) {
sh '''
git clone https://$GIT_USER:$GIT_PASS@github.com/org/repo.git
ssh -i $SSH_KEY $SSH_USER@host
'''
}
}
CSRF 防护
启用 CSRF 令牌
全局安全配置 → 防止跨站请求伪造
✅ 启用代理兼容性(可选)
###crumb 算法配置
| 配置项 | 说明 |
|---|---|
| crumb 请求参数 | Jenkins-Crumb |
| 排除 Content-Type | 某些 API 可能需要 |
脚本安全
Groovy 脚本沙箱
全局安全配置 → Groovy 脚本沙箱
✅ 启用 Groovy 沙箱
脚本审批
系统管理 → In-process Script Approval
• 审批方法签名
• 审批脚本
推荐配置
// 在 Pipeline 中禁用沙箱(需审批)
@Grab('org.apache.commons:commons-lang3:3.12.0')
// 推荐使用沙箱内可用的方法
Agent 通信安全
Agent → Controller 连接
全局安全配置 → Agent → Controller 访问控制
| 模式 | 说明 |
|---|---|
| 启用 | 允许从代理到控制器的请求 |
| 禁用 | 更安全但功能受限 |
WebSocket 连接
适用于现代 Jenkins 配置:
全局安全配置 → Agent → WebSocket
✅ 启用 WebSocket 连接
审计日志
安装 Audit Trail 插件
系统管理 → 插件管理 → 搜索 "audit trail"
配置审计日志
系统管理 → 系统设置 → Audit Trail
日志文件: ${JENKINS_HOME}/logs/audit.log
轮转: 每天
最大文件数: 30
记录的内容
| 类别 | 记录内容 |
|---|---|
| 身份验证 | 登录、登出、认证失败 |
| 授权 | 权限检查、拒绝访问 |
| 凭据 | 凭据创建、修改、删除 |
| 配置 | 系统配置变更 |
| 任务 | 任务创建、修改、删除 |
| 构建 | 构建启动、完成、失败 |
安全加固清单
系统级别
# 1. 使用 HTTPS
# 2. 防火墙限制访问
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw deny 8080/tcp # 禁止直接访问
# 3. 定期更新 Jenkins
sudo apt update && sudo apt upgrade jenkins
# 4. 限制 SSH 访问
sudo ufw allow 22/tcp from 10.0.0.0/8
# 5. 文件权限
chown -R jenkins:jenkins /var/lib/jenkins
chmod -R 600 /var/lib/jenkins/secrets
Jenkins 配置级别
| 配置项 | 推荐 |
|---|---|
| 管理员数量 | 最少 2 人 |
| 密码策略 | 强密码要求 |
| 会话超时 | 30 分钟 |
| 失败登录锁定 | 3 次 |
| API Token | 按需生成 |
| 公开项目 | 生产环境禁用 |
Pipeline 安全
pipeline {
options {
// 禁止不安全的环境变量传递
disableGlobalEnvironmentVariables()
}
stages {
stage('Security Check') {
steps {
script {
// 验证输入参数
assert params.VERSION : "VERSION 参数不能为空"
assert params.VERSION ==~ /^\d+\.\d+\.\d+$/ : "版本格式不正确"
}
}
}
}
}
常见安全配置场景
场景 1:团队 LDAP + 开发权限
安全域: LDAP (企业 AD)
授权策略: 矩阵授权
- IT Admin: 完全控制
- Developer: Job 构建,配置
- QA: Job 只读,构建
场景 2:GitHub SSO + 项目权限
安全域: GitHub OAuth
授权策略: 项目矩阵授权
- 项目所有者: 完全控制
- 协作者: 构建
- 其他: 只读
下一步
接下来让我们学习分布式构建架构。
👉 分布式构建
🔒 安全提醒:生产环境务必启用安全配置,并定期审查权限分配。