本文介绍了完整搭建OpenLDAP服务器的全过程,包含主从模式、主主模式等。

1. 环境介绍

  • 系统软件版本
软件版本
CentOS7.7
OpenLDAP2.4.44
  • 主机
角色IP
Master/Node01172.16.0.220
Slave/Node02172.16.0.221

2. 环境初始化

初始化系统环境,如下:

ntpdate -u ntp1.aliyun.com
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld

3. 安装OpenLDAP

​​‌‌​​​‌‌​‌​​‌‌‍​‌​‌‌‌​​‌‌‌‌​‌​‍​‌​​‌​​​‌​​​‌‌​‍​‌​‌‌​​​‌‌​​​​​‍​​‌​‌‌‌‌‌‌‌‌​​​‍​‌‌​​‌‌‌​‌‌​​‌‌‌‍​‌‌​​​‌‌‌​​​‌​‌‍​​‌‌‌‌‌‌‌‌​​‌‌‍​‌​​‌​​​‌‌‌​​‌‌‍​​‌‌​‌​‌​​​‌​‌‌‍​​‌‌​‌‌‌‌​‌​​‌​‍​‌​​​​‌​​​​​‌​‌‍‌​‌‌​​​​‍‌​​​‌‌‌‌‍‌​​‌‌​‌​‍‌​​‌​​​‌‍‌​‌‌​​‌‌‍‌​‌‌‌​‌‌‍‌​‌‌‌‌‌​‍‌​‌​‌‌‌‌‍​​‌‌​​​‌‌‌‌​​‌​‍​‌​‌‌​‌​‌​‌‌‌‌​‍​‌​‌​​‌‌​​‌​‌‌‌‍​‌​​‌​​​‌‌​​​​‌‍​‌‌‌​​‌​​​​​‌​‌​‍​​‌‌‌‌‌‌‌‌​​‌​‍​​​​​​​​‌‌‌‌​​‌‌‍​​​‌​‌​‌‌​​‌‌‌​‍‌​​‌‌‌‌​‍‌​​‌‌​‌‌‍‌​​‌​​‌​‍‌​​‌​‌‌​‍‌​​‌​​​‌‍​‌‌​​​‌​‌‌‌​​​‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​​‌‌​‌‍‌‌​​‌‌‌‌‍‌‌​‌​​‌​‍‌‌​​‌‌‌‌‍‌‌​​‌‌​​‍‌‌​‌​​‌​‍‌‌​​‌‌​‌‍‌‌​​​‌‌‌‍​‌​‌‌​‌‌‌‌​​‌​​‍​‌‌​​​​‌​‌​​​‌‌‍​​​​​​​​‌‌‌‌​​‌‌‍​‌​‌‌​​​‌‌​​​​​‍​​‌‌​‌​​‌‌‌‌​​​‍​‌​‌​​​‌‌​​‌‌‌‌‍​‌​‌​​​‌​‌‌‌‌‌‌‍​​​​​​​​‌‌‌​​‌​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​​‌​‌‌‍‌​​​‌‌‌‌‍‌‌​​​‌​‌‍‌​‌​​​‌‌‍‌​‌​​​‌‌‍‌​​​‌​​​‍‌​​​‌​​​‍‌​​​‌​​​‍‌‌​‌​​​‌‍‌​​‌​‌‌​‍‌​​‌​‌​​‍‌​​‌​‌‌​‍‌​​​‌​​​‍‌​​‌​‌‌​‍‌‌​‌​​​‌‍‌​​‌​​‌​‍‌​​‌‌​‌​‍‌​‌​​​‌‌‍‌​​‌‌‌‌​‍‌​​​‌‌​‌‍‌​​‌‌‌​​‍‌​​‌​‌‌‌‍‌​​‌​‌‌​‍‌​​​‌​​‌‍‌​​‌‌​‌​‍‌​​​‌‌​​‍‌​‌​​​‌‌‍‌‌​​‌​​‌‍‌‌​​‌​‌​‍‌‌​​​‌‌​‍‌‌​‌​​​‌‍‌​​‌​‌‌‌‍‌​​​‌​‌‌‍‌​​‌​​‌​‍‌​​‌​​‌‌

