18.2.2 用户与组管理(内置用户、LDAP/AD)

用户与组管理是 Jenkins 权限体系的基础,需兼顾易用性与安全性。内置用户适合小规模或离线环境,LDAP/AD 适合企业级集中身份管理与合规要求。

文章图片

内置用户管理
- 启用安全:在“管理 Jenkins → 全局安全配置”中选择“Jenkins 自有用户数据库”,初期可允许注册,稳定后关闭并由管理员创建账户。
- 账户创建与生命周期:通过“管理 Jenkins → 管理用户”新增、禁用、删除;建议统一命名规范(如工号/邮箱前缀)。
- 密码策略:要求复杂度与定期更换,禁止共享账号;结合锁定策略防止暴力破解。
- 分组方式:内置用户无原生组,建议配合“Role-based Authorization Strategy”插件或权限矩阵实现授权。

示例:使用 Jenkins CLI 批量创建内置用户
1) 准备 Jenkins CLI:

# 下载 CLI
curl -sS http://jenkins.example.com/jnlpJars/jenkins-cli.jar -o /opt/jenkins-cli.jar

# 创建 API Token(在用户个人页生成),保存为环境变量
export JENKINS_URL="http://jenkins.example.com"
export JENKINS_USER="admin"
export JENKINS_TOKEN="your_api_token"

2) 执行 Groovy 创建用户:

java -jar /opt/jenkins-cli.jar -s "$JENKINS_URL" -auth "$JENKINS_USER:$JENKINS_TOKEN" groovy = <<'EOF'
import jenkins.model.*
import hudson.security.*
def instance = Jenkins.getInstance()

def users = [
  [id:'dev01', name:'Dev User', email:'dev01@example.com', pass:'Dev@12345'],
  [id:'ops01', name:'Ops User', email:'ops01@example.com', pass:'Ops@12345']
]
def hudsonRealm = instance.getSecurityRealm()
users.each { u ->
  if (hudsonRealm instanceof HudsonPrivateSecurityRealm) {
    if (hudsonRealm.getUser(u.id) == null) {
      hudsonRealm.createAccount(u.id, u.pass)
      def user = hudson.model.User.get(u.id)
      user.setFullName(u.name)
      def desc = new hudson.tasks.Mailer.UserProperty(u.email)
      user.addProperty(desc)
      user.save()
      println("Created user: ${u.id}")
    } else {
      println("User exists: ${u.id}")
    }
  } else {
    println("Not using internal user database")
  }
}
EOF

预期效果:控制台输出 “Created user: dev01/ops01”,并在“管理用户”看到新增账户。

LDAP/AD 接入
- 适用场景:员工规模大、需要统一认证、账号集中回收、满足审计合规。
- 配置要点:填写 LDAP/AD 地址、根 DN、用户搜索基准、组搜索基准与过滤器;建议启用 TLS/LDAPS。
- 账户映射:使用“登录名/邮件/工号”作为用户标识;配置显示名与邮箱属性映射,便于通知与审计。
- 组同步:将 AD 组映射为 Jenkins 角色或权限矩阵条目,实现按组授权。
- 回收策略:人员离职由 AD 组移除或禁用账号后,Jenkins 权限自动失效。

示例:LDAP 连接测试与配置片段

# 使用 ldapsearch 验证连接(Linux)
ldapsearch -H ldaps://ad.example.com:636 \
  -D "CN=jenkins-bind,OU=Service,DC=example,DC=com" \
  -W \
  -b "DC=example,DC=com" \
  "(sAMAccountName=dev01)" cn mail memberOf

预期效果:返回用户 cn/mail/memberOf 属性,若报错需检查证书、DN 或账号权限。

# Jenkins 全局安全配置(界面填写示意)
Server: ldaps://ad.example.com:636
Root DN: DC=example,DC=com
User search base: OU=Users
User search filter: sAMAccountName={0}
Group search base: OU=Groups
Group search filter: (member={0})
Manager DN: CN=jenkins-bind,OU=Service,DC=example,DC=com
Manager Password: ********

安装/插件
- LDAP/AD 需安装插件:Manage Jenkins → Manage Plugins → Available → “LDAP”。
- 角色管理推荐插件:Role-based Authorization Strategy。

排错清单
1) 登录失败但 LDAP 正常:

# 检查 Jenkins 安全域配置
curl -sS -u "$JENKINS_USER:$JENKINS_TOKEN" \
  "$JENKINS_URL/manage/descriptorByName/hudson.security.LDAPSecurityRealm"

若返回为空或报 403,检查权限与安全域是否已生效。

2) 证书错误:

# 导出 AD 证书并导入 JVM truststore
echo -n | openssl s_client -connect ad.example.com:636 | \
  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/ad.crt

keytool -import -alias ad-ldap -keystore /etc/ssl/certs/java/cacerts \
  -storepass changeit -file /tmp/ad.crt

重启 Jenkins 后再测试。

3) 组权限不生效:检查组搜索基准与过滤器;确认 AD 组是否包含用户 DN。

命令解释
- ldapsearch -H 指定 LDAP/LDAPS 地址;-D 绑定账号;-b 搜索基准;(sAMAccountName=dev01) 为用户过滤器。
- keytool -import 将 LDAP 证书导入 JVM 信任库,解决 LDAPS 握手失败。

练习
1) 通过 CLI 创建 3 个内置用户并设置邮箱属性,验证在构建失败时能收到邮件通知。
2) 配置 LDAP/AD 并使用 ldapsearch 验证用户与组,随后在 Jenkins 中仅授权某 AD 组可创建 Job。
3) 人员离职:从 AD 组移除该用户,验证 Jenkins 访问是否立即失效并保留历史记录。