Skip to content

1.安装

1.1安装ldap服务

添加jenkins相关的测试账户和组

  1. group这个ou下面创建一个jenkins的ou。
  2. 在jenkins这个ou里面创建3个组,名为jenkins-admins,jenkins-editors,jenkins-users。
  3. 在ou=people下面创建4个账户,名为admin,test01,test02,test03,配置好邮箱和密码。
  4. 在三个组上面添加对应的用户, jenkins-admins组添加admin,test01用户, jenkins-editors组添加test02用户,jenkins-users组添加test03用户

ldap 创建两个 groupjenkins-adminjenkins-manager。并分别将用户 adminoperator 各自分配到两个组下。(ldapadmin 工具操作用户分配组:在用户条目上右键 View\Edit Group Membership,选择要加入的组

或者通过以下方式操作

docker pull osixia/phpldapadmin
docker pull osixia/phpldapadmin

创建OU组织用户数据

  • 选择Organisational unit 组织单元

  • 输入OU名称

  • 提交信息

  • 查看结果

创建人员

  • 选择OU->选择新建子条目

  • 选择默认模板

  • 选择inetorgperson

  • 填写并提交信息

  • 用户创建完成

1.2安装jenkins ldap插件

  • ldap

1.登录Jenkins --> 系统管理 --> 插件管理 --> 可选插件 --> 搜索LDAP --> 选中 --> 直接安装 --> 安装完成重启

2.官网下载插件 --> 登录Jenkins --> 系统管理 --> 插件管理 --> 高级 --> 上传插件 --> 选择文件 --> 上传 --> 安装完成后重启(手动安装),https://updates.jenkins-ci.org/download/plugins/

此处已安装

1.4配置jenkins权限

前期配置先把权限配置高级

配置ldap权限

但是我们需要对用户进行权限的配置,不可能每个人登录都能对我们jenkins进行无限制的操作,这不符合我们之前的意图。安装Role-based Authorization Strategy插件

在系统管理——>全局安全配置,可以看到下面选项

保存以后,返回系统管理界面就可以看到多处一个Manage and Assign Roles

1571034433352

点击进去

  • Manage Roles: 角色分为Global和Project,可创建角色分组和添加项目。
  • Assign Roles: 增加具体的用户,分配到角色组,指定项目权限

: 这里有一个小问题,这样配置以后,新用户登录进来以后就会提示没有权限,Access Denied,xxxx没有全部/Read权限,这是因为在打开jenkins后,没有创建用户前,先不要勾选系统设置中启用安全选项,如果勾选了,就会出现无法进入jenkins的现象

  • Role-Based Strategy

但是这有一个弊端,就是每次新来一个用户就得去添加一次用户权限,虽然满足了业务需求,但是不科学

  • 项目矩阵授权策略

这是一个全局的配置,特定组只能按照最小的权限授权,额外的权限可以在具体的项目权限矩阵里面在添加。 默认只有Anonymous UsersAuthenticated Users,管理员组是需要添加的admin

  • Anonymous Users: 匿名用户,显然不能
  • Authenticated Users: 认证用户,就是只要是认证的账号都可以拥有的权限
  • admin: 就是拥有所有的权限了,这个组一般只能运维人员和部门老大加入

加入admin组以后,他会自动去同步ldap的组用户,如果用户在ldap是admin组,那么在这里就会是管理员权限,如果用户是普通组,那么就是Authenticated Users组赋予的权限,使用这种方式只要用户是ldap里面的,就可以登录查看。这样就满足了业务场景需求

配置ldap

参考,https://plugins.jenkins.io/ldap/

shell
#先备份文件
cp config.xml config.xml_back
#先备份文件
cp config.xml config.xml_back
  • 登录 Jenkins –> 系统管理 –> 全局安全配置

或者

说明:

  • root DN:这里的 root DN只是指搜索的根,并非 LDAP 服务器的 root dn。由于 LDAP 数据库的数据组织结构类似一颗大树,而搜索是递归执行的,理论上,我们如果从子节点(而不是根节点)开始搜索,因为缩小了搜索范围那么就可以获得更高的性能。这里的 root DN 指的就是这个子节点的 DN,当然也可以不填,表示从 LDAP 的根节点开始搜索

  • User search base:这个配置也是为了缩小 LDAP 搜索的范围,例如 Jenkins 系统只允许 ou 为 Admin 下的用户才能登陆,那么你这里可以填写 ou=Admin,这是一个相对的值,相对于上边的 root DN,例如你上边的 root DN 填写的是 dc=domain,dc=com,那么 user search base 这里填写了 ou=Admin,那么登陆用户去 LDAP 搜索时就只会搜索 ou=Admin,dc=domain,dc=com 下的用户

  • User search filter:这个配置定义登陆的 “用户名” 对应 LDAP 中的哪个字段,如果你想用 LDAP 中的 uid 作为用户名来登录,那么这里可以配置为 uid={0}({0} 会自动的替换为用户提交的用户名),如果你想用 LDAP 中的 mail 作为用户名来登录,那么这里就需要改为 mail={0}。在测试的时候如果提示你 user xxx does not exist,而你确定密码输入正确时,就要考虑下输入的用户名是不是这里定义的这个值了

  • Group search base:参考上边 User search base 解释

  • Group search filter:这个配置允许你将过滤器限制为所需的 objectClass 来提高搜索性能,也就是说可以只搜索用户属性中包含某个 objectClass 的用户,这就要求你对你的 LDAP 足够了解,一般我们也不配置

  • Group membership:没配置,没有详细研究

  • Manager DN:这个配置在你的 LDAP 服务器不允许匿名访问的情况下用来做认证,通常 DN 为 cn=admin,dc=domain,dc=com 这样

  • Manager Password:上边配置 dn 的密码

  • Display Name LDAP attribute:配置用户的显示名称,一般为显示名称就配置为 uid,如果你想显示其他字段属性也可以这里配置,例如 mail

  • Email Address LDAP attribute:配置用户 Email 对应的字段属性,一般没有修改过的话都是 mail,除非你用其他的字段属性来标识用户邮箱,这里可以配置

  • Enable Cache: 当你的 LDAP 数据量很大或者 LDAP 服务器性能较差时,可以开启缓存,配置缓存条数和过期时间,那么在过期时间内新请求优先查找本地缓存认证,认证通过则不会去 LDAP 服务器请求,以减轻 LDAP 服务器的压力

  • 选择账号测试,出现一下信息集成完毕

  • 配置 ldap 分组认证

==强烈建议使用安全矩阵授权策略==

操作步骤:选择 jenkins -> 系统管理 -> 全局安全设置 -> 访问控制 -> ldap -> 授权策略,选择安全矩阵授权策略

或者

1.5配置失败还原

如果LDAP配置失败,原来的例如admin账号也无法登陆了。
 解决方法如下:
 找到jenkins服务所在主机,找到数据文件夹,我这里配置的是/var/jenkins_home
 找到config.xml
 将<usesecurity>true</usesecurity>
 设置为false
 重启jenkins服务即可
如果LDAP配置失败,原来的例如admin账号也无法登陆了。
 解决方法如下:
 找到jenkins服务所在主机,找到数据文件夹,我这里配置的是/var/jenkins_home
 找到config.xml
 将<usesecurity>true</usesecurity>
 设置为false
 重启jenkins服务即可
  • 或者

在 config.xml 配置文件中找到这段关于 ldap 认证的信息

xml
<securityRealm class="hudson.security.LDAPSecurityRealm" plugin="ldap@1.20">
    <disableMailAddrexxxesolver>false</disableMailAddrexxxesolver>
    <configurations>
      <jenkins.security.plugins.ldap.LDAPConfiguration>
        <server>ldap://XXXXXX.com:389</server>
        <rootDN>dc=XXXXXX,dc=com</rootDN>
        <inhibitInferRootDN>false</inhibitInferRootDN>
        <userSearchBase></userSearchBase>
        <userSearch>uid={0}</userSearch>
        <groupMembershipStrategy class="jenkins.security.plugins.ldap.FromGroupSearchLDAPGroupMembershipStrategy">
          <filter>cn=jenkins</filter>
        </groupMembershipStrategy>
        <managerDN>uid=jarry,ou=People,dc=XXXXXX,dc=com</managerDN>
        <managerPasswordSecret>{AQAAABAAAAAQWfZrb7qoIjeM=}</managerPasswordSecret>
        <displayNameAttributeName>uid</displayNameAttributeName>
        <mailAddressAttributeName>mail</mailAddressAttributeName>
        <ignoreIfUnavailable>false</ignoreIfUnavailable>
        <extraEnvVars class="linked-hash-map">
          <entry>
            <string></string>
            <string></string>
          </entry>
        </extraEnvVars>
      </jenkins.security.plugins.ldap.LDAPConfiguration>
    </configurations>
    <userIdStrategy class="jenkins.model.IdStrategy$CaseInsensitive"/>
    <groupIdStrategy class="jenkins.model.IdStrategy$CaseInsensitive"/>
    <disableRolePrefixing>true</disableRolePrefixing>
  </securityRealm>
<securityRealm class="hudson.security.LDAPSecurityRealm" plugin="ldap@1.20">
    <disableMailAddrexxxesolver>false</disableMailAddrexxxesolver>
    <configurations>
      <jenkins.security.plugins.ldap.LDAPConfiguration>
        <server>ldap://XXXXXX.com:389</server>
        <rootDN>dc=XXXXXX,dc=com</rootDN>
        <inhibitInferRootDN>false</inhibitInferRootDN>
        <userSearchBase></userSearchBase>
        <userSearch>uid={0}</userSearch>
        <groupMembershipStrategy class="jenkins.security.plugins.ldap.FromGroupSearchLDAPGroupMembershipStrategy">
          <filter>cn=jenkins</filter>
        </groupMembershipStrategy>
        <managerDN>uid=jarry,ou=People,dc=XXXXXX,dc=com</managerDN>
        <managerPasswordSecret>{AQAAABAAAAAQWfZrb7qoIjeM=}</managerPasswordSecret>
        <displayNameAttributeName>uid</displayNameAttributeName>
        <mailAddressAttributeName>mail</mailAddressAttributeName>
        <ignoreIfUnavailable>false</ignoreIfUnavailable>
        <extraEnvVars class="linked-hash-map">
          <entry>
            <string></string>
            <string></string>
          </entry>
        </extraEnvVars>
      </jenkins.security.plugins.ldap.LDAPConfiguration>
    </configurations>
    <userIdStrategy class="jenkins.model.IdStrategy$CaseInsensitive"/>
    <groupIdStrategy class="jenkins.model.IdStrategy$CaseInsensitive"/>
    <disableRolePrefixing>true</disableRolePrefixing>
  </securityRealm>

上面的配置不当无法通过 ldap 认证,jenkins 也无法正常登陆。可以把上面一段替换成以下内容

xml
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
  <disableSignup>false</disableSignup>
  <enableCaptcha>false</enableCaptcha>
</securityRealm>
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
  <disableSignup>false</disableSignup>
  <enableCaptcha>false</enableCaptcha>
</securityRealm>