第八章:安全配置

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
授权策略: 项目矩阵授权
    - 项目所有者: 完全控制
    - 协作者: 构建
    - 其他: 只读

下一步

接下来让我们学习分布式构建架构。

👉 分布式构建


🔒 安全提醒:生产环境务必启用安全配置,并定期审查权限分配。