首頁 > 軟體

RHCSA 系列(十四): 在 RHEL 7 中設定基於 LDAP 的認證

2020-06-16 17:51:56

在這篇文章中,我們將首先羅列一些 LDAP 的基礎知識(它是什麼,它被用於何處以及為什麼會被這樣使用),然後向你展示如何使用 RHEL 7 系統來設定一個 LDAP 伺服器以及設定一個用戶端來使用它達到認證的目的。

RHCSA 系列:設定 LDAP 伺服器及用戶端認證 – Part 14

正如你將看到的那樣,關於認證,還存在其他可能的應用場景,但在這篇指南中,我們將只關注基於 LDAP 的認證。另外,請記住,由於這個話題的廣泛性,在這裡我們將只涵蓋它的基礎知識,但你可以參考位於總結部分中列出的文件,以此來了解更加深入的細節。

基於相同的原因,你將注意到:為了簡潔起見,我已經決定省略了幾個位於 man 頁中 LDAP 工具的參考,但相應命令的解釋是近在咫尺的(例如,輸入 man ldapadd)。

那還是讓我們開始吧。

我們的測試環境

我們的測試環境包含兩台 RHEL 7機器:

  1. Server:192.168.0.18. FQDN: rhel7.mydomain.com
  2. Client:192.168.0.20. FQDN: ldapclient.mydomain.com

如若你想,你可以使用在 RHCSA 系列(十二): 使用 Kickstart 完成 RHEL 7 的自動化安裝 中使用 Kickstart 安裝的機子來作為用戶端。

LDAP 是什麼?

LDAP 代表輕量級目錄存取協定(Lightweight Directory Access Protocol),並包含在一系列協定之中,這些協定允許一個用戶端通過網路去獲取集中儲存的資訊(例如所登入的 shell 的路徑,家目錄的絕對路徑,或者其他典型的系統使用者資訊),而這些資訊可以從不同的地方存取到或被很多終端使用者獲取到(另一個例子是含有某個公司所有雇員的家庭地址和電話號碼的目錄)。

對於那些被賦予了許可權可以使用這些資訊的人來說,將這些資訊進行集中管理意味著可以更容易地維護和獲取。

下面的圖表提供了一個簡化了的關於 LDAP 的示意圖,在下面將會進行更多的描述:

LDAP 示意圖

下面是對上面示意圖的一個詳細解釋。

  • 在一個 LDAP 目錄中,一個條目(entry)代表一個獨立單元或資訊,被所謂的區別名(DN,Distinguished Name) 唯一識別。
  • 一個屬性(attribute)是一些與某個條目相關的資訊(例如地址,有效的聯絡電話號碼和郵箱地址)。
  • 每個屬性被分配有一個或多個值(value),這些值被包含在一個以空格為分隔符的列表中。每個條目中那個唯一的值被稱為一個相對區別名(RDN,Relative Distinguished Name)。

接下來,就讓我們進入到有關伺服器和用戶端安裝的內容。

 

安裝和設定一個 LDAP 伺服器和用戶端

在 RHEL 7 中, LDAP 由 OpenLDAP 實現。為了安裝伺服器和用戶端,分別使用下面的命令:

  1. #yum update &&yum install openldap openldap-clients openldap-servers
  2. #yum update &&yum install openldap openldap-clients nss-pam-ldapd

一旦安裝完成,我們還需要關注一些事情。除非顯示地提示,下面的步驟都只在伺服器上執行:

1. 在伺服器和用戶端上,為了確保 SELinux 不會妨礙擋道,長久地開啟下列的布林值:

  1. # setsebool -P allow_ypbind=0 authlogin_nsswitch_use_ldap=0

其中 allow_ypbind 為基於 LDAP 的認證所需要,而 authlogin_nsswitch_use_ldap則可能會被某些應用所需要。

2. 開啟並啟動服務:

  1. #systemctl enable slapd.service
  2. #systemctl start slapd.service

記住你也可以使用 systemctl 來禁用,重新啟動或停止服務:

  1. #systemctl disable slapd.service
  2. #systemctl restart slapd.service
  3. #systemctl stop slapd.service

