介紹
LDAP是輕量目錄訪問協議,英文全稱是Lightweight Directory Access Protocol,一般都簡稱爲LDAP。LDAP的目錄服務其實也是一種數據庫系統(Berkeley DB),只是這種數據庫是一種樹形結構(B Tree),適合讀不適合頻繁寫,不支持事務不能回滾。
我們用LDAP實現多個組件的用戶管理,比如把gitlab和harbor等組件的用戶放在LDAP一起管理,組件只負責權限管理。用戶在這些組件登錄時都走LDAP的認證,讓用戶可以用一套用戶名密碼即可登錄所有組件。
接下來我們一邊安裝一邊學習。
yum安裝OpenLDAP,設置數據庫配置文件
[root@ldap ~]# yum -y openldap-servers openldap-clients
[root@ldap ~]# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
[root@ldap ~]# chown ldap.ldap /var/lib/ldap/DB_CONFIG
[root@ldap ~]# systemctl start slapd
[root@ldap ~]# systemctl enable slapd
默認情況下,slapd服務監聽的是389端口。
設置OpenLDAP 的管理員用戶的密碼
[root@ldap ~]# slappasswd
New password:
Re-enter new password:
{SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
這裏使用了slappasswd
命令,返回了加密後的密碼,將這個密碼添加到OpenLDAP的ldif文件中,LDIF(LDAP Interchange Format)用文本格式表示目錄數據庫的信息,以方便用戶創建、閱讀和修改。
創建一個名爲的chrootpw.ldif的文件,其實名字叫什麼無所謂,內容如下:
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
介紹一下dn
(Distinguished Name)的概念,LDAP的樹形存儲類似DNS,從葉子到根的這條“路徑”是一條數據,稱爲條目(Entry),dn
就是這條數據的全局唯一標識。它的值我們後邊再講。
changetype: modify
表示我們要修改,add
表示我們要添加一條,類似還有replace
替換。接下來,執行編輯好的 chrootpw.ldif 文件。
[root@ldap ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={0}config,cn=config"
ldapadd
命令就是通過這個文件執行添加數據操作,類似還有命令ldapmodify
進行修改。
添加幾個基礎的 Schema
在LDAP中,schema用來指定一個目錄中所包含的對象(objects)的類型(objectClass),以及每一個類型(objectClass)中必須提供的屬性(Atrribute)和可選的屬性。可將schema理解爲面向對象程序設計中的類,通過類定義一個具體的對象。LDIF中的數據條目可理解爲是一個具體的對象,是通過schema來規劃創建的。因此,schema是一個數據模型,用來決定數據按什麼方式存儲,並定義存儲在不同的條目(Entry)下的數據之間的關係。
[root@ldap ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/cosine.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=cosine,cn=schema,cn=config"
[root@ldap ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/nis.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=nis,cn=schema,cn=config"
[root@ldap ~]# ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/inetorgperson.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "cn=inetorgperson,cn=schema,cn=config"
此處添加的 Schema 主要用於記錄人員信息。也可以按照需要導入別的Schema。
在 LDAP 數據庫中設置根域和數據庫超級管理員
這裏的“根域”我們設置爲 dc=colinlee,dc=fish
,即樹的根節點爲colinlee.fish
。
dc
(Domain Component)是域名的一部分,把完整的域名拆開。ou
(Organization Unit)是組織單元。cn
(Common Name)一般是用戶的名字。sn
(Surname)一般是姓。uid
(User Id)一般是用戶登錄id。
舉個例子,如圖:
數據庫管理員和上面設置過的 OpenLDAP 管理員並非同一管理員。此處的設置同樣需要一個用 slappasswd
命令生成的密碼,爲了方便管理,我們使用剛剛生成的密碼,不再重新生成。
創建一個新的 ldif 文件domain-dbadmin.ldif,內容如下:
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=colinlee,dc=fish" read
by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=colinlee,dc=fish
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=colinlee,dc=fish
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}xxxxxxxxxxxxxxxxxxxxxxxx
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange
by dn="cn=admin,dc=colinlee,dc=fish" write
by anonymous auth
by self write
by * none
olcAccess: {1}to dn.base=""
by * read
olcAccess: {2}to *
by dn="cn=admin,dc=colinlee,dc=fish" write
by * read
然後執行該 ldif 文件:
[root@ldap ~]# ldapmodify -Y EXTERNAL -H ldapi:/// -f domain-dbadmin.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}monitor,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
modifying entry "olcDatabase={2}hdb,cn=config"
新增數據(創建節點)
這一步新增了三條數據,預期結果如圖:
我們創建一個新的 ldif 文件basedomain.ldif,內容如下:
dn: dc=colinlee,dc=fish
objectClass: top
objectClass: dcObject
objectclass: organization
o: Example Inc.
dc: colinlee
dn: ou=user,dc=colinlee,dc=fish
objectClass: organizationalUnit
ou: user
dn: ou=group,dc=colinlee,dc=fish
objectClass: organizationalUnit
ou: group
dn: cn=admin,dc=colinlee,dc=fish
objectClass: organizationalRole
cn: admin
description: Directory Administrator
這個文件的格式簡單說明一下。dn
唯一標識一個條目,objectClass
是這個條目所包含的屬性,可以有多個,如上述第一個條目就有3個。條目的屬性根據objectClass
的不同而不同,有的objectClass
有必須設置的屬性,我們需要對屬性賦值。還以第一個條目爲例,top
沒有必須定義的屬性,dcobject
必須定義屬性dc
,用來表示一個域名的部分,而organization
必須定義屬性o
,用來表示一個組織的名稱。多個條目之間用一個空行分隔。
LDAP中,一個條目必須包含一個objectClass屬性,且需要賦予至少一個值。objectClass有着嚴格的等級之分,最頂層是top和alias。例如,organizationalPerson這個objectClass就隸屬於person,而person又隸屬於top。在OpenLDAP的schema中定義了很多objectClass,按需查找。
執行該文件使內容生效。此處使用了數據庫超級管理員的身份,需要輸入我們之前設置的密碼:
[root@ldap ~]# ldapadd -x -D cn=admin,dc=colinlee,dc=fish -W -f basedomain.ldif
Enter LDAP Password:
adding new entry "dc=colinlee,dc=fish"
adding new entry "ou=user,dc=colinlee,dc=fish"
adding new entry "ou=group,dc=colinlee,dc=fish"
adding new entry "cn=admin,dc=colinlee,dc=fish"
安裝LDAP管理工具PHPldapadmin
首選yum安裝Apache和PHP:
yum -y install httpd php php-ldap php-gd php-mbstring php-pear php-bcmath php-xml
接着安裝phpldapadmin:
yum -y install epel-release
yum --enablerepo=epel -y install phpldapadmin
然後修改配置:
vim /etc/phpldapadmin/config.php
#397行取消註釋,398行添加註釋,修改爲dn登錄
$servers->setValue('login','attr','dn');
// $servers->setValue('login','attr','uid');
// 保存退出修改另一個配置
vim /etc/httpd/conf.d/phpldapadmin.conf
<IfModule mod_authz_core.c>
# Apache 2.4
#Require local
#註釋掉上邊這句,添加一行內容,指定可訪問的ip段爲全部
Require all granted
</IfModule>
啓動服務並查看:
systemctl start httpd && systemctl enable httpd
瀏覽器登錄http://LDAP所在機器ip:80/phpldapadmin/
。端口是Apache的,可自行修改。如果按照本文的命令複製粘貼走下來,登錄用戶名爲cn=admin,dc=colinlee,dc=fish
,密碼爲之前自己設置的管理員密碼。如圖:
參考自:
https://www.jianshu.com/p/dc7112873e68
https://cloud.tencent.com/developer/article/1026304
https://blog.51cto.com/11555417/2065747