從本質上講,目錄服務就是一種信息查詢服務,採用C/S服務架構,使用樹狀的目錄數據庫來提供信息查詢服務。node
Unix目錄服務sql
Unix系統中,全部的資源以文件的形式管理,爲了管理,存儲的方便,人們把文件分到不一樣的目錄中。Unix目錄就是一種樹狀結構,目錄中包含了文件和子目錄,目錄和文件的安全經過訪問權限進行控制。shell
Unix目錄其實是目錄服務中提到的目錄的一個子集。做爲一種網絡協議的目錄服務協議DAP,遠比Unix文件目錄複雜的多,功能和安全性也要強的多。數據庫
所謂的目錄,實際上就是一個數據庫,在這個數據庫裏存儲了有關網絡資源的信息,包括資源的位置及管理centos
目錄服務api
與經常使用的關係數據庫相比,目錄更容易爲用戶提供高效的查詢。目錄服務中,數據讀取和查詢很是高,比關係型數據庫能夠快一個數量級。可是目錄服務的數據寫入效率低,主要適用於數據不常常更新,可是須要頻繁讀取的場合。安全
在目錄數據庫中,數據信息是以樹狀的層次結構來描述的。因爲現實世界中的資源分佈形式,不少都是屬於層次結構的,所以目錄數據庫技術的可以很容易與實際的業務模式匹配。服務器
目錄服務是網絡服務的一種。它把管理網絡時,所須要的信息按照層次結構關係構形成一種樹形結構,並將這種信心存儲與目錄數據庫中,而後爲用戶提供有關信息的訪問,查詢等。網絡
所以,本質上,目錄服務是一種信息查詢服務,這些信息存在於樹狀結構的目錄數據庫中數據結構
功能
含有數據庫,提供給用戶查詢,使用信息的計算機就是目錄服務器。
向目錄服務器進行信息查詢,訪問目錄數據庫的計算機,就是目錄服務的客戶端。
目錄服務器主要是來實現網絡系統中各類資源的管理,做爲網絡的一種基礎架構,其具備如下功能:
歷史上的目錄服務主要用於命名和定位網絡資源。如今功能獲得了擴展,變成了互聯網基礎結構中的重要組件,提供白頁黃頁的服務。
目前,不少應用程序都提供對目錄服務的支持,它們利用目錄服務進行用戶身份驗證,受權,命名,定位,以及網絡資源的控制,管理。
X.500是國際標準化組織制定的一套目錄服務標準,它是一個協議族,定義了一個結構如何在全局範圍內共享名稱和名稱相關的對象。經過它,將局部的目錄服務鏈接起來,構成因特網分佈在全球的目錄服務系統。
X.500採用層次結構,其中的管理域能夠提供這些域內的用戶和資源信息,並定義強大的搜索功能,是的獲取這些信息變得簡單。
在X.500標準中,目錄數據庫採用分散管理,運行目錄服務的每一個站點,只負責本地目錄部分,所以客戶端要求的數據更新操做立刻可以完成,管理維護操做可以當即生效。X.500還可以提供強大的搜索功能,支持由用戶建立的任意複雜查詢。
因爲X.500可以建議一個基於標準的目錄數據庫,所以全部訪問目錄數據庫的應用程序,都可以識別數據庫的數據內容,從而得到有價值的信息。
X.500雖然是一個完整的目錄服務協議,被公認爲是實現目錄服務最好途徑,可是因爲過於複雜的緣由,實際推廣存在着很多障礙,目前主要在Unix機器運行,支持的應用程序也不多。
爲了解決X.500的複雜問題,美國密歇根大學按照X.500的DAP協議,推出了一種簡化的DAP版本,叫LDAP,輕量級目錄訪問協議。
LDAP特色
LDAP目錄存儲和組織的基本數據結構成爲條目,每一個條目都有惟一的標識符,幷包含多個屬性。
即:條目 = 惟一標識符 + 屬性
條目依據標識符,被加入到一個樹狀結構中,組成一棵目錄樹。經過目錄信息樹,能夠很方便將條目信息分佈到不一樣的服務器。當用戶到某臺LDAP服務信息查詢時,若是查不到,會經過一種參照連接功能,將查詢指引到可能包含有相應信息的服務器上。
LDAP基礎模型
再LDAP協議中,定義了4中基本模型
信息模型
描述了LDAP目錄的信息表示方式,以及數據的存儲結構。
LDAP目錄中最基本的數據存儲單元是條目,題目表明了現實世界中的人,公司等實體,以樹狀的形式組織。
當條目建立時,必須屬於某個或者多個對象類(Object Class),每一個對象類包含了一個或者多個屬性,某些屬性必需要爲它提供一個或者多個值,並且要符合所指定的語法和匹配規則。當定義對象和屬性類型的時候,都可以使用類的繼承的概念。
在LDAP協議中,將對象類型,屬性類型,屬性的語法,匹配規則統稱爲模式(Schema)。
在關係數據庫中,輸入表的內容錢,必須先定義表的結構,肯定列名,列類型,以及索引等內容。LDAP的模式至關於關係數據庫中的表結構。
LDAP協議定義了一些標準的模式,還有一些模式時爲不一樣的應用領域定製的。用戶能夠根據須要選擇。
命名模型
命名模型實際上就是LDAP中條目的定位方式。
在LDAP中,每一個條目都有一個DN和RDN,DN時該條目在整個樹中的惟一標識,至關於Linux目錄樹中的絕對路徑。每一個條目節點下的全部子條目,也有惟一的標識,這個惟一標識成爲RDN,至關於文件系統中的子目錄或者文件的名稱。在文件系統中,每一個目錄的文件和子目錄名稱也是惟一的。
功能模型
定義了LDAP中的有關數據的操做方式,相似於關係型數據庫中SQL語句。LDAP定義了3類標準的操做,每類操做還包含了子操做,具體的內容以下:
安全模型
定義了LDAP的安全機制,包括身份認證,安全通道,訪問控制三個方面的內容。
身份認證又包括了三種方式:匿名,基本認證,SASL認證
匿名認證至關於不進行認證,這種方式只對徹底公開的目錄適用。
基本認證均是經過用戶名和密碼進行身份鑑別,密碼分爲簡單密碼和摘要密碼
SASL認證爲SSL和TLS安全通道基礎上的身份鑑別,例如採用數字證書等
LDAP和SSL/TLS
LDAP協議支持SSL/TLS的安全鏈接。SSL/TLS是基於PKI信息安全技術,是目前因特網普遍採用的安全協議。
LDAP經過StartTLS方式啓用TLS服務,能夠保證通訊時數據的保密性和完整性。
TLS協議能夠強制客戶端使用數字證書認證,實現客戶端和服務段身份的雙向驗證
說明:本篇是在兩臺虛擬機(centos7)上部署主主複製的openldap服務
在node98上,安裝依賴環境:
yum -y install openldap openldap-servers openldap-clients compat-openldap openldap-devel openldap-servers-sql
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown -R ldap.ldap /var/lib/ldap
systemctl start slapd && systemctl enable slapd
執行命令slappassword
,回車,獲取加密字符串:{SSHA}hr0sVB1CPDzLFTojPxe6pijm4snvRyTe
建立chrootpw.ldif,內如容下:
dn: olcDatabase={0}config,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}hr0sVB1CPDzLFTojPxe6pijm4snvRyTe
添加模板ldif
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
ldapmodify -Y EXTERNAL -H ldapi:/// -f chdrootpw.ldif
建立和添加根域chdomain.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=liwanliang,dc=com" read by * none dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcSuffix olcSuffix: dc=liwanliang,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcRootDN olcRootDN: cn=admin,dc=liwanliang,dc=com dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcRootPW olcRootPW: {SSHA}hr0sVB1CPDzLFTojPxe6pijm4snvRyTe dn: olcDatabase={2}hdb,cn=config changetype: modify replace: olcAccess olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=liwanliang,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=liwanliang,dc=com" write by * read
執行命令:ldapmodify -Y EXTERNAL -H ldapi:/// -f chdomain.ldif
添加根域
建立和添加一個組織域basedomain.ldif,內容以下:
dn: dc=liwanliang,dc=com objectClass: top objectClass: dcObject objectClass: organization o: LiwanLiang Person dc: liwanliang dn: cn=admin,dc=liwanliang,dc=com objectClass: organizationalRole cn: admin dn: ou=People,dc=liwanliang,dc=com objectClass: organizationalUnit ou: People dn: ou=Group,dc=liwanliang,dc=com objectClass: organizationalRole cn: Group
執行命令:ldapadd -x -D cn=admin,dc=liwanliang,dc=com -W -f basedomain.ldif
添加至數據庫
建立和添加主從複製的mod_syncprov.ldif和syncprov.ldif,內容以下:
mod_syncprov.ldif
dn: cn=module,cn=config objectClass: olcModuleList cn: module olcModulePath: /usr/lib64/openldap olcModuleLoad: syncprov.la
syncprov.ldif:
dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov olcSpSessionLog: 100
執行命令,添加至數據庫:
ldapadd -Y EXTERNAL -H ldapi:/// -f mod_syncprov.ldif
ldapadd -Y EXTERNAL -H ldapi:/// -f syncprov.ldif
建立和添加日誌功能配置的loglevel.ldif,內容以下:
dn: cn=config changetype: modify replace: olcLogLevel olcLogLevel: Args
執行命令:ldapadd -Y EXTERNAL -H ldapi:/// -f loglevel.ldif
編輯/etc/rsyslog.conf,在最後一行添加:
local4.* /var/log/slapd.log
執行命令systemctl restart rsyslog
重啓rsyslog日誌服務
經過tailf /var/log/slapd.log
能夠看到slapd服務的日誌更新
至此,可將node98關機,做爲模板機克隆使用
本篇博客主要是克隆了node11和node12做爲實踐主機
在2.1中,使用了兩個克隆主機node11和node12做爲openldap的主節點
配置過程
在node11上,建立master01.ldif,內容以下:
dn: cn=config changetype: modify replace: olcServerID olcServerID: 0 dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcSyncRepl olcSyncRepl: rid=001 provider=ldap://192.168.80.12:389/ bindmethod=simple binddn="cn=admin,dc=liwanliang,dc=com" credentials=liwanliang searchbase="dc=liwanliang,dc=com" scope=sub schemachecking=on type=refreshAndPersist retry="30 5 300 3" interval=00:00:00:10 - add: olcMirrorMode olcMirrorMode: TRUE dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config changetype: add objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov
在node12上,建立master02.ldif,內容以下:
dn: cn=config changetype: modify replace: olcServerID olcServerID: 1 dn: olcDatabase={2}hdb,cn=config changetype: modify add: olcSyncRepl olcSyncRepl: rid=002 provider=ldap://192.168.80.11:389/ bindmethod=simple binddn="cn=admin,dc=liwanliang,dc=com" credentials=liwanliang searchbase="dc=liwanliang,dc=com" scope=sub schemachecking=on type=refreshAndPersist retry="30 5 300 3" interval=00:00:00:10 - add: olcMirrorMode olcMirrorMode: TRUE dn: olcOverlay=syncprov,olcDatabase={2}hdb,cn=config changetype: add objectClass: olcOverlayConfig objectClass: olcSyncProvConfig olcOverlay: syncprov
在node11上,執行ldapmodify -Y EXTERNAL -H ldapi:/// -f master01.ldif
在node12上,執行ldapmodify -Y EXTERNAL -H ldapi:/// -f master02.ldif
此時須要經過觀察日誌tailf /var/log/slapd.log
,初步確認是否配置出錯,通常是觀察日誌中的error信息
測試過程
在node11上,建立測試ldif,內容以下:
dn: uid=liwl01,ou=People,dc=liwanliang,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount uid: liwl01 cn: liwl01 sn: liwl01 userPassword: {SSHA}Y9cnuD5NupEu8Bnf6VYMjVJuDfUsSnqt uidNumber: 1101 gidNumber: 1101 homeDirectory: /home/liwl01 dn: cn=liwl,ou=Group,dc=liwanliang,dc=com objectClass: posixGroup cn: liwl gidNumber: 1101 memberUid: liwl
執行命令ldapadd -x -D cn=admin,dc=liwanliang,dc=com -W -f ldapuser.ldif
添加至數據庫
執行命令ldapsearch -x -b dc=liwanliang,dc=com -H ldap://192.168.80.11|grep liwl
,在node11上查找
執行ldapsearch -x -b dc=liwanliang,dc=com -H ldap://192.168.80.12|grep liwl
在node12上查找
若是都有結果,則說明配置成功
刪除測試
執行ldapdelete -x -W -D cn=admin,dc=liwanliang,dc=com "uid=liwl01,ou=People,dc=liwanliang,dc=com"
,
而後執行查找命令確認是否刪除,兩個節點是否同步
使用sssd服務,來進行openldap的認證。
執行`yum -y install sssd`,安裝完成以後,執行`cd /etc/sssd/`,建立sssd.conf
內容以下:
```
#
[sssd]
config_file_version = 2
services = nss, pam, autofs
domains = default
[nss]
filter_users = root,ldap
[pam]
[domain/default]
auth_provider = ldap
id_provider = ldap
chpass_provider = ldap
ldap_uri = ldap://192.168.80.11
ldap_search_base = dc=liwanliang,dc=com
ldap_tls_reqcert = never
ldap_id_use_start_tls = False
ldap_tls_cacertdir = /etc/openldap/cacerts
cache_credentials = True
entry_cache_timeout = 60
ldap_network_timeout = 3
autofs_provider = ldap
[autofs]
```
修改sssd.conf的權限爲400,執行:`chmod 400 sss.conf`
重啓sssd,執行`systemctl restart sssd`
經過authconfig或者authconfig-tui配置ldap認證