很多时候我们需要管理多个内容管理系统,比如Jira、Jenkins、GitEA/Gitlab等等各种管理系统,我们需要每一套管理系统每个人都管理一套密码,每套系统每套密码简直是一种灾难,于是LDAP可以解决我们的问题,帮我们统一账户登录认证,是最早的SSO系统雏形,方便的在各个系统中登录。
首先我们需要搭建一个LDAP管理系统,我们选用FreeIDA,宿主系统我们选用Fedora。
由于使用FreeIPA会顺便帮我们搭建好一系列有关Linux账户、DNS服务、389 Directory LDAP服务、证书管理等各种账户统一 登录认证、策略等功能,于是我们选用FreeIPA来帮我们做好大部分工作,我们只需要配置好我们的服务器为静态IP、并且想好一个域名即可,比如我们当前的例子使用的根域名为dsfedora.org,主机域名hostname 为 www.dsfedora.org,配置/etc/hostname和/etc/hosts绑定时需要注意本机名称一致性。
$ vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
# 本地IP地址,主机名,注意IP需要先配置为静态IP
192.168.0.200 www.dsfedora.org
$ vim /etc/hostname
# 注意本机主机名要和hosts中的本机绑定主机名一致
www.dsfedora.org
并且在防火墙加入放行端口:
$ sudo firewall-cmd --add-service=freeipa-ldap --add-service=freeipa-ldaps
$ sudo firewall-cmd --add-service=freeipa-ldap --add-service=freeipa-ldaps --permanent
然后安装FreeIPA包:
$ sudo dnf install freeipa-*
$ sudo dnf install bind bind-chroot
如果是centos系统,则使用yum命令,而不是dnf。
然后执行ipa-server-install命令,过程参考这个哥们的配置:
https://blog.csdn.net/hdyebd/article/details/88712320
注意点1,在配置ipa-server-install过程中需要输入目录服务管理器密码,以及IPA管理员admin用户密码,在这里我们都设置为12345678, 用作测试。
注意点2,在配置ipa-server-install过程中需要配置DNS转发,请一定要设置一个公开的DNS地址,比如114.114.114.114、8.8.8.8等,否则会因为不转发DNS导致本机无法透过网络进行域名解析。
于是我们就配置好了FreeIPA,现在我们可以在我们的内网测试机中加入hosts
在C:\Windows\System32\drivers\etc文件加入行:
192.168.0.200 www.dsfedora.org
我们此时就可以在浏览器中打开Free IPA 的web控制台了。
我们需要登录进去,添加测试用户。
这里使用我们刚才的管理员用户密码:admin,密码12345678。
我们 点击添加增加新用户,添加了一个test用户,密码为test. 然后退出admin账户,登录test账户,会让我们修改密码,我们重新修改成12345678,并且登录进去,我们可以看到这是一个权限非常受限的账户。
由此我们Free IPA配置和测试账户建立结束。FreeIPA的LDAP也已经就绪。待我们使用GitEA接入了。
现在我们打开GitEA管理员账户:进入管理面板,选择认证源并且添加一个LDAP认证源。并且填写以下内容。主机名按照自己的配置来设置:
以上表单的配置,除了主机名按照自己的配置以外,均可以按照上图原封不动的照抄配置。添加认证源后,我们下次登录时,就可以用FreeIPA中的用户直接登录到我们的Git EA系统中了,GitEA可以直接从我们的FreeIPA的LDAP认证源中读取用户信息了。
其中,由于我们的FreeIPA同时也创建了证书,如果认证源使用了安全协议LDAPS或者TLS,会因为证书信任问题被Git EA拒绝连接,所以我们不选择加密认证,使用Unencrypted。
到此为止我们已经配置好了使用LDAP用户登录我们的系统。
需要解释的两个地方:
用户搜索基准:
cn=users,cn=accounts,dc=dsfedora,dc=org
由于FreeIPA的LDAP模型是在组织dsfedora.org下的条目(又称DN)cn=accounts存储用户信息条目cn=users的,在cn=users条目下存储了条目,这些条目就是用户id,比如test用户的条目就叫uid=test,该条目下就会存储test用户相关的任意属性和对象类别,比如上图中的uid、sn、givenName、以及mail等属性,这些大多数都是Text类型的属性。
用户过滤规则:
(&(objectclass=top)(uid=%s))
刚才说了uid=test下有很多属性,其中还有一种属性叫做ObjectClass,叫对象类别 类型,它是一种属性类型,并且有多个名叫objectclass的对象类别属性(注意大小写),因此我们在用户过滤规则中,可以用一个通用的对象类别为objectclass=top,然后将uid作为查找依据uid=%s进行用户过滤。
绑定user DN和绑定password可以留空。