已剪辑自: https://blog.csdn.net/changkao7080/article/details/100969980

一.安装OpenLDAP

yum install openldap openldap-clients openldap-servers

  1. 安装完直接启动、并设置自启动
  2. systemctl start slapd && systemctl enable slapd.service
  3. 设置管理员密码
  4. slappasswd -h {SSHA}
  5. 然后会让你输入一个明文密码,返回给你一个加密的密码,记住这个返回的密码+

1.使用ldapsearch命令查询管理员的dn:

ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config "olcRootDN=cn=Manager,dc=my-domain,dc=com" dn olcRootDN olcRootPW :::info 这里返回的dn是olcDatabase={2}hdb,cn=config,密码等信息也都一并返回。
这里有用的是dn和密码的加密方式
比如这里是SSHA,dn是后面修改的Entry DN,
而知道密码的加密方式就可以使用该加密方式生成新密码。

:::

2.使用ldapmodify修改条目

1、生成修改内容

  1. vim chrootpw.ldif
  2. #这是第1步获取的管理员dn
  3. dn: olcDatabase={2}hdb,cn=config
  4. changetype: modify
  5. replace: olcSuffix
  6. #你想要改成的域名的后缀
  7. olcSuffix: dc=xinniu,dc=com
  8. #olcSuffix这几行一定要加,否则修改之后会出错,后面重启openldap都会失败
  9. dn: olcDatabase={2}hdb,cn=config
  10. changetype: modify
  11. replace: olcRootDN
  12. #你想要改成的域名
  13. olcRootDN: cn=admin,dc=xinniu,dc=com
  14. dn: olcDatabase={2}hdb,cn=config
  15. changetype: modify
  16. replace: olcRootPW
  17. #这里就是刚才保存下来的那个加密后的密码
  18. olcRootPW: {SSHA}uYnICxla0NrUC5b/ha4i1JeOTCoUchV+

如图:
image.png

2、使用下面的命令来修改管理员条目:

ldapmodify -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
如果出现:
modifying entry “olcDatabase={2}bdb,cn=config”
则需要导入基本数据结构

  1. 导入基本数据结构
  2. 我们需要向 LDAP 中导入一些基本的 Schema。这些 Schema 文件位于 /etc/openldap/schema/ 目录中,schema控制着条目拥有哪些对象类和属性
  3. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/cosine.ldif
  4. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/nis.ldif
  5. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/collective.ldif
  6. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/corba.ldif
  7. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/core.ldif
  8. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/duaconf.ldif
  9. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/dyngroup.ldif
  10. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/inetorgperson.ldif
  11. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/java.ldif
  12. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/misc.ldif
  13. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/openldap.ldif
  14. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/pmi.ldif
  15. ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/ppolicy.ldif

3、开启ldap日志

  1. mkdir -p /var/log/slapd
  2. chown ldap:ldap /var/log/slapd/
  3. touch /var/log/slapd/slapd.log
  4. chown ldap . /var/log/slapd/slapd.log
  5. echo "local4.* /var/log/slapd/slapd.log" >> /etc/rsyslog.conf

到此就设定好了管理员的密码。可以用客户端去管理openldap了
打算使用phpldapadmin来管理openldap,这个工具使用的人较多,网上文档多,出现问题容易解决。

二.安装phpldapadmin(ldap管理工具)

1.安装必要环境

  1. 首先安装ApachePHP
  2. yum -y install httpd php php-ldap php-gd php-mbstring php-pear php-bcmath php-xml
  3. 然后安装phpldapadmin
  4. yum -y install phpldapadmin

2.httpd与phpldapadmin进行集成:

1、修改配置文件:

  1. [root@localhost ~]# vim /etc/phpldapadmin/config.php
  2. #397行取消注释,398行添加注释
  3. a. $servers->setValue('login','attr','dn');
  4. b. // $servers->setValue('login','attr','uid');
  5. 这里需要修改,如果不修改,phpldapadmin会去用uid去搜索条目,不会用dn去搜索,导致报密码错误。
  6. phpldapadminip过滤规则默认是拒绝所有ip访问,先去修改一下规则,我们才可以访问
  7. vim /etc/httpd/conf.d/phpldapadmin.conf
  8. ##这是Apache2.2和以前的修改方法
  9. // 修改配置
  10. 把下面的Deny from all 改为Allow from all
  11. ##这是apache2.4和以后的修改方法
  12. a. #允许172.16.10.16访问
  13. b. Require ip 172.16.10.16
  14. c. #允许172.16这个网段访问
  15. d. Require ip 172.16.0.0/16
  16. e. #允许所有ip访问
  17. f. Require all granted
  18. 我们可以根据自己需要修改来
  19. 修改完之后启动:

2、配置自启、并启动

systemctl restart httpd
界面:
image.png
登陆
用户名,默认是 cn=Manager,dc=my-domain,dc=com(这个也可以改的,仿照修改密码的步骤)
密码就输入刚开始设置的密码
登陆进去后,我的管理界面报这个信息:
This base cannot be created with PLA
显示结果如下:

image.png
经过查询,原因是根结点需要初始化后才能使用,最终处理如下:
1、创建一个initroot.ldif文件,为创建初始化根节点做准备工作,如下所示:
dn: dc=xinniu,dc=com
#域名的后缀
o: ldap
objectclass: dcObject
objectclass: organization
image.png
2、执行ldapadd -f initroot.ldif -x -D cn=admin,dc=xinniu,dc=com -W 输入之前配置OpenLDAP的密码后,即可完成创建LDAP根节点,如下图所示:
image.png

完成以上操作后,再回到phpldapadmin页面,可以看到,已经正常出现了根节点,并可以创建相关OU、Group、Account等对象,如下图所示:

image.png

到这里就搭建好了一台openldap+phpldapadmin的服务器了,在另外一台也按照此步骤操作搭建好另一台。

三.配置双主复制功能,在主1和主2上执行下面的步骤

ldap双主复制功能的实现依赖于syncprov模块,这个模块位于/usr/lib64/openldap目录下

1.mod_syncprov.ldif

  1. [root@server1] vim mod_syncprov.ldif
  2. # create new
  3. dn: cn=module,cn=config
  4. objectClass: olcModuleList
  5. cn: module
  6. olcModulePath: /usr/lib64/openldap
  7. olcModuleLoad: syncprov.la

导入配置

[root@server1 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif

2.syncprov.ldif

  1. [root@server1] vim syncprov.ldif
  2. # create new
  3. dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
  4. objectClass: olcOverlayConfig
  5. objectClass: olcSyncProvConfig
  6. olcOverlay: syncprov
  7. olcSpSessionLog: 100

导入配置

[root@server1 ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif

在主1和主2上执行下面的步骤,只需要替换olcServerID和provider的值

3.生成集群配置文件

  1. [root@server1] ~/ldif$ vim master01.ldif
  2. # create new
  3. dn: cn=config
  4. changetype: modify
  5. replace: olcServerID
  6. # specify uniq ID number on each server
  7. olcServerID: 1
  8. # 唯一值,主2上替换为2
  9. dn: olcDatabase={2}hdb,cn=config
  10. changetype: modify
  11. add: olcSyncRepl
  12. olcSyncRepl: rid=001
  13. provider=ldap://basic-server-2:389/
  14. ##此处为主2服务器地址,主2此处相应地上替换为主1服务器地址
  15. bindmethod=simple
  16. binddn="cn=admin,dc=xinniu,dc=com"
  17. credentials=bigdata123!
  18. #管理员的明文密码
  19. searchbase="dc=xinniu,dc=com"
  20. scope=sub
  21. schemachecking=on
  22. type=refreshAndPersist
  23. retry="30 5 300 3"
  24. interval=00:00:05:00
  25. -
  26. add: olcMirrorMode
  27. olcMirrorMode: TRUE
  28. dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
  29. changetype: add
  30. objectClass: olcOverlayConfig
  31. objectClass: olcSyncProvConfig
  32. olcOverlay: syncprov

导入配置

root@SERVER ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f master01.ldif

四.验证

这部完成之后,我们在master1的管理界面上创建一个条目,再打开master2的管理界面,如果可以看到我们刚才创建的条目,那么就说明双主已经配置成功了。

1.安装

两个节点都要操作
yum -y install keepalived
很简单,一条命令就安装好了

2.配置

#两个节点都要操作
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf
#node1的配置:

  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. xhh@cmss.chinamobile.com
  5. }
  6. notification_email_from root@cmss.chinamobile.com
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id ldap_A #节点标识
  10. }
  11. vrrp_script chk {
  12. script "/etc/keepalived/script/check-ldap-server.sh"
  13. interval 3
  14. weight -5
  15. }
  16. vrrp_instance VI_1 {
  17. state MASTER
  18. interface eth0 #使用的网卡为eth0
  19. virtual_router_id 150 #虚拟路由标识,两个节点必须一致
  20. priority 100 #优先级,两个节点的优先级高者为master
  21. nopreempt #不抢占
  22. advert_int 1
  23. authentication {
  24. auth_type PASS
  25. auth_pass 1111
  26. }
  27. virtual_ipaddress {
  28. 172.18.22.88 #虚拟ip
  29. }
  30. notify_master "/etc/keepalived/script/to_master.sh"
  31. notify_backup "/etc/keepalived/script/to_backup.sh"
  32. notify_stop "/etc/keepalived/script/to_stop.sh"
  33. track_script {
  34. chk
  35. }
  36. }

