LDAP

1. 理論部分:LDAP概念

1.1 目錄服務

從本質上講,目錄服務就是一種信息查詢服務,採用C/S服務架構,使用樹狀的目錄數據庫來提供信息查詢服務。node

Unix目錄服務sql

Unix系統中,全部的資源以文件的形式管理,爲了管理,存儲的方便,人們把文件分到不一樣的目錄中。Unix目錄就是一種樹狀結構,目錄中包含了文件和子目錄,目錄和文件的安全經過訪問權限進行控制。shell

Unix目錄其實是目錄服務中提到的目錄的一個子集。做爲一種網絡協議的目錄服務協議DAP,遠比Unix文件目錄複雜的多,功能和安全性也要強的多。數據庫

所謂的目錄,實際上就是一個數據庫,在這個數據庫裏存儲了有關網絡資源的信息,包括資源的位置及管理centos

目錄服務api

與經常使用的關係數據庫相比,目錄更容易爲用戶提供高效的查詢。目錄服務中,數據讀取和查詢很是高,比關係型數據庫能夠快一個數量級。可是目錄服務的數據寫入效率低,主要適用於數據不常常更新,可是須要頻繁讀取的場合。安全

在目錄數據庫中,數據信息是以樹狀的層次結構來描述的。因爲現實世界中的資源分佈形式,不少都是屬於層次結構的,所以目錄數據庫技術的可以很容易與實際的業務模式匹配。服務器

目錄服務是網絡服務的一種。它把管理網絡時,所須要的信息按照層次結構關係構形成一種樹形結構,並將這種信心存儲與目錄數據庫中,而後爲用戶提供有關信息的訪問,查詢等。網絡

所以,本質上,目錄服務是一種信息查詢服務,這些信息存在於樹狀結構的目錄數據庫中數據結構

功能

含有數據庫,提供給用戶查詢,使用信息的計算機就是目錄服務器。

向目錄服務器進行信息查詢,訪問目錄數據庫的計算機,就是目錄服務的客戶端。

目錄服務器主要是來實現網絡系統中各類資源的管理,做爲網絡的一種基礎架構,其具備如下功能:

  • 按照網絡管理員的指令,強制實施安全策略,保證目錄信息的安全
  • 目錄數據庫能夠分佈在一個網絡中的多臺計算機中,以提升響應速度
  • 複製目錄,以便更多的用戶可使用目錄,同時提升可用性和穩定性
  • 將目錄劃分爲多個數據源,以便存儲大量的對象

歷史上的目錄服務主要用於命名和定位網絡資源。如今功能獲得了擴展,變成了互聯網基礎結構中的重要組件,提供白頁黃頁的服務。

目前,不少應用程序都提供對目錄服務的支持,它們利用目錄服務進行用戶身份驗證,受權,命名,定位,以及網絡資源的控制,管理。

1.2 X.500介紹

X.500是國際標準化組織制定的一套目錄服務標準,它是一個協議族,定義了一個結構如何在全局範圍內共享名稱和名稱相關的對象。經過它,將局部的目錄服務鏈接起來,構成因特網分佈在全球的目錄服務系統。

X.500採用層次結構,其中的管理域能夠提供這些域內的用戶和資源信息,並定義強大的搜索功能,是的獲取這些信息變得簡單。

在X.500標準中,目錄數據庫採用分散管理,運行目錄服務的每一個站點,只負責本地目錄部分,所以客戶端要求的數據更新操做立刻可以完成,管理維護操做可以當即生效。X.500還可以提供強大的搜索功能,支持由用戶建立的任意複雜查詢。

因爲X.500可以建議一個基於標準的目錄數據庫,所以全部訪問目錄數據庫的應用程序,都可以識別數據庫的數據內容,從而得到有價值的信息。

X.500雖然是一個完整的目錄服務協議,被公認爲是實現目錄服務最好途徑,可是因爲過於複雜的緣由,實際推廣存在着很多障礙,目前主要在Unix機器運行,支持的應用程序也不多。

1.3 LDAP

爲了解決X.500的複雜問題,美國密歇根大學按照X.500的DAP協議,推出了一種簡化的DAP版本,叫LDAP,輕量級目錄訪問協議。

LDAP特色

LDAP目錄存儲和組織的基本數據結構成爲條目,每一個條目都有惟一的標識符,幷包含多個屬性。

即:條目 = 惟一標識符 + 屬性

條目依據標識符,被加入到一個樹狀結構中,組成一棵目錄樹。經過目錄信息樹,能夠很方便將條目信息分佈到不一樣的服務器。當用戶到某臺LDAP服務信息查詢時,若是查不到,會經過一種參照連接功能,將查詢指引到可能包含有相應信息的服務器上。

LDAP基礎模型

再LDAP協議中,定義了4中基本模型

  • 信息模型:描述LDAP目錄的信息表示方式即數據的存儲結構
  • 命名模型:描述數據再LDAP目錄中如何進行組織和區分
  • 功能模型:描述能夠對LDAP目錄進行哪些操做
  • 安全模型:描述如何保證LDAP目錄中的數據安全

信息模型

描述了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協議能夠強制客戶端使用數字證書認證,實現客戶端和服務段身份的雙向驗證

1.4 流行的協議產品

  1. eTruse Directory
  2. Active Directory
  3. Novell eDirectory
  4. Sun ONE Directory Server
  5. OpenLDAP

2. 實踐部分:LDAP服務部署

說明:本篇是在兩臺虛擬機(centos7)上部署主主複製的openldap服務

2.1 openldap服務端

2.1.1 安裝openldap依賴環境

在node98上,安裝依賴環境:

yum -y install openldap openldap-servers openldap-clients compat-openldap openldap-devel openldap-servers-sql

2.1.2 拷貝數據庫配置模板

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

chown -R ldap.ldap /var/lib/ldap

2.1.3 啓動sladp服務並添加開機啓動

systemctl start slapd && systemctl enable slapd

2.1.4 添加ldif文件至數據庫

執行命令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

2.1.5 配置日誌功能

編輯/etc/rsyslog.conf,在最後一行添加:

local4.*                                            /var/log/slapd.log

執行命令systemctl restart rsyslog重啓rsyslog日誌服務

經過tailf /var/log/slapd.log能夠看到slapd服務的日誌更新

至此,可將node98關機,做爲模板機克隆使用

本篇博客主要是克隆了node11和node12做爲實踐主機

2.2 openldap主主配置

在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"

而後執行查找命令確認是否刪除,兩個節點是否同步

2.3 openldap客戶端

使用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認證

相關文章
相關標籤/搜索