標籤:

LDAP 基礎學習筆記(概念 & 快速安裝)

一、前言

在我剛接觸 Windows Server 的時候,就老看到「目錄」這個東西。

當時由於懶,而且沒有使用的需求,就一直沒了解它,後來用 Linux 之後就完全忘了有「目錄」這個東西。

直到前些天在一本書上了解到,原來目錄服務能幹很多事情,我才想起來,然後開始學習……

我覺得,目錄服務的基本概念不是也別容易理解,不是一篇文章就能把它了解透徹的。

本文純屬個人學習經驗分享,僅供參考。如有錯誤請及時提出,謝謝!


二、目錄服務簡介

目錄簡單來說就是一種樹狀結構的資料庫。

而目錄服務是一種以樹狀結構的目錄資料庫為基礎,外加各種訪問協議的信息查詢服務。

顧名思義,目錄天生就是用來查詢的。

與關係型資料庫(如 MariaDB)相比,目錄服務最大的優點就是讀取性能極高。

但是,目錄服務的寫入性能就非常差了,而且不支持事務處理等容錯功能,因此不適合頻繁修改數據。

在現實世界中,資源的分布形式很多都是樹狀的、有層次的。因此,目錄服務有著非常廣泛的用途。

像企業員工信息、企業設備信息、證書公鑰等具有層次性、且不需要頻繁改寫的數據都適合使用目錄服務來存儲。

X.500 是 ISO 制定的一套目錄服務的標準,它是一個協議族,定義了一個機構如何在全局範圍內共享名稱和與名稱相關聯的對象。通過它,可以將局部的目錄服務連接起來,構建基於 Internet 的分布在全球的目錄服務系統……而目錄訪問協議(DAP)是 X.500 的核心組成之一。


三、LDAP 簡介

DAP 非常複雜,所以人們都不喜歡使用它。

所以,輕量級目錄訪問協議(LDAP)應運而生!LDAP 是基於 X.500 的 DAP 發展而來的,目前最新版本是第 3 版。

LDAP 協議的主要特點如下:

  • 基於 TCP/IP。
  • 以樹狀結構存儲數據。
  • 讀取速度快,寫入速度慢。
  • 伺服器用於存放數據,客戶端用於操作數據。
  • 跨平台、維護簡單。
  • 支持 SSL/TLS 加密。
  • 協議是開放的。

LDAP 的四大模型:

  • 信息模型:規定了 LDAP 目錄信息的表示方式以及數據的存儲結構。
  • 命名模型:規定了 LDAP 目錄中數據如何進行組織和區分。
  • 功能模型:規定了可以對 LDAP 目錄進行的操作(如查詢、更新、認證等)。
  • 安全模型:規定了保護 LDAP 目錄中的數據的安全措施。

基於 LDAP 協議的產品有很多,最有名兩個的是開源的 OpenDirectory 以及微軟開發的 ActiveDirectory。


四、LDAP 基本結構和相關術語

4.1 基本結構

?

上圖表示的就是一顆 LDAP 目錄樹。

4.2 條目(Entry)

4.1 的圖中的每一個方框就是一個條目。

一個條目有若干個屬性和若干個值。有些條目還能包含子條目。

4.3 識別名(Distinguished Name, DN)

它表示條目在目錄樹中從根出發的絕對路徑,是條目的唯一標識。

可以跟 UNIX 文件系統中文件或目錄的完整路徑做類比。

例如:4.1 的圖中右下角的條目的 DN 是 cn=group1,dc=zenandidi,dc=com

4.4 相對識別名(Relative Distinguished Name, RDN)

相對識別名就是識別名第一個逗號左側的內容。

可以跟 UNIX 文件系統中文件或目錄名做類比。

例如:4.1 的圖中右下角的條目的 RDN 是 cn=group1

在一般情況下,RDN 以 dc=ou=c=o= 開頭的條目為容器。也就是說,它們可以包含子條目。

4.5 基準識別名(Base Distinguished Name, Base DN)

一般指整個目錄樹的根。

例如,4.1 的圖的 Base DN 是 dc=zenandidi,dc=com

4.6 模式(Schema)

模式是對象類(ObjectClass)、屬性類型(AttributeType)、屬性語法(Syntax)和匹配規則(MatchingRules)的集合。

可以跟關係型資料庫的數據表結構做類比。

LDAP 協議定義了一些標準的模式,一般直接使用即可。用戶也可以根據自己的需求自行定義模式。

4.6.1 對象類(ObjectClass)

學過面向對象編程語言的人都知道,類是屬性的封裝。

對象類封裝了必選的屬性和可選的屬性,同時對象類也是支持繼承的。

通過對象類可以很方便地指定條目的類型。一個條目也可以綁定多個對象類。