3. 由於 slapd 服務是由 ldap 使用者來執行的(你可以使用 ps -e -o pid,uname,comm | grep slapd 來驗證),為了使得伺服器能夠更改由管理工具建立的條目,該使用者應該有目錄 /var/lib/ldap 的所有權,而這些管理工具僅可以由 root 使用者來執行(緊接著有更多這方面的內容)。

在遞回地更改這個目錄的所有權之前,將 slapd 的範例資料庫組態檔複製進這個目錄:

  1. #cp/usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
  2. #chown-R ldap:ldap /var/lib/ldap

4. 設定一個 OpenLDAP 管理使用者並設定密碼:

  1. # slappasswd

正如下一幅圖所展示的那樣:

設定 LDAP 管理密碼

然後以下面的內容建立一個 LDIF 檔案(ldaprootpasswd.ldif):

  1. dn: olcDatabase={0}config,cn=config
  2. changetype: modify
  3. add: olcRootPW
  4. olcRootPW:{SSHA}PASSWORD

其中:

  • PASSWORD 是先前得到的經過雜湊處理的字串。
  • cn=config 指的是全域性設定選項。
  • olcDatabase 指的是一個特定的資料庫範例的名稱,並且通常可以在 /etc/openldap/slapd.d/cn=config 目錄中發現。

根據上面提供的理論背景,ldaprootpasswd.ldif 檔案將新增一個條目到 LDAP 目錄中。在那個條目中,每一行代表一個屬性鍵值對(其中 dn,changetype,add 和 olcRootPW 為屬性,每個冒號右邊的字串為相應的鍵值)。

隨著我們的進一步深入,請記住上面的這些,並注意到在這篇文章的餘下部分,我們使用相同的通用名(Common Names) (cn=),而這些餘下的步驟中的每一步都將與其上一步相關。

5. 現在,通過特別指定相對於 ldap 服務的 URI ,新增相應的 LDAP 條目,其中只有 protocol/host/port 這幾個域被允許使用。

  1. # ldapadd -H ldapi:/// -f ldaprootpasswd.ldif

上面命令的輸出應該與下面的影象相似:

LDAP 設定

接著從 /etc/openldap/schema 目錄匯入一個基本的 LDAP 定義:

  1. #fordefin cosine.ldif nis.ldif inetorgperson.ldif;do ldapadd -H ldapi:/// -f /etc/openldap/schema/$def; done

LDAP 定義

6. 讓 LDAP 在它的資料庫中使用你的域名。