首先在Master节点上完成安装过程。

  • 安装软件包
yum install -y openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtools
  • 查看已安装的包
rpm -qa |grep openldap

4. 配置OpenLDAP

从OpenLDAP2.4.23版本开始所有配置数据都保存在/etc/openldap/slapd.d/中,建议不再使用slapd.conf作为配置文件。

配置文件介绍:

文件名作用
/etc/openldap/slapd.confOpenLDAP的主配置文件
/etc/openldap/slapd.d/slapd.conf配置信息生成的文件
/etc/openldap/schema/schema所在目录
/var/lib/ldap/OpenLDAP的数据文件
/usr/share/openldap-servers/slapd.conf.obsolete模板配置文件
/usr/share/openldap-servers/DB_CONFIG.example模板数据库配置文件

4.1 初始化配置文件

cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf

4.2 配置管理员密码

不能直接修改/etc/openldap/slapd.d/目录下的配置,需要通过新建文件模版命令去动态修改ldap现有配置,如下:

  • 执行下面命令设置密码,会生成一串加密过的字符,记下来
$ slappasswd -s 123456
{SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE
  • 新增修改密码文件
cd ~
cat>changepwd.ldif<<'EOF'
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE
EOF
  • 执行命令修改配置
ldapadd -Y EXTERNAL -H ldapi:/// -f changepwd.ldif

4.3 配置域名

cd ~
cat>changedomain.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=admin,dc=jiagouyun,dc=com" read by * none
 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=jiagouyun,dc=com
 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=jiagouyun,dc=com
 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}LSgYPTUW4zjGtIVtuZ8cRUqqFRv1tWpE
 
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=jiagouyun,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=jiagouyun,dc=com" write by * read

EOF
  • 执行命令,修改配置
ldapmodify -Y EXTERNAL -H ldapi:/// -f changedomain.ldif
  • 验证基本配置,重启服务
slaptest -u
systemctl enable slapd
systemctl restart slapd
systemctl status slapd

4.4 配置数据库

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap -R /var/lib/ldap
chmod 700 -R /var/lib/ldap
ls -l /var/lib/ldap/

4.5 导入基本Schema

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
  • 重启服务
chown -R ldap.ldap /etc/openldap/slapd.d/
systemctl restart slapd

4.6 新增用户组和用户

默认情况下,openldap只有一个管理员用户,需要手动创建普通用户和用户组。现在创建一个叫做 jiagouyun company 的组织,并在其下创建一个 admin 的组织角色(该组织角色内的用户具有管理整个 LDAP 的权限),以及People 和 Group 两个组织单元:

cd ~
cat>base.ldif<<'EOF'
dn: dc=jiagouyun,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: jiagouyun Company
dc: jiagouyun
 
dn: cn=admin,dc=jiagouyun,dc=com
objectClass: organizationalRole
cn: admin
 
dn: ou=People,dc=jiagouyun,dc=com
objectClass: organizationalUnit
ou: People
 
dn: ou=Group,dc=jiagouyun,dc=com
objectClass: organizationalRole
cn: Group

EOF

# 执行命令,添加配置
ldapadd -x -D cn=admin,dc=jiagouyun,dc=com -W -f base.ldif

至此 ,我们就设置好了一个 LDAP 目录树:其中基准dc=jiagouyun,dc=com 是该树的根节点,其下有一个管理域 cn=admin,dc=jiagouyun,dc=com 和两个组织单元 ou=People,dc=jiagouyun,dc=comou=Group,dc=jiagouyun,dc=com

4.7 开启日志访问功能

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
  • 修改rsyslog配置文件
cat>>/etc/rsyslog.conf<<'EOF'

local4.* /var/log/slapd.log

EOF

systemctl restart rsyslog
  • 查看日志
tail -f /var/log/slapd.log

5. 配置主从模式

Master节点安装完成后,在Slave节点上完成4.1~4.5步(不需要导入普通用户组信息)。

5.1 Master端增加主从模式配置文件

  • 同步模块mod_syncprov.ldif