#node2的配置

  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. xhh@cmss.chinamobile.com
  5. }
  6. notification_email_from root@cmss.chinamobile.com
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id ldap_B #节点标识
  10. }
  11. vrrp_script chk {
  12. script "/etc/keepalived/script/check-ldap-server.sh >> /tmp/log/chk.log 2>&1"
  13. interval 3
  14. weight -5
  15. }
  16. vrrp_instance VI_1 {
  17. state BACKUP
  18. interface eth0 #使用的网卡为eth0
  19. virtual_router_id 150 #虚拟路由标识,两个节点必须一致
  20. priority 98 #优先级
  21. nopreempt #不抢占
  22. advert_int 1
  23. authentication {
  24. auth_type PASS
  25. auth_pass 1111
  26. }
  27. virtual_ipaddress {
  28. 172.18.22.88
  29. }
  30. notify_master "/etc/keepalived/script/to_master.sh"
  31. notify_backup "/etc/keepalived/script/to_backup.sh"
  32. notify_stop "/etc/keepalived/script/to_stop.sh"
  33. track_script {
  34. chk
  35. }
  36. }

另外几个脚本的内容(两个节点一致)
check-ldap-server.sh:

  1. #!/bin/bash
  2. counter=$(ps -C slapd --no-heading|wc -l)
  3. if [ "${counter}" = "0" ]; then
  4. sudo systemctl start slapd
  5. sleep 2
  6. counter=$(ps -C slapd --no-heading|wc -l)
  7. if [ "${counter}" = "0" ]; then
  8. sudo systemctl stop keepalived
  9. fi
  10. fi

/etc/keepalived/script/to_master.sh:

  1. #!/bin/bash
  2. sudo systemctl start slapd;
  3. sh /etc/keepalived/script/send_email.sh "Ldap主备切换" "$(hostname)切换为Active"

/etc/keepalived/script/to_backup.sh:

  1. #!/bin/bash
  2. sudo systemctl start slapd;
  3. sh /etc/keepalived/script/send_email.sh "Ldap主备切换" "$(hostname)切换为Backup"

/etc/keepalived/script/to_stop.sh:

  1. #!/bin/bash
  2. sh /etc/keepalived/script/send_email.sh "Ldap主备切换" "$(hostname)切换为Stop"

/etc/keepalived/script/send_email.sh:

  1. #!/bin/bash
  2. SUBJECT=$1
  3. CONTENT=$2
  4. echo "${CONTENT}" | mail -s "${SUBJECT}" dongguashaorou@163.com

有一点需要注意,以上这几个脚本,需要一个用户来执行:keepalived_script,所以需要创建这个用户,还要把这个用户加到/etc/sudoers中,否则脚本中systemctl启动slapd服务,压根没有权限,这个点网上的文档都没有提到,调试了一段时间才发现这个问题。其他的,如果发现脚本配置以后没有生效,那么1.检查keepalived.conf文件的格式,看是否出错,2.脚本的输出可以重定向到文件,然后可以发现问题。

前两天搭建好了,今天开启iptables防火墙后就有问题了:
1.两个节点的虚拟ip不能飘移了,发生了脑裂,两边都有虚拟ip
2.其他节点可以从真实ip访问服务,但是无法从虚拟ip访问服务
折腾一番后发现要在2台真实节点的iptables配置(/etc/sysconfig/iptables)上面分别加上下面2行
-A INPUT -d 172.18.22.88(虚拟ip) -j ACCEPT
-A INPUT -p vrrp -j ACCEPT
之后重启iptables,再重启keepalived即可访问服务
最后,后面发现阿里云的机器上面用这个keepalive真的不太好使,很多节点上去telnet虚拟ip的端口会出现不通的情况,就不打算用了,ldap的访问量很小,是个比较稳定的服务,本来为了以防万一,再引入新的问题还不如不用,最终还是用了haproxy去做了个load balance,比这个还简单多了。不过实际上keepalived和haproxy并不是一个用途的东西,只是我觉得服务也没那么容易挂,最可靠的方案其实是,haproxy和keepalived都用上,用keepalived去监控haproxy。
附上一下haproxy的部分配置
listen ldap :25001
mode tcp
option tcplog
balance leastconn
server ldap1 172.18.20.27:389 check
server ldap2 172.18.20.35:389 check