# 主节点配置:basedomain.ldif、chdomain.ldif、chrootpw.ldif、ldapuser.ldif(用户及用户组)、loglevel.ldif(配置日志)
# 从节点配置:chdomain.ldif、chrootpw.ldif、loglevel.ldif(导入基础数据库、导入用户、导入用户组和用户加入到用户组都不需要)

1.配置openLDAP
1.1 安装并启动ldap
# 可以根据需要选择是否安装迁移工具 migrationtools:
yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtools
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap. /var/lib/ldap/DB_CONFIG
chown ldap:ldap -R /var/lib/ldap
chmod 700 -R /var/lib/ldap
systemctl start slapd 
systemctl enable slapd

# 查看端口使用情况:
# 默认情况下, slapd 用户会占用 389 端口。  
netstat -tlnp | grep slapd
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      227/slapd           
tcp6       0      0 :::389                  :::*                    LISTEN      227/slapd

1.2 设置 OpenLDAP 的管理员密码
# 首先要生成经处理后的明文密码: 
slappasswd
New password: 
Re-enter new password: 
{SSHA}hnm8WDAp0mn2HgN26h6ZdbzFVtFATQhG

# 其中{SSHA}xxxxxxxxxxxxxxxxxxxxxxxx就是加密处理后的明文密码,之后会用到这个密码。 
# 新建chrootpw.ldif文件(注意:ldif格式非常严格,行首行位均不能出现空格): 
cat > chrootpw.ldif << EOF
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}hnm8WDAp0mn2HgN26h6ZdbzFVtFATQhG
EOF

# 导入该文件: 
ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif

1.3 导入基本 Schema(可以有选择的导入) 
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/cosine.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/nis.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f /etc/openldap/schema/inetorgperson.ldif

1.4 设置自己的 Domain Name
# 新建chdomain.ldif文件:
# 文件内容如下,使用自己的域名替换掉文中所有的 "dc=***,dc=***",并且使用chrootpw.ldif文件中的密码,替换文中的 "olcRootPW" 部分:  
cat > chdomain.ldif << EOF
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=root,dc=example,dc=com" read by * none

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=root,dc=example,dc=com

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}f+8HYXQoEnCF5TEuAAXB9Kdy3fWyvn7K

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=root,dc=example,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=root,dc=example,dc=com" write by * read
EOF

# 导入该文件: 
ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif  

# 新建basedomain.ldif文件: 
# 文件内容如下,使用自己的域名替换掉文件中所有的 "dc=***,dc=***": 
cat > basedomain.ldif << EOF
dn: dc=example,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: Server World
dc: example

dn: cn=root,dc=example,dc=com
objectClass: organizationalRole
cn: root
description: Directory Manager

dn: ou=People,dc=example,dc=com
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=example,dc=com
objectClass: organizationalUnit
ou: Group
EOF

# 导入该文件: 
ldapadd -x -D cn=root,dc=example,dc=com -W -f basedomain.ldif

1.5 允许防火墙访问 LDAP 服务
# 开启 389/TCP 端口(根据你自己的防火墙进行设置): 
# 若使用的是 firewall,修改方法如下: 
firewall-cmd --add-service=ldap --permanent 
success
firewall-cmd --reload 
success

# 若使用的是 iptables,修改方法如下: 
echo "-A INPUT -p tcp -m state --state NEW -m tcp --dport 389 -j ACCEPT" >> /etc/sysconfig/iptables
echo "-A INPUT -p tcp -m state --state NEW -m tcp --dport 389 -j ACCEPT" >> /etc/sysconfig/ip6tables
systemctl restart iptables
systemctl restart ip6tables

1.6 开启openldap日志功能
cat > /root/loglevel.ldif << EOF
dn: cn=config
changetype: modify
replace: olcLogLevel
olcLogLevel: stats
EOF

ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/loglevel.ldif
systemctl restart slapd

cat >> /etc/rsyslog.conf << EOF
local4.* /var/log/slapd.log
EOF

systemctl restart rsyslog

# OpenLDAP Server 中添加用户

1.7 添加用户
# 首先要生成经处理后的明文密码: 
slappasswd
New password: 
Re-enter new password: 
{SSHA}8TEZlcfO0LLcnby7zDGYkNdd2fiysP4X

