1.安装
1.1安装ldap服务
添加jenkins相关的测试账户和组
- group这个ou下面创建一个jenkins的ou。
- 在jenkins这个ou里面创建3个组,名为jenkins-admins,jenkins-editors,jenkins-users。
- 在ou=people下面创建4个账户,名为admin,test01,test02,test03,配置好邮箱和密码。
- 在三个组上面添加对应的用户, jenkins-admins组添加admin,test01用户, jenkins-editors组添加test02用户,jenkins-users组添加test03用户
ldap 创建两个 groupjenkins-admin
和 jenkins-manager
。并分别将用户 admin
, operator
各自分配到两个组下。(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
点击进去
- Manage Roles: 角色分为Global和Project,可创建角色分组和添加项目。
- Assign Roles: 增加具体的用户,分配到角色组,指定项目权限
注: 这里有一个小问题,这样配置以后,新用户登录进来以后就会提示没有权限,Access Denied,xxxx没有全部/Read权限
,这是因为在打开jenkins后,没有创建用户前,先不要勾选系统设置中启用安全选项,如果勾选了,就会出现无法进入jenkins的现象
- Role-Based Strategy
但是这有一个弊端,就是每次新来一个用户就得去添加一次用户权限,虽然满足了业务需求,但是不科学
- 项目矩阵授权策略
这是一个全局的配置,特定组只能按照最小的权限授权,额外的权限可以在具体的项目权限矩阵里面在添加。 默认只有Anonymous Users
和Authenticated Users
,管理员组是需要添加的admin
- Anonymous Users: 匿名用户,显然不能
- Authenticated Users: 认证用户,就是只要是认证的账号都可以拥有的权限
- admin: 就是拥有所有的权限了,这个组一般只能运维人员和部门老大加入
加入admin组以后,他会自动去同步ldap的组用户,如果用户在ldap是admin组,那么在这里就会是管理员权限,如果用户是普通组,那么就是Authenticated Users
组赋予的权限,使用这种方式只要用户是ldap里面的,就可以登录查看。这样就满足了业务场景需求
配置ldap
参考,https://plugins.jenkins.io/ldap/
#先备份文件
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 认证的信息
<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 也无法正常登陆。可以把上面一段替换成以下内容
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
<disableSignup>false</disableSignup>
<enableCaptcha>false</enableCaptcha>
</securityRealm>
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
<disableSignup>false</disableSignup>
<enableCaptcha>false</enableCaptcha>
</securityRealm>