cd ~
cat>mod_syncprov.ldif<<'EOF'
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib64/openldap
olcModuleLoad: syncprov.la

dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionLog: 100
EOF

# 执行命令,添加配置
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif

5.2 Slave端增加主从模式配置文件

  • 主从复制模块配置syncrepl.ldif
cd ~
cat>syncrepl.ldif<<'EOF'
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
  provider=ldap://172.16.0.220:389/   #这里填写master的地址
  bindmethod=simple
  binddn="cn=admin,dc=jiagouyun,dc=com"
  credentials="xxxxxx"
  searchbase="dc=jiagouyun,dc=com"
  scope=sub
  schemachecking=off
  type=refreshAndPersist
  retry="60 +"
  attrs="*,+"
  interval=00:00:00:10
EOF

# 执行命令,添加配置
ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif

5.3 验证主从配置是否生效

slave节点配置好后,无需重启两端的slapd服务,分别在两台机器上查看日志,检查同步 是否已经生效。

tail -f /var/log/slapd.log

也可以用ldapadmin工具验证,此处不再叙述。

6. 配置主主模式

OpenLDAP在主从模式下,如果master节点挂掉,还是需要手动去修改配置才能正常提供服务,并不能做到真正的高可用。更好的方式是做双主复制,前端接入负载均衡后,任意一台节点挂掉都不会影响整个服务的正常使用。

6.1 Node01增加主主模式配置文件

  • 同步模块syncprov.ldif
cd ~
cat>syncprov.ldif<<'EOF'
dn: cn=module{2},cn=config
cn: module
objectclass: olcModuleList
olcmoduleload: syncprov.la
olcmodulepath: /usr/lib64/openldap

dn: olcOverlay={2}syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcSyncProvConfig
objectClass: olcOverlayConfig
olcOverlay: {2}syncprov
olcSpSessionLog: 100
EOF

# 执行命令,添加配置
ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
  • 主主复制模块配置syncrepl001.ldif
cat>syncrepl001.ldif<<'EOF'
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl:
  rid=001
  provider=ldap://172.16.0.221:389/        # 这里配置node002的地址 
  binddn="cn=admin,dc=jiagouyun,dc=com"
  bindmethod=simple
  credentials="xxxxxx"
  searchbase="dc=jiagouyun,dc=com"
  type=refreshAndPersist
  interval=00:00:00:10
  scope=sub
  schemachecking=off
  attrs="*,+"             
  retry="60 +"             
-
add: olcMirrorMode
olcMirrorMode: TRUE
EOF

# 执行命令,添加配置
ldapadd -Y EXTERNAL -H ldapi:/// -f syncrepl001.ldif

6.2 Node02端增加主主模式配置文件

  • 同步模块syncprov.ldif
cd ~
cat>syncprov.ldif<<'EOF'
dn: cn=module{2},cn=config
cn: module
objectclass: olcModuleList
olcmoduleload: syncprov.la
olcmodulepath: /usr/lib64/openldap

dn: olcOverlay={2}syncprov,olcDatabase={2}hdb,cn=config
objectClass: olcConfig
objectClass: olcSyncProvConfig
objectClass: olcOverlayConfig
olcOverlay: {2}syncprov
olcSpSessionLog: 100
EOF

# 执行命令,添加配置
ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
  • 主主复制模块syncrepl002.ldif
cat>syncrepl002.ldif<<'EOF'
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 2

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl:
  rid=001
  provider=ldap://172.16.0.220:389/   # 这里配置node001的地址 
  binddn="cn=admin,dc=jiagouyun,dc=com"
  bindmethod=simple
  credentials="xxxxxx"
  searchbase="dc=jiagouyun,dc=com"
  type=refreshAndPersist
  interval=00:00:00:10
  scope=sub
  schemachecking=off
  attrs="*,+"             
  retry="60 +"             
-
add: olcMirrorMode
olcMirrorMode: TRUE
EOF

# 执行命令,添加配置
ldapadd -Y EXTERNAL -H ldapi:/// -f syncrepl002.ldif

6.3 验证主主配置是否生效

使用ldapadmin工具连接分别连接到ldap节点服务器,在一台上创建用户,看另一台用户信息是否同步。