# 新建文件: 
# 文件内容如下,使用自己的域名替换掉文件中所有的 "dc=***,dc=***",并且使用刚刚生成的密码,替换文中的 "userPassword" 部分: 
cat > ldapuser.ldif << EOF
dn: uid=ldapuser01,ou=People,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: ldapuser01
sn: Linux
userPassword: {SSHA}8TEZlcfO0LLcnby7zDGYkNdd2fiysP4X
loginShell: /bin/bash
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/ldapuser01

dn: cn=ldapuser01,ou=Group,dc=example,dc=com
objectClass: posixGroup
cn: ldapuser01
gidNumber: 1000
memberUid: ldapuser01
EOF

# 导入该文件:
ldapadd -x -D cn=root,dc=example,dc=com -W -f ldapuser.ldif  

1.8 删除 LDAP 用户或组
# 删除用户: 
ldapdelete -x -W -D 'cn=root,dc=example,dc=com' "uid=ldapuser01,ou=People,dc=example,dc=com"

# 删除组: 
ldapdelete -x -W -D 'cn=root,dc=example,dc=com' "cn=ldapuser01,ou=Group,dc=example,dc=com"

2.配置主从
2.1 主从服务器配置(主从服务器都需要配置)
cat > syncprov_mod.ldif << EOF
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la
EOF

ldapadd -Y EXTERNAL -H ldapi:/// -f /root/syncprov_mod.ldif

cat > syncprov.ldif << EOF
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpSessionLog: 100
EOF

ldapadd -Y EXTERNAL -H ldapi:/// -f /root/syncprov.ldif

2.2 主节点(主节点olcServerID配置为0,从节点为1开始)
cat > rp.ldif << EOF
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 0

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=100  
  #同步进程号
  provider=ldap://172.18.0.253:389 
  #从节点ldap的ip加端口
  bindmethod=simple
  #简单的认证方式
  binddn=" cn=root,dc=example,dc=com"
  #管理员明文密码
  credentials=123456
  searchbase=" dc=example,dc=com"
  filter="(objectClass=*)"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry=” 5 5 300 3″
  attrs=” *,+”
  interval=00:00:05:00
-
add: olcMirrorMode
olcMirrorMode: TRUE

-
add: olcDbIndex
olcDbIndex: entryUUID eq
-
add: olcDbIndex
olcDbIndex: entryCSN eq

dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
EOF

ldapadd -Y EXTERNAL -H ldapi:/// -f /root/rp.ldif

2.3 从节点01
cat > rp.ldif << EOF
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSyncRepl
olcSyncRepl: rid=100 
  provider=ldap://172.18.0.230:389
  bindmethod=simple
  binddn=" cn=root,dc=example,dc=com"
  credentials=123456
  searchbase=" dc=example,dc=com"
  filter="(objectClass=*)"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="60 +″
  attrs=” *,+”
  interval=00:00:00:10

-
add: olcMirrorMode
olcMirrorMode: TRUE

-
add: olcDbIndex
olcDbIndex: entryUUID eq
-
add: olcDbIndex
olcDbIndex: entryCSN eq

dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
EOF

ldapadd -Y EXTERNAL -H ldapi:/// -f /root/rp.ldif

2.4 从节点02(改变进程号rid的值即可配置其他的从节点)
cat > rp.ldif << EOF
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 2

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSyncRepl
olcSyncRepl: rid=123
  provider=ldap://172.18.0.230:389
  bindmethod=simple
  binddn=" cn=root,dc=example,dc=com"
  credentials=123456
  searchbase=" dc=example,dc=com"
  filter="(objectClass=*)"
  scope=sub
  schemachecking=on
  type=refreshAndPersist
  retry="60 +″
  attrs=” *,+”
  interval=00:00:00:10
-
add: olcMirrorMode
olcMirrorMode: TRUE

-
add: olcDbIndex
olcDbIndex: entryUUID eq
-
add: olcDbIndex
olcDbIndex: entryCSN eq

-
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
EOF

ldapadd -Y EXTERNAL -H ldapi:/// -f /root/rp.ldif