Linux Centos7搭建LDAP服务(解决设置密码生成密文添加到配置文件配置后输入密码验证报错)
由于公司需要进行ldap测试,需要搭建一个openldap,一开始以为很简单网上找找教程跟着搭就完了,结果整整耗时3天才搭建成功,一直卡在生成密码密文没问题输入密码验证就报错,找了很多资料请教了大佬才得以成功,网上教程都不详细会跳过一些步骤导致最后搭建不成功,这里我就记录一下完整的详细的ldap搭建过程,也怕后面自己忘关键步骤,本文尽可能详细的说明其中每一步的作用和细节
LDAP简介
LDAP(Lightweight Directory Access Protocol) 代表轻量级目录访问协议
LDAP 是一种非关系型数据库
LDAP 可扩展性和灵活性良好 安装和配置简单
LDAP目录服务
日常生活中,或者开发过程中,需要管理的目录有很多。 如:人员组织管理,电话簿,地址簿,字典表等。提供管理和查询目录信息的服务就是目录服务。有很多厂商实现了目录服务,但是对外提供的接口不统一,所以客户接入一个厂商之后想要切换厂商,成本很高。所以出现了ldap 协议ldap 协议规定所有的厂商对外提供接口的时候必须遵守统一的格式,客户端访问也遵循统一的格式,这样 之后,客户端想要切换厂商只要 改一个地址就可以了。
LDAP服务安装
安装环境Centos7
1.执行命令进行安装
yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel
2.启动LDAP服务、查看服务是否正常启动、设置开机启动,显示 Active: active (running)为服务正常启动
systemctl start slapd
systemctl status slapd
systemctl enable slapd
修改openldap配置
很多文章这里就没有说这里为什么要这样配置,这里很重要请仔细阅读,从openldap2.4.23版本开始,所有配置都保存在/etc/openldap/slapd.d目录下的cn=config文件夹内,不再使用slapd.conf作为配置文件。配置文件的后缀为 ldif,且每个配置文件都是通过命令自动生成的,打开一个配置文件,在开头都会有一行注释说明,此为自动生成的文件,请勿编辑,使用ldapmodify命令进行修改
安装ldap后,有三个命令用于修改配置文件,分别为ldapadd, ldapmodify, ldapdelete,字面思义就是添加,修改和删除。而需要修改或增加配置时,则需要先写一个ldif后缀的配置文件,然后通过命令将写的配置更新到slapd.d目录下的配置文件中去,完整的配置过程如下
1.使用命令设置管理员密码并生成一串密文,找个文档记录下这个密码和密文,后面需要用到
slappasswd -s 123456qwer{SSHA}XAfPd4YohQACCEyQdIy867aw0YlDCiF0
2.新增修改密码文件,ldif为后缀,文件名随意,不要在/etc/openldap/slapd.d/目录下创建类似文件
, 生成的文件为需要通过命令去动态修改ldap现有配置,我是在/home目录下创建了一个openldap的文件夹,再创建文件
cd /home/openldapvim changepwd.ldif #文件填入以下内容记得替换刚才生成的密码密文
----------------------------------------------------------------------
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}XAfPd4YohQACCEyQdIy867aw0YlDCiF0
----------------------------------------------------------------------
# 第一行执行配置文件,这里就表示指定为 cn=config/olcDatabase={0}config 文件。到/etc/openldap/slapd.d/目录下就能找到此文件
# 第二行 changetype 指定类型为修改
# 第三行 add 表示添加 olcRootPW 配置项
# 第四行指定 olcRootPW 配置项的值
# 在执行下面的命令前,你可以先查看原本的olcDatabase={0}config文件,里面是没有olcRootPW这个项的,执行命令后,你再看就会新增了olcRootPW项,而且内容是我们文件中指定的值加密后的字符串
3.执行命令加载生效配置
ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif
4.查看配置文件成功添加密码
cat /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{0\}config.ldif
5.依次执行下面命令
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/collective.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/corba.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/duaconf.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/dyngroup.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/java.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/misc.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/openldap.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/pmi.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/ppolicy.ldif
6.修改域名,新增changedomain.ldif, 这里我自定义的域名为 ldap.com,管理员用户账号为admin。自定义自己域名,修改文件中相应的dc=ldap,dc=com为自己的域名,将生成的密码密文添加到
olcRootPW: {SSHA}XAfPd4YohQACCEyQdIy867aw0YlDCiF0
*注意在冒号:后面有一个空格,后面不能有空格,这里有5个地方需要进行替换修改
vim changedomain.ldif
-------------------------------------------------------------------------
dn: olcDatabase={1}monitor,cn=config
changetype: modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=admin,dc=ldap,dc=com" read by * nonedn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=ldap,dc=comdn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=ldap,dc=comdn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}XAfPd4YohQACCEyQdIy867aw0YlDCiF0dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=ldap,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=admin,dc=ldap,dc=com" write by * read
7. 执行命令,加载配置,修改了5个地方所以这里会返回5条成功信息,如下图
ldapmodify -Y EXTERNAL -H ldapi:/// -f changedomain.ldif
8.新建add-memberof.ldif开启memberof支持并新增用户支持memberof配置
vim add-memberof.ldif
-------------------------------------------------------------
dn: cn=module{0},cn=config
cn: modulle{0}
objectClass: olcModuleList
objectclass: top
olcModuleload: memberof.la
olcModulePath: /usr/lib64/openldapdn: olcOverlay={0}memberof,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfUniqueNames
olcMemberOfMemberAD: uniqueMember
olcMemberOfMemberOfAD: memberOf
9.新增refint1.ldif文件
vim refint1.ldif
-------------------------------------------------------------
dn: cn=module{0},cn=config
add: olcmoduleload
olcmoduleload: refint
10.新增refint2.ldif文件
vim refint2.ldif
-------------------------------------------------------------
dn: olcOverlay=refint,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
objectClass: top
olcOverlay: refint
olcRefintAttribute: memberof uniqueMember manager owner
11.依次执行下面命令,加载配置,顺序不能错
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f add-memberof.ldif
ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f refint1.ldif
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f refint2.ldif
创建组织
1.我们创建一个叫做 ldap company 的组织,并在其下创建一个 admin 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限)和 People 和 Group 两个组织单元
vim base.ldif
----------------------------------------------------------
dn: dc=ldap,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: ldap Company
dc: ldapdn: cn=admin,dc=ldap,dc=com
objectClass: organizationalRole
cn: admindn: ou=People,dc=ldap,dc=com
objectClass: organizationalUnit
ou: Peopledn: ou=Group,dc=ldap,dc=com
objectClass: organizationalRole
cn: Group
2.这里要注意修改域名为自己配置的域名,共有6个地方需要修改,然后加载配置,这里需要输入上面我们生成的密码
*注意执行命令里面dc时需要修改为自己修改后的名称,我这里是dc=ldap
ldapadd -x -D cn=admin,dc=ldap,dc=com -W -f base.ldif
到这里我们就设置好了一个 LDAP 目录树:其中基准 dc=ldap,dc=com 是该树的根节点,其下有一个管理域 cn=admin,dc=ldap,dc=com 和两个组织单元 ou=People,dc=ldap,dc=com 及 ou=Group,dc=ldap,dc=com
安装phpldapadmin
1.ldap装好后,我们安装web界面phpldapadmin
phpldapadmin已经很久没更新了,只支持php5,如果你服务器的环境是php7,则会有问题,页面会有各种报错
2.我们先安装PHP5
sudo yum install php php-cli php-common php-devel php-gd php-mbstring php-pdo php-pecl-zip php-xml php-mysqlnd
2.安装phpldapadmin这里需要添加yum源,一般源中无phpldapadmin包
yum localinstall http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum -y install phpldapadmin
3.执行 rpm -qa|grep httpd 查看apache版本
4.修改phpldapadmin配置文件
我这里只安装的apache为2.4版本。所以只需要改2.4版本的配置就可以了
vim /etc/httpd/conf.d/phpldapadmin.conf
-----------------------------------------------------------------<IfModule mod_authz_core.c># Apache 2.4Require all granted</IfModule>
-----------------------------------------------------------------
5.修改配置用DN登录ldap
vim /etc/phpldapadmin/config.php
-----------------------------------------------------------------
# 398行,默认是使用uid进行登录,我这里改为cn,也就是用户名
$servers->setValue('login','attr','cn');# 460行,取消注释关闭匿名登录,否则任何人都可以直接匿名登录查看所有人的信息
$servers->setValue('login','anon_bind',false);# 519行,取消注释设置用户属性的唯一性,这里我将cn,sn加上了,以确保用户名的唯一性
$servers->setValue('unique','attrs',array('mail','uid','uidNumber','cn','sn'));
6.启动apache
systemctl start httpd
systemctl enable httpd
登录phpldapadmin界面
1.此时还无法访问,用其他主机telnet查看80端口发现端口不通
2.开启服务器的80端口
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
3.开放端口后需要从新加载防火墙配置才能生效
sudo firewall-cmd --reload
4.在浏览器上访问: http://ip/ldapadmin ,然后使用上面定义的用户,进行登录
5.发现报错Can't contact LDAP server (-1) for anon
无法连接LDAP服务的故障排查过程。问题出现在SELinux策略上
1.执行命令getsebool -a | grep ldap发现httpd_can_connect_ldap --> off是关闭的这就是原因
getsebool -a | grep ldap
2.执行setsebool -P httpd_can_connect_ldap=1将其开启,状态变为on就行了
setsebool -P httpd_can_connect_ldap=1
3.再次登录此时便成功登录