對象類又分為了結構類型(Structural)、抽象類型(Abstract)、輔助類型(Auxiliary)這三類。

下圖是一個對象類所包含的內容。

?

4.6.2 屬性類型(AttributeType)

屬性類型定義了屬性值的設定規則(屬性語法),以及同一個屬性的各個數據相互比較的規則等。

下圖是一個屬性類型包含的內容。

?

4.6.3 屬性語法(Syntax)

下圖是 LDAP 協議預定義的一些屬性語法,例如二進位、字元串、電話號碼類型等。

?

4.6.4 匹配規則(MatchingRule)

這個我把它理解為各種類型屬性的集合。

下圖是 LDAP 協議預定義的一些匹配規則。

?

4.7 LDIF(LDAP Data Interchange Format) 文件

LDAP 數據交換格式文件,它以文本形式存儲,用於在伺服器之間交換數據。

添加數據以及修改數據都需要通過 LDIF 文件來進行。

可以跟關係型資料庫的 SQL 文件做類比。

LDIF 文件的格式一般如下:

dn: <識別名><屬性 1>: <值 1><屬性 2>: <值 2>...


五、在 CentOS 7 上安裝並使用 OpenLDAP

注意

  1. 不同版本的 Linux 安裝方法差別非常大!
  2. 此次安裝目的是快速搭建一個 LDAP 學習和測試環境,沒有進行其他高級配置。建議使用虛擬機和全新安裝的系統進行操作。

5.1 所需軟體 & 環境

  • 操作系統:CentOS 7.4.1708 最小安裝(已關閉 SELinux 和防火牆)
  • 應用軟體:openldap 2.4.44 、phpldapadmin 1.2.3

5.2 安裝 OpenLDAP

yum install -y openldap-clients openldap-servers

5.3 創建資料庫配置文件

直接套用模版即可。

cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG && chown ldap:ldap /var/lib/ldap/DB_CONFIG

5.4 啟動 OpenLDAP 服務

systemctl start slapd

如需開機啟動,請執行以下命令。

systemctl enable slapd

如果沒有出現錯誤,那麼 OpenLDAP 的安裝就算完成了,不過當前的目錄資料庫還是空的,下面我們要對資料庫進行初始化。

5.5 設置 OpenLDAP 管理員密碼

5.5.1 生成密碼

slappasswd

執行完該命令之後,請輸入您要設定的密碼。然後會生成 {SSHA}xxxxx 這樣一行東西,請把它記下來。

5.5.2 生成 LDIF 文件

cat << EOF > chrootpw.ldif

請按實際情況以及注釋提示修改以下內容,完成去除 # 號和後面的注釋,然後粘貼到命令行窗口中按回車即可。

dn: olcDatabase={0}config,cn=configchangetype: modifyadd: olcRootPWolcRootPW: {SSHA}xxxxx #{SSHA}xxxxx 修改為上一步記下來的值EOF

5.5.3 執行 LDIF 文件

ldapadd -Y EXTERNAL -H ldapi:/// -f chrootpw.ldif

5.6 導入預設的模式

find /etc/openldap/schema/ -name "*.ldif" -exec ldapadd -Y EXTERNAL -H ldapi:/// -D "cn=config" -f {} ;

5.7 新建一個根節點

5.7.1 生成根節點管理員密碼

注意

  • 根節點管理員密碼與 OpenLDAP 管理員密碼不是同一回事!一個 LDAP 資料庫可以包含多個目錄樹。

slappasswd

執行完該命令之後,請輸入您要設定的密碼。然後會生成 {SSHA}xxxxx 這樣一行東西,請把它記下來。

5.7.2 生成 LDIF 文件

首先請想好一個域名。比如我使用的是 zenandidi.com

zenandidi.com 為例,下面根節點的 DN 應該這樣寫:dc=zenandidi,dc=com

cat << EOF > chdomain.ldif

請按實際情況以及注釋提示修改以下內容,完成去除 # 號和後面的注釋,然後粘貼到命令行窗口中按回車即可。

dn: olcDatabase={1}monitor,cn=configchangetype: modifyreplace: olcAccessolcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=xxx,dc=xxx" read by * none #修改 dc=xxx,dc=xxx 為自己的域名dn: olcDatabase={2}hdb,cn=configchangetype: modifyreplace: olcSuffixolcSuffix: dc=xxx,dc=xxx #修改 dc=xxx,dc=xxx 為自己的域名dn: olcDatabase={2}hdb,cn=configchangetype: modifyreplace: olcRootDNolcRootDN: cn=Manager,dc=xxx,dc=xxx #修改 dc=xxx,dc=xxx 為自己的域名dn: olcDatabase={2}hdb,cn=configchangetype: modifyadd: olcRootPWolcRootPW: {SSHA}xxxxx #{SSHA}xxxxx 修改為上一步記下來的值dn: olcDatabase={2}hdb,cn=configchangetype: modifyadd: olcAccessolcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=xxx,dc=xxx" write by anonymous auth by self write by * none #修改 dc=xxx,dc=xxx 為自己的域名olcAccess: {1}to dn.base="" by * readolcAccess: {2}to * by dn="cn=Manager,dc=xxx,dc=xxx" write by * read #修改 dc=xxx,dc=xxx 為自己的域名EOF

