第一種方法:使用命令安裝OpenLDAP:
yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtools
查看OpenLDAP版本,使用如下命令:
slapd -VV

到這里OpenLDAP基本安裝完畢,接下來就是開始配置OpenLDAP
四、OpenLDAP配置
PS: OpenLDAP2.4.23版本開始所有配置數據都保存在/etc/openldap/slapd.d/,看了很多博客都是使用slapd.conf作為配置文件,而且很多博客內容都已經過時,所以沒有一個好的文檔真的會踩很多坑,在此記錄一下
4.0 配置OpenLDAP管理員密碼
設置OpenLDAP的管理員密碼:
slappasswd -s [password]

密碼設置好了之后呢,保存好,下面會使用到。
4.1 修改olcDatabase={2}hdb.ldif文件
修改olcDatabase={2}hdb.ldif文件,對於該文件增加一行
olcRootPW: {SSHA}dXgO/Ipy5SQiKFZ0u7m79Xo7uzKIr038,然后修改域信息:
olcSuffix: dc=teracloud2,dc=cn
olcRootDN: cn=admin,dc=teracloud2,dc=cn
注意:其中cn=admin中的admin表示OpenLDAP管理員的用戶名,dc為ldap的服務器域名,導出而olcRootPW表示OpenLDAP管理員的密碼。
實際修改如下:
vim /etc/openldap/slapd.d/cn=config/olcDatabase\=\{2\}hdb.ldif
olcSuffix: dc=teracloud2,dc=cn
olcRootDN: cn=admin,dc=teracloud2,dc=cn
olcRootPW: {SSHA}dXgO/Ipy5SQiKFZ0u7m79Xo7uzKIr038
4.2 修改olcDatabase={1}monitor.ldif文件
修改olcDatabase={1}monitor.ldif文件,如下:
vim /etc/openldap/slapd.d/cn=config/olcDatabase\=\{1\}monitor.ldif
olcAccess: {0}to * by dn.base=”gidNumber=0+uidNumber=0,cn=peercred,cn=extern
al,cn=auth” read by dn.base=”cn=admin,dc=teracloud2,dc=cn” read by * none
驗證OpenLDAP的基本配置是否正確,使用如下命令:
slaptest -u

通過結果看出我們的配置是沒有問題的
4.3啟動OpenLDAP服務,
使用如下命令:
//開始ldap
systemctl enable slapd
//啟動ldap
systemctl start slapd
//查看ldap的狀態
systemctl status slapd
4.4 配置OpenLDAP數據庫
OpenLDAP默認使用的數據庫是BerkeleyDB,現在來開始配置OpenLDAP數據庫,使用如下命令:
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
ll /var/lib/ldap/
注意:/var/lib/ldap/就是BerkeleyDB數據庫默認存儲的路徑。