以下面的內容建立另一個 LDIF 檔案,我們稱之為 ldapdomain.ldif, 然後酌情替換這個檔案中的域名(在域名部分(Domain Component) dc=) 和密碼:

  1. dn: olcDatabase={1}monitor,cn=config
  2. changetype: modify
  3. replace: olcAccess
  4. olcAccess:{0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth"
  5. read by dn.base="cn=Manager,dc=mydomain,dc=com" read by * none
  6. dn: olcDatabase={2}hdb,cn=config
  7. changetype: modify
  8. replace: olcSuffix
  9. olcSuffix: dc=mydomain,dc=com
  10. dn: olcDatabase={2}hdb,cn=config
  11. changetype: modify
  12. replace: olcRootDN
  13. olcRootDN: cn=Manager,dc=mydomain,dc=com
  14. dn: olcDatabase={2}hdb,cn=config
  15. changetype: modify
  16. add: olcRootPW
  17. olcRootPW:{SSHA}PASSWORD
  18. dn: olcDatabase={2}hdb,cn=config
  19. changetype: modify
  20. add: olcAccess
  21. olcAccess:{0}to attrs=userPassword,shadowLastChange by
  22. dn="cn=Manager,dc=mydomain,dc=com"write by anonymous auth by selfwrite by * none
  23. olcAccess:{1}to dn.base="" by * read
  24. olcAccess:{2}to * by dn="cn=Manager,dc=mydomain,dc=com"write by * read

接著使用下面的命令來載入:

  1. # ldapmodify -H ldapi:/// -f ldapdomain.ldif

LDAP 域名設定

7. 現在,該是新增一些條目到我們的 LDAP 目錄的時候了。在下面的檔案中,屬性和鍵值由一個冒號(:) 所分隔,這個檔案我們將命名為 baseldapdomain.ldif:

  1. dn: dc=mydomain,dc=com
  2. objectClass:top
  3. objectClass: dcObject
  4. objectclass: organization
  5. o: mydomain com
  6. dc: mydomain
  7. dn: cn=Manager,dc=mydomain,dc=com
  8. objectClass: organizationalRole
  9. cn:Manager
  10. description:DirectoryManager
  11. dn: ou=People,dc=mydomain,dc=com
  12. objectClass: organizationalUnit
  13. ou:People
  14. dn: ou=Group,dc=mydomain,dc=com
  15. objectClass: organizationalUnit
  16. ou:Group

新增條目到 LDAP 目錄中:

  1. # ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f baseldapdomain.ldif

新增 LDAP 域名,屬性和鍵值

8. 建立一個名為 ldapuser 的 LDAP 使用者(adduser ldapuser),然後在ldapgroup.ldif 中為一個 LDAP 組建立定義。

  1. # adduser ldapuser
  2. #vi ldapgroup.ldif

新增下面的內容:

  1. dn: cn=Manager,ou=Group,dc=mydomain,dc=com
  2. objectClass:top
  3. objectClass: posixGroup
  4. gidNumber:1004

其中 gidNumber 是 ldapuser 在 /etc/group 中的 GID,然後載入這個檔案:

  1. # ldapadd -x -W -D "cn=Manager,dc=mydomain,dc=com"-f ldapgroup.ldif

9. 為使用者 ldapuser 新增一個帶有定義的 LDIF 檔案(ldapuser.ldif):

  1. dn: uid=ldapuser,ou=People,dc=mydomain,dc=com
  2. objectClass:top
  3. objectClass: account
  4. objectClass: posixAccount
  5. objectClass: shadowAccount
  6. cn: ldapuser
  7. uid: ldapuser
  8. uidNumber:1004
  9. gidNumber:1004
  10. homeDirectory:/home/ldapuser
  11. userPassword:{SSHA}fiN0YqzbDuDI0Fpqq9UudWmjZQY28S3M
  12. loginShell:/bin/bash
  13. gecos: ldapuser
  14. shadowLastChange:0
  15. shadowMax:0
  16. shadowWarning:0

並載入它:

  1. # ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f ldapuser.ldif

LDAP 使用者設定

相似地,你可以刪除你剛剛建立的使用者條目:

  1. # ldapdelete -x -W -D cn=Manager,dc=mydomain,dc=com "uid=ldapuser,ou=People,dc=mydomain,dc=com"

10. 允許有關 ldap 的通訊通過防火牆:

  1. # firewall-cmd --add-service=ldap

11. 最後,但並非最不重要的是使用 LDAP 開啟用戶端的認證。

為了在最後一步中對我們有所幫助,我們將使用 authconfig 工具(一個設定系統認證資源的介面)。

使用下面的命令,在通過 LDAP 伺服器認證成功後,假如請求的使用者的家目錄不存在,則將會被建立:

  1. # authconfig --enableldap --enableldapauth --ldapserver=rhel7.mydomain.com --ldapbasedn="dc=mydomain,dc=com"--enablemkhomedir --update

LDAP 用戶端認證

 

總結

在這篇文章中,我們已經解釋了如何利用一個 LDAP 伺服器來設定基本的認證。若想對當前這個指南裡描述的設定進行更深入的設定,請參考位於 RHEL 系統管理員指南裡的 第 13 章 – LDAP 的設定,並特別注意使用 TLS 來進行安全設定。

請隨意使用下面的評論框來留下你的提問。

RHCE7認證學習筆記23——LDAP和Kerberos  http://www.linuxidc.com/Linux/2015-03/115500.htm

CentOS下Apache+SVN+LDAP的安裝與設定  http://www.linuxidc.com/Linux/2015-03/114627.htm

RHCE 學習筆記(39) - LDAP 伺服器,NFS和autofs  http://www.linuxidc.com/Linux/2015-02/114107.htm

Python 操作LDAP實現使用者統一認證密碼修改功能  http://www.linuxidc.com/Linux/2015-02/113061.htm


via: http://www.tecmint.com/setup-ldap-server-and-configure-client-authentication/

作者:Gabriel Cánepa 譯者:FSSlc 校對:wxy

本文由 LCTT 原創翻譯,Linux中國 榮譽推出

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-10/123814.htm


IT145.com E-mail:sddin#qq.com