5.7.3 執行 LDIF 文件

ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif

5.8 添加用戶、組節點

5.8.1 生成 LDIF 文件

cat << EOF > basedomain.ldif

請按實際情況以及注釋提示修改以下內容,完成去除 # 號和後面的注釋,然後粘貼到命令行窗口中按回車即可。

dn: dc=xxx,dc=xxx #修改 dc=xxx,dc=xxx 為自己的域名objectClass: topobjectClass: dcObjectobjectclass: organizationo: root_ldapdc: xxx #修改 xxx 為自己域名第一個點左邊的內容dn: cn=Manager,dc=xxx,dc=xxx #修改 dc=xxx,dc=xxx 為自己的域名objectClass: organizationalRolecn: Managerdescription: Directory Managerdn: ou=People,dc=xxx,dc=xxx #修改 dc=xxx,dc=xxx 為自己的域名objectClass: organizationalUnitou: Peopledn: ou=Group,dc=xxx,dc=xxx #修改 dc=xxx,dc=xxx 為自己的域名objectClass: organizationalUnitou: GroupEOF

5.8.2 執行 LDIF 文件

請先修改下面命令的 dc=xxx,dc=xxx 為自己的域名然後再執行。

ldapadd -x -D cn=Manager,dc=xxx,dc=xxx -W -f basedomain.ldif

然後需要輸入 5.7.1 設定的根節點管理員密碼。

5.9 清理 LDIF 文件

rm basedomain.ldif chdomain.ldif chrootpw.ldif

至此,一個 LDAP 目錄樹就構建完畢了。

但是 LDAP 的命令行管理工具非常難用,尤其是對於新手來說。

所以,下面我們來安裝 phpLDAPadmin 這個圖形化管理工具,方便新手學習。

5.10 安裝 phpLDAPadmin

5.10.1 安裝主程序

yum -y install phpldapadmin

5.10.2 修改配置文件

vi /etc/phpldapadmin/config.php

請按實際情況以及注釋提示修改以下內容,完成去除 # 號和後面的注釋,在命令行窗口中按下 G(大寫),然後按下 O(大寫),將上面修改的內容直接粘貼到命令行窗口中,再按下 ESC ,最後輸入 :wq按回車。

$servers = new Datastore();$servers->newServer(ldap_pla);$servers->setValue(server,name,My LDAP Server);$servers->setValue(server,host,127.0.0.1);$servers->setValue(server,port,389);$servers->setValue(server,base,array(dc=xxx,dc=xxx)); #修改 dc=xxx,dc=xxx 為自己的域名$servers->setValue(login,auth_type,session);$servers->setValue(login,bind_id,cn=Manager,dc=xxx,dc=xxx); #修改 dc=xxx,dc=xxx 為自己的域名$servers->setValue(login,bind_pass,<密碼>); #填入 5.7.1 設定的根節點管理員密碼$servers->setValue(server,tls,false);

5.10.3 啟動 httpd 服務

systemctl start httpd

如需開機啟動,請執行以下命令。

systemctl enable httpd

5.10.4 登錄 phpLDAPadmin & 完成

注意

  • 默認情況下 phpLDAPadmin 只允許 127.0.0.1 本地訪問。由於我不熟悉 apache 的配置文件,所以我是直接使用 SSH 埠轉發來訪問的。

打開瀏覽器,訪問 127.0.0.1/phpldapadmin ,然後按圖片中的提示登錄即可。

?

配置完成後的效果如下:

?


六、參考文獻

  1. SegmentFault - LDAP伺服器的概念和原理簡單介紹
  2. ITeye.com - LDAP基礎
  3. 開源中國 - openldap+phpldapadmin
  4. CSDN - Linux下LDAP Server/Client配置 --OpenLDAP
  5. Virginia Jean - OpenLDAP 在 CentOS 7 上的極速搭建步驟
  6. dzhorov.com - Installing and configuring OpenLDAP on CentOS 7
  7. CSDN - 搭建ldap,samba和nfs 統一認證服務

推薦閱讀:

I/O會一直佔用CPU嗎?
平時寫linux下c有哪些好用的查函數軟體?
偽造掌閱ireader plus升級的伺服器
為什麼 Android 要採用 Binder 作為 IPC 機制?

TAG:LDAP | Linux |