一、概要
1. 承上啟下
2. 基礎環境
(1) CentOS 7.9
(2) Open LDAP 2.4.44
3. 解決依賴
(1) EPEL
(2) OpenSSL或GnuTLS
Open LDAP 客戶端和服務端要求安裝OpenSSL、GnuTLS或MozNSS,CentOS 7已經自帶了OpenSSL和GnuTLS。
a. OpenSSL
rpm -qa | grep openssl
b. GunTLS
rpm -qa | grep gnutls
(3) SASL (Simple Authentication and Security Layer)
OpenLDAP客戶端和服務端軟件需要安裝Cyrus SASL庫來提供簡單身份驗證和安全服務。CentOS 7已經自帶了Cyrus SASL庫:
rpm -qa | grep sasl
(4) Kerberos
Kerberos是一個網絡認證協議,ldap官方推薦的兩種實現軟件是Heimdal(https://www.h5l.org/)和MIT(http://web.mit.edu/kerberos/www/),CentOS 7自帶MIT實現:
rpm -qa | grep krb
(5) 數據庫
Open LDAP 自帶了LMDB(Lightning Memory-Mapped Database),無需單獨安裝數據庫。
(6) 查詢版本
rpm -qa | grep ldap
不建議用以下命令卸載舊版本
rpm -e openldap-2.4.44-15.e17_5.x86_64
因為對Open LDAP有依賴的軟件實在是太多了(如下圖),盲目卸載可能會導致系統崩潰。
(7) Rocky Linux 9
對於RL9,需要OpenLDAP在'plus'倉庫中,默認是關閉狀態的,所以首先需要開啟該倉庫:
sudo dnf config-manager --set-enabled plus
sudo dnf repolist
二、安裝與配置
1. 安裝
Open LDAP安裝分為兩種方式,RPM包安裝或者編譯安裝,前者簡單方便而且有現成的服務可用,后者優勢是版本較新,建議使用第一種方式。
在我寫這篇文章的時候,Open LDAP的最新的Release版本為2.6.3,最新的LTS版本為2.5.1,但yum repository里提供的最新版本是2.4.44。
yum install openldap openldap-servers openldap-clients -y
openldap-clients包含ldapadd和ldapmodify等命令,在配置環節是必要的。
(2) slapd服務
sudo systemctl start slapd
sudo systemctl enable slapd
systemctl status slapd
(3) 防火牆
sudo firewall-cmd --add-service={ldap,ldaps} --permanent sudo firewall-cmd --reload sudo firewall-cmd --list-all
2. 配置框架
Open LDAP的配置以樹狀結構存儲在Open LDAP數據庫中,這些節點的配置文件以ldif格式存儲在/etc/openldap/slapd.d目錄下。
(1) cn=config是根節點用於全局性配置,它的配置文件是/etc/openldap/slapd.d/cn=config.ldif,其結構如下:
dn: cn=config
objectClass: olcGlobal
cn: config
<global config settings>
(2) cn=module{0},cn=config用於配置動態模塊,它的配置文件位於/etc/openldap/slapd.d/cn=config目錄下,其結構如下:
dn: cn=module{0},cn=config objectClass: olcModuleList cn: module{0} olcModuleLoad: /usr/local/lib/smbk5pwd.la dn: cn=module{1},cn=config objectClass: olcModuleList cn: module{1} olcModulePath: /usr/local/lib:/usr/local/lib/slapd olcModuleLoad: accesslog.la olcModuleLoad: pcache.la
(3) cn=schema,cn=config用於schema配置,它的配置文件位於/etc/openldap/slapd.d/cn=config目錄下,其結構如下:
dn: cn=schema,cn=config objectClass: olcSchemaConfig cn: schema <system schema> dn: cn={X}core,cn=schema,cn=config objectClass: olcSchemaConfig cn: {X}core <core schema>
(4) olcDatabase={X}<typeA>,cn=config用於配置數據庫,它的配置文件位於/etc/openldap/slapd.d/cn=config目錄下,其結構如下:
dn: olcDatabase={X}<typeA>,cn=config
objectClass: olcDatabaseConfig
olcDatabase: {X}<typeA>
<database-specific settings>
3. 配置
(1) 創建目錄,用於存儲配置文件
mkdir ~/ldap
(2) 管理密碼
a. 生成密碼
slappasswd
如下圖所示,運行該命令后會生成一個密碼,該密碼會在后續的配置中繼續使用:
b. 新建rootPassword.ldif文件:
vi ~/ldap/rootPassword.ldif
將下方olcRootPW的值替換成剛才生成SSHA密碼並復制到rootPassword.ldip文件中:
dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}PASSWORD_CREATED
將管理員密碼存儲到LDAP目錄中:
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f rootPassword.ldif
執行之后會有如下提示:
(3) 導入schema
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
重啟
sudo systemctl restart slapd
(4) 數據庫
從2.4版本開始,Open LDAP已經將之前常用的BDB(Berkeley DB)設置為過時(deprecated)狀態並推薦使用LMDB(Lightning Memory-Mapped Database)。
a. 新建mdb.ldif文件:
vi ~/ldap/mdb.ldif
b. 替換下方文本中olcRootPW的值和example,復制替換后的文本到mdb.ldip文件中:
dn: olcDatabase=mdb,cn=config objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: mdb olcSuffix: dc=example,dc=com olcRootDN: cn=admin,dc=example,dc=com olcDbDirectory: /var/lib/ldap olcDbMaxsize: 1073741824 olcRootPW: {SSHA}Password olcDbIndex: objectClass eq
olcDbIndex: ou,cn,mail,surname,givenname eq olcLastMod: TRUE olcMonitoring: TRUE olcDbEnvFlags: writemap olcDBNoSync: TRUE
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,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=admin,dc=example,dc=com" write by * read
c. 添加配置:
sudo ldapadd -Y EXTERNAL -H ldapi:/// -f mdb.ldif
d. 清理HDB
sudo rm -rf /etc/openldap/slapd.d/cn=config/olcDatabase={2}hdb.ldif
(5) monitor
a. 新建monitor.ldif
vi ~/ldap/monitor.ldif
b. 初始化
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=example,dc=com" read by * none
注意將example替換成自己的域名;
c. 修改配置
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f monitor.ldif
(6) 測試配置
sudo slaptest -u
(7) 重啟服務
sudo systemctl restart slapd
4. 初始化數據
(1) 新建data.ldif
vi ~/ldap/data.ldif
(2) 初始化
dn: dc=example,dc=com objectClass: top objectClass: dcObject objectclass: organization o: Example dn: cn=admin,dc=example,dc=com objectClass: organizationalRole cn: admin description: Directory Admin dn: ou=People,dc=example,dc=com objectClass: organizationalUnit ou: People dn: ou=Group,dc=example,dc=com objectClass: organizationalUnit ou: People
(3) 添加數據
sudo ldapadd -Y EXTERNAL -x -D "cn=admin,dc=example,dc=com" -W -f data.ldif
或
sudo ldapadd -x -W -D "cn=admin,dc=example,dc=com" -f data.ldif
5. 測試
(1) 匿名登錄測試
默認情況下Open LDAP是支持匿名登錄和查詢的,所以我們可以通過匿名的方式來查看我們剛才添加的數據:
ldapsearch -x -H ldap://127.0.0.1:389 -b 'ou=People,dc=example,dc=com'
查詢成功會返回DN為"ou=Group,dc=example,dc=com"本身和它全部子節點的詳細信息,如果返回invalid credentials(49)則說明有問題,可以添加-d 5參數來輸出詳細信息。
(2) 登錄后測試
假設我們在"ou=People,dc=example,dc=com"下面創建了若干員工,並且為員工分配了密碼,那么我們可以通過以下命令測試我們添加的數據:
ldapsearch -x -H ldap://127.0.0.1:389 -D uid=<<用戶名>>,ou=People,dc=example,dc=com -w <<密碼>> -b cn=admin,dc=example,dc=com
關於ldapsearch命令請參考官方文檔 https://www.mkssoftware.com/docs/man1/ldapsearch.1.asp, 我這里簡單解釋一下上面的參數:
-x 表示使用簡單身份驗證而不是SASL;
-H 是LDAP服務的地址和端口;
-D 是bindDN(需要綁定DN),這里可以理解為用戶名,注意這里的用戶名是"uid=<<用戶名>>,ou=People,dc=example,dc=com",假設員工的uid是zhangsan,那么這里的參數是"uid=zhangsan,ou=People,dc=example,dc=com";
-w 是用戶的密碼,注意不是root password(雖然你可以用root password但這明顯是強烈不建議的);
-b 是baseDN,是你要查詢的東西,這里我們查詢“cn=admin,dc=example,dc=com”這個節點;
我們務必要區分bindDN和baseDN。
6. objectClass
objectClass之於LDAP就像數據表結構與關系型數據庫的關系類似,針對不同的角色,我建議使用以下ObjectClass:
頂層:top + dcObject + organization
二層:organizationalUnit
系統管理員:organizationalRole
Group:groupOfNames
People:inetOrgPerson
Device(Server,打印機): device + shadowAccount + ipHost(可選)
三、卸載與清理
1. 卸載
yum remove openldap-clients openldap-servers -y
2. 清空目錄
rm -rf /etc/openldap/slapd.d rm -rf /var/lib/ldap
四、參考
1. 官方
https://www.openldap.org/doc/admin24/
https://www.openldap.org/doc/admin24/slapdconf2.html
https://www.openldap.org/doc/admin26/backends.html#Monitor
2. 安裝
(1) CentOS 7
https://www.tecmint.com/install-openldap-server-for-centralized-authentication/
https://linuxhostsupport.com/blog/how-to-install-ldap-on-centos-7/
https://www.cnblogs.com/swordfall/p/12119010.html
(2) Rocky Linux 9
https://www.howtoforge.com/how-to-install-openldap-on-rocky-linux-9/
3. MDB
https://www.openldap.org/doc/admin24/backends.html#LMDB
https://stackoverflow.com/questions/24407788/openldap-switch-to-mdb-backend-memory-mapped-database