4.5 導入基本Schema
導入基本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
注意:如果這一步導入失敗,一般都是密碼輸入錯誤,密碼要輸上面配置的加密前的密碼
4.6創建基本的用戶節點,數據庫管理員
dn: dc=teracloud2,dc=cn
objectClass: top
objectClass: dcObject
objectclass: organization
o: Example Inc.
dc: teracloud2
dn: ou=Users,dc=teracloud2,dc=cn
objectClass: organizationalUnit
ou: Users
dn: ou=group,dc=teracloud2,dc=cn
objectClass: organizationalUnit
ou: group
dn: cn=admin,dc=teracloud2,dc=cn
objectClass: organizationalRole
cn: admin
description: Directory Administrator
ldapadd -x -D cn=admin,dc=teracloud2,dc=cn-W -f basedomain.ldif
[root@VM_0_15_centos myself]# ldapadd -x -D cn=admin,dc=teracloud2,dc=cn-W -f basedomain.ldif
Enter LDAP Password:
adding new entry “dc=teracloud2,dc=cn”
adding new entry “ou=people,dc=teracloud2,dc=cn”
adding new entry “ou=group,dc=teracloud2,dc=cn”
adding new entry “cn=admin,dc=teracloud2,dc=cn”
注意:后面的日志可以不用配置的,假如配置了,需要重新安裝的話,需要把下面重啟的內容關閉,並且需要刪除/etc/openldap/*和/var/lib/ldap/*的文件。
五、配置日志
[root@VM_0_15_centos myself]# vim log.ldif
[root@VM_0_15_centos myself]# cat log.ldif
dn: cn=config
changetype: modify
add: olcLogLevel
olcLogLevel: 32
"log.ldif" [New] 4L, 66C written
[root@VM_0_15_centos myself]# ldapmodify -Y EXTERNAL -H ldapi:/// -f log.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
[root@VM_0_15_centos myself]# mkdir -p /var/log/slapd
[root@VM_0_15_centos myself]# chown ldap:ldap /var/log/slapd/
[root@VM_0_15_centos myself]# echo "local4.* /var/log/slapd/slapd.log" >> /etc/rsyslog.conf
[root@VM_0_15_centos myself]# systemctl restart rsyslog
[root@VM_0_15_centos myself]# systemctl restart slapd
[root@VM_0_15_centos myself]# tail -n 4 /var/log/slapd/slapd.log
Sep 5 20:43:31 VM_0_15_centos slapd[4520]: => test_filter
Sep 5 20:43:31 VM_0_15_centos slapd[4520]: PRESENT
Sep 5 20:43:31 VM_0_15_centos slapd[4520]: <= test_filter 6
Sep 5 20:43:31 VM_0_15_centos slapd[4523]: slapd starting
六、工具連接
圖形操作界面有很多種,包括ldapadmin、ldapadmin.exe,當然還有其他的,這個步驟比較簡單,就不詳細講解了。

七、遇到的錯誤
查看ldap的狀態,發現無法啟動


查看日志發現,有個和證書相關的錯誤
could not use certificate openLDAP server’,
查看下目錄發現沒有證書的,目錄

把證書拷貝過去,啟動,問題解決

第二種方法:
參考地址:https://lework.github.io/2019/07/18/ldap-install/
OpenLDAP是一款輕量級目錄訪問協議(Lightweight Directory Access Protocol,LDAP),屬於開源集中賬號管理架構的實現,且支持眾多系統版本,被廣大互聯網公司所采用。openldap-server的數據必須用原配的Berkeley DB,不能使用mysql作為后端數據庫。
phpldapadmin是使用php語言開發的web端管理ldap的應用。
Self Service Password是一個Web應用,可以讓用戶自行更新、修改和重置LDAP中的用戶密碼。支持標准的LDAPv3目錄服務,包括:OpenLDAP,Active Directory,OpenDS,ApacheDS等。
系統環境
os: CentOS Linux release 7.4.1708
關閉selinux和防火牆
setenforce 0
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config systemctl disable firewalld.service && systemctl stop firewalld.service systemctl stop NetworkManager && systemctl disable NetworkManager
更換系統源
sed -e 's!^#baseurl=!baseurl=!g' \ -e 's!^mirrorlist=!#mirrorlist=!g' \ -e 's!mirror.centos.org!mirrors.ustc.edu.cn!g' \ -i /etc/yum.repos.d/CentOS-Base.repo yum install -y epel-release sed -e 's!^mirrorlist=!#mirrorlist=!g' \ -e 's!^#baseurl=!baseurl=!g' \ -e 's!^metalink!#metalink!g' \ -e 's!//download\.fedoraproject\.org/pub!//mirrors.ustc.edu.cn!g' \ -e 's!http://mirrors\.ustc!https://mirrors.ustc!g' \ -i /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel-testing.repo
同步時間
yum install -y ntpdate ntp ntpdate 0.cn.pool.ntp.org hwclock --systohc cat <<EOF>> /etc/ntp.conf driftfile /var/lib/ntp/drift server 0.cn.pool.ntp.org server 1.cn.pool.ntp.org server 2.cn.pool.ntp.org server 3.cn.pool.ntp.org EOF systemctl enable ntpd && systemctl start ntpd ntpq -p
安裝OpenLDAP
yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtools
查看OpenLDAP版本
slapd -VV
@(#) $OpenLDAP: slapd 2.4.44 (Jan 29 2019 17:42:45) $
mockbuild@x86-01.bsys.centos.org:/builddir/build/BUILD/openldap-2.4.44/openldap-2.4.44/servers/slapd
OpenLDAP的相關配置文件信息
- /etc/openldap/slapd.conf:OpenLDAP的主配置文件,記錄根域信息,管理員名稱,密碼,日志,權限等
- /etc/openldap/slapd.d/*:這下面是/etc/openldap/slapd.conf配置信息生成的文件,每修改一次配置信息,這里的東西就要重新生成
- /etc/openldap/schema/*:OpenLDAP的schema存放的地方
- /var/lib/ldap/*:OpenLDAP的數據文件
- /usr/share/openldap-servers/DB_CONFIG.example 模板數據庫配置文件
OpenLDAP監聽的端口:
- 默認監聽端口:389(明文數據傳輸)
- 加密監聽端口:636(密文數據傳輸)
配置OpenLDAP
配置OpenLDAP數據庫
OpenLDAP默認使用的數據庫是BerkeleyDB,現在來開始配置OpenLDAP數據庫,使用如下命令:
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
修改配置文件
生成ldap管理員密碼
slappasswd -s 123456
{SSHA}DyaM9C7Q4cmcq0DNNsry5ObaeShv8hIa
修改olcDatabase={2}hdb.ldif文件
vim /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{2\}hdb.ldif olcSuffix: dc=lework,dc=com olcRootDN: cn=Manager,dc=lework,dc=com olcRootPW: {SSHA}DyaM9C7Q4cmcq0DNNsry5ObaeShv8hIa
注意:其中cn=Manager中的Manager表示OpenLDAP管理員的用戶名,dc是我們的組織信息,而olcRootPW表示OpenLDAP管理員的密碼,用剛才我們生成的密碼。
修改olcDatabase={1}monitor.ldif文件
vim /etc/openldap/slapd.d/cn\=config/olcDatabase\=\{1\}monitor.ldif olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=extern al,cn=auth" read by dn.base="cn=Manager,dc=lework,dc=com" read by * none
注意:該修改中的dn.base是修改OpenLDAP的管理員的相關信息的。
驗證OpenLDAP的基本配置
slaptest -u 5d30769d ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={1}monitor.ldif" 5d30769d ldif_read_file: checksum error on "/etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif" config file testing succeeded
校驗error請忽略
修改ldap文件權限
chown -R ldap:ldap /var/lib/ldap/ chown -R ldap:ldap /etc/openldap/
啟動OpenLDAP
systemctl enable --now slapd systemctl status slapd.service ● slapd.service - OpenLDAP Server Daemon Loaded: loaded (/usr/lib/systemd/system/slapd.service; enabled; vendor preset: disabled) Active: active (running) since 四 2019-07-18 21:44:29 CST; 12s ago Docs: man:slapd man:slapd-config man:slapd-hdb man:slapd-mdb file:///usr/share/doc/openldap-servers/guide.html Process: 1770 ExecStart=/usr/sbin/slapd -u ldap -h ${SLAPD_URLS} $SLAPD_OPTIONS (code=exited, status=0/SUCCESS) Process: 1748 ExecStartPre=/usr/libexec/openldap/check-config.sh (code=exited, status=0/SUCCESS) Main PID: 1773 (slapd) Memory: 14.7M CGroup: /system.slice/slapd.service └─1773 /usr/sbin/slapd -u ldap -h ldapi:/// ldap:/// ss -natup | grep 389 tcp LISTEN 0 128 *:389 *:* users:(("slapd",pid=1773,fd=8)) tcp LISTEN 0 128 :::389 :::* users:(("slapd",pid=1773,fd=9))
導入Schema
導入基本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
修改migrate_common.ph文件
migrate_common.ph文件主要是用於生成ldif文件使用,修改migrate_common.ph文件,如下:
vim /usr/share/migrationtools/migrate_common.ph +71
# Default DNS domain $DEFAULT_MAIL_DOMAIN = "lework.com"; # Default base $DEFAULT_BASE = "dc=lework,dc=com"; $EXTENDED_SCHEMA = 1;
生成base.ldif
mkdir /root/openldap /usr/share/migrationtools/migrate_base.pl >/root/openldap/base.ldif
若要使用自己的則重新創建:
vim base.ldif
dn: dc=hbjc,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: Example Inc.
dc: hbjc
dn: ou=group,dc=hbjc,dc=com
objectClass: organizationalUnit
ou: group
dn: cn=admin,dc=hbjc,dc=com
objectClass: organizationalRole
cn: admin
description: Directory Administrator
ldapadd -x -D "cn=Manager,dc=lework,dc=com" -w 123456 -f /root/openldap/base.ldif
-D指定綁定dn-w指定管理員密碼-f指定文件
添加用戶及用戶組
默認情況下OpenLDAP是沒有普通用戶的,但是有一個管理員用戶。管理用戶就是前面我們剛剛配置的root。
現在我們把系統中的用戶,添加到OpenLDAP中。為了進行區分,我們現在新加兩個用戶ldapuser1和ldapuser2,和兩個用戶組ldapgroup1和ldapgroup2.
添加用戶組,使用如下命令:
groupadd ldapgroup1
groupadd ldapgroup2
添加用戶並設置密碼
useradd -g ldapgroup1 ldapuser1 useradd -g ldapgroup2 ldapuser2 echo '123456' | passwd --stdin ldapuser1 echo '123456' | passwd --stdin ldapuser2
把剛剛添加的用戶和用戶組提取出來,這包括該用戶的密碼和其他相關屬性,如下
grep ":10[0-9][0-9]" /etc/passwd > /root/openldap/users grep ":10[0-9][0-9]" /etc/group > /root/openldap/groups
根據上述生成的用戶和用戶組屬性,使用migrate_passwd.pl文件生成要添加用戶和用戶組的ldif,如下:
/usr/share/migrationtools/migrate_group.pl /root/openldap/groups > /root/openldap/groups.ldif /usr/share/migrationtools/migrate_passwd.pl /root/openldap/users > /root/openldap/users.ldif
導入用戶及用戶組到OpenLDAP數據庫
ldapadd -x -w "123456" -D "cn=Manager,dc=lework,dc=com" -f /root/openldap/groups.ldif
ldapadd -x -w "123456" -D "cn=Manager,dc=lework,dc=com" -f /root/openldap/users.ldif
把OpenLDAP用戶加入到用戶組
盡管我們已經把用戶和用戶組信息,導入到OpenLDAP數據庫中了。但實際上目前OpenLDAP用戶和用戶組之間是沒有任何關聯的。
如果我們要把OpenLDAP數據庫中的用戶和用戶組關聯起來的話,我們還需要做另外單獨的配置。
現在我們要把ldapuser1用戶加入到ldapgroup1用戶組,需要新建添加用戶到用戶組的ldif文件,如下
cat > /root/openldap/add_user_to_groups.ldif << "EOF" dn: cn=ldapgroup1,ou=Group,dc=lework,dc=com changetype: modify add: memberuid memberuid: ldapuser1 dn: cn=ldapgroup2,ou=Group,dc=lework,dc=com changetype: modify add: memberuid memberuid: ldapuser2 EOF ldapadd -x -w "123456" -D "cn=Manager,dc=lework,dc=com" -f /root/openldap/add_user_to_groups.ldif
查詢添加的OpenLDAP用戶組信息,如下:
ldapsearch -LLL -x -D "cn=Manager,dc=lework,dc=com" -w "123456" -b "dc=lework,dc=com" "cn=ldapgroup1" dn: cn=ldapgroup1,ou=Group,dc=lework,dc=com objectClass: posixGroup objectClass: top cn: ldapgroup1 userPassword:: e2NyeXB0fXg= gidNumber: 1000 memberUid: ldapuser1
開啟OpenLDAP日志訪問功能
默認情況下OpenLDAP是沒有啟用日志記錄功能的,但是在實際使用過程中,我們為了定位問題需要使用到OpenLDAP日志。
新建日志配置ldif文件,如下:
cat > /root/openldap/loglevel.ldif << EOF dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: stats EOF ldapmodify -Y EXTERNAL -H ldapi:/// -f /root/openldap/loglevel.ldif
修改rsyslog配置文件,並重啟rsyslog服務,如下:
cat >> /etc/rsyslog.conf << EOF local4.* /var/log/slapd.log EOF
重啟服務
systemctl restart rsyslog
systemctl restart slapd
使用ldapuser1認證下
ldapwhoami -x -D uid=ldapuser1,ou=People,dc=lework,dc=com -w 123456 dn:uid=ldapuser1,ou=People,dc=lework,dc=com
查看OpenLDAP日志,如下:
tail /var/log/slapd.log Jul 18 22:07:49 node130 slapd[2019]: conn=1000 fd=11 ACCEPT from IP=[::1]:54500 (IP=[::]:389) Jul 18 22:07:49 node130 slapd[2019]: conn=1000 op=0 BIND dn="uid=ldapuser1,ou=People,dc=lework,dc=com" method=128 Jul 18 22:07:49 node130 slapd[2019]: conn=1000 op=0 BIND dn="uid=ldapuser1,ou=People,dc=lework,dc=com" mech=SIMPLE ssf=0 Jul 18 22:07:49 node130 slapd[2019]: conn=1000 op=0 RESULT tag=97 err=0 text= Jul 18 22:07:49 node130 slapd[2019]: conn=1000 op=1 EXT oid=1.3.6.1.4.1.4203.1.11.3 Jul 18 22:07:49 node130 slapd[2019]: conn=1000 op=1 WHOAMI Jul 18 22:07:49 node130 slapd[2019]: conn=1000 op=1 RESULT oid= err=0 text= Jul 18 22:07:49 node130 slapd[2019]: conn=1000 op=2 UNBIND Jul 18 22:07:49 node130 slapd[2019]: conn=1000 fd=11 closed
安裝phpldapadmin
phpldapadmin是使用php語言開發的web端管理ldap的應用。
yum --enablerepo=epel -y install phpldapadmin
修改配置文件
vim /etc/phpldapadmin/config.php +397
#397行取消注釋,398行添加注釋 $servers->setValue('login','attr','dn'); //$servers->setValue('login','attr','uid'); vim /etc/httpd/conf.d/phpldapadmin.conf +11 <IfModule mod_authz_core.c> # Apache 2.4 Require local #添加一行內容,指定可訪問的ip段 Require ip 192.168.77.0/24 </IfModule>
啟動httpd
systemctl enable --now httpd
瀏覽器訪問phpldapadmin:
- url: http://服務器地址/phpldapadmin/
- 用戶名:cn=Manager,dc=lework,dc=com
- 密碼:設定的管理員密碼

安裝Self Service Password
為了解放管理員的工作,讓OpenLDAP用戶可以自行進行密碼的修改和重置,就需要我們來搭建一套自助修改密碼系統。
在此我們使用的是開源的基於php語言開發的ldap自助修改密碼系統Self Service Password。
Self Service Password是一個Web應用,可以讓用戶自行更新、修改和重置LDAP中的用戶密碼。支持標准的LDAPv3目錄服務,包括:OpenLDAP,Active Directory,OpenDS,ApacheDS等。
源碼地址: https://github.com/ltb-project/self-service-password
安裝服務
cat > /etc/yum.repos.d/ltb-project-noarch.repo << EOF
[ltb-project-noarch]
name=LTB project packages
baseurl=https://ltb-project.org/rpm/\$releasever/noarch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-LTB-project
EOF
rpm --import https://ltb-project.org/lib/RPM-GPG-KEY-LTB-project
yum -y install self-service-password
現在我們來查看下Self Service Password安裝的文件,如下:
rpm -ql self-service-password
比較重要的文件
/etc/httpd/conf.d/self-service-password.conf apache配置文件
/usr/share/self-service-password/conf/config.inc.php self-service-password配置文件
修改配置文件
如果不用虛擬主機的形式,可以修改apache配置文件
cp /etc/httpd/conf.d/self-service-password.conf{,.bak}
cat > /etc/httpd/conf.d/self-service-password.conf << EOF
Alias /ssp /usr/local/self-service-password
<Directory /usr/local/self-service-password>
AllowOverride None
<IfVersion >= 2.3>
Require all granted
</IfVersion>
<IfVersion < 2.3>
Order Deny,Allow
Allow from all
</IfVersion>
DirectoryIndex index.php
AddDefaultCharset UTF-8
</Directory>
EOF
修改Self Service Password的配置文件
修改ldap連接和email
vim /usr/share/self-service-password/conf/config.inc.php +37
$ldap_url = "ldap://localhost";
$ldap_starttls = false;
$ldap_binddn = "cn=Manager,dc=lework,dc=com";
$ldap_bindpw = "123456";
$ldap_base = "ou=People,dc=lework,dc=com";
$ldap_login_attribute = "uid";
$ldap_fullname_attribute = "cn";
$ldap_filter = "(&(objectClass=person)($ldap_login_attribute={login}))";
$keyphrase = "leworkRandmon";
$hash = "SSHA";
$who_change_password = "manager";
$mail_from = "admin@example.com";
$mail_from_name = "Self Service Password";
$mail_signature = "";
# Notify users anytime their password is changed
$notify_on_change = false;
# PHPMailer configuration (see https://github.com/PHPMailer/PHPMailer)
$mail_sendmailpath = '/usr/sbin/sendmail';
$mail_protocol = 'smtp';
$mail_smtp_debug = 0;
$mail_debug_format = 'error_log';
$mail_smtp_host = 'localhost';
$mail_smtp_auth = false;
$mail_smtp_user = '';
$mail_smtp_pass = '';
$mail_smtp_port = 25;
$mail_smtp_timeout = 30;
$mail_smtp_keepalive = false;
$mail_smtp_secure = 'tls';
$mail_smtp_autotls = true;
$mail_contenttype = 'text/plain';
$mail_wordwrap = 0;
$mail_charset = 'utf-8';
$mail_priority = 3;
$mail_newline = PHP_EOL;
修改ldap的連接信息,
$keyphrase設定一個隨機字符串
重啟Apache
systemctl restart httpd
訪問頁面
http://服務器地址/index.php
修改密碼 
在終端驗證修改的密碼
ldapwhoami -x -D uid=ldapuser1,ou=People,dc=lework,dc=com -w 123456
ldap_bind: Invalid credentials (49)
ldapwhoami -x -D uid=ldapuser1,ou=People,dc=lework,dc=com -w 12345678
dn:uid=ldapuser1,ou=People,dc=lework,dc=com
也可以使用郵件找回,或者短信找回。
查詢用戶密碼:ldapsearch -LLL -Y EXTERNAL -H ldapi:/// -b cn=config olcRootDN=cn=admin,dc=hbjc,dc=com dn olcRootDN olcRootPW
