RHCSA 系列(十四): 在 RHEL 7 中設置基於 LDAP 的認證
RHCSA 系列:設置 LDAP 伺服器及客戶端認證 – Part 14
正如你將看到的那樣,關於認證,還存在其他可能的應用場景,但在這篇指南中,我們將只關注基於 LDAP 的認證。另外,請記住,由於這個話題的廣泛性,在這裡我們將只涵蓋它的基礎知識,但你可以參考位於總結部分中列出的文檔,以此來了解更加深入的細節。
基於相同的原因,你將注意到:為了簡潔起見,我已經決定省略了幾個位於 man 頁中 LDAP 工具的參考,但相應命令的解釋是近在咫尺的(例如,輸入 man ldapadd)。
那還是讓我們開始吧。
我們的測試環境
我們的測試環境包含兩台 RHEL 7機器:
Server: 192.168.0.18. FQDN: rhel7.mydomain.com
Client: 192.168.0.20. FQDN: ldapclient.mydomain.com
如若你想,你可以使用在 RHCSA 系列(十二): 使用 Kickstart 完成 RHEL 7 的自動化安裝 中使用 Kickstart 安裝的機子來作為客戶端。
LDAP 是什麼?
LDAP 代表 輕量級目錄訪問協議 ,並包含在一系列協議之中,這些協議允許一個客戶端通過網路去獲取集中存儲的信息(例如所登錄的 shell 的路徑,家目錄的絕對路徑,或者其他典型的系統用戶信息),而這些信息可以從不同的地方訪問到或被很多終端用戶獲取到(另一個例子是含有某個公司所有僱員的家庭地址和電話號碼的目錄)。
對於那些被賦予了許可權可以使用這些信息的人來說,將這些信息進行集中管理意味著可以更容易地維護和獲取。
下面的圖表提供了一個簡化了的關於 LDAP 的示意圖,在下面將會進行更多的描述:
LDAP 示意圖
下面是對上面示意圖的一個詳細解釋。
- 在一個 LDAP 目錄中,一個 條目 代表一個獨立單元或信息,被所謂的 區別名 唯一識別。
- 一個 屬性 是一些與某個條目相關的信息(例如地址,有效的聯繫電話號碼和郵箱地址)。
- 每個屬性被分配有一個或多個 值 ,這些值被包含在一個以空格為分隔符的列表中。每個條目中那個唯一的值被稱為一個 相對區別名 。
接下來,就讓我們進入到有關伺服器和客戶端安裝的內容。
安裝和配置一個 LDAP 伺服器和客戶端
在 RHEL 7 中, LDAP 由 OpenLDAP 實現。為了安裝伺服器和客戶端,分別使用下面的命令:
# yum update && yum install openldap openldap-clients openldap-servers
# yum update && yum install openldap openldap-clients nss-pam-ldapd
一旦安裝完成,我們還需要關注一些事情。除非顯示地提示,下面的步驟都只在伺服器上執行:
1. 在伺服器和客戶端上,為了確保 SELinux 不會妨礙擋道,長久地開啟下列的布爾值:
# setsebool -P allow_ypbind=0 authlogin_nsswitch_use_ldap=0
其中 allow_ypbind
為基於 LDAP 的認證所需要,而 authlogin_nsswitch_use_ldap
則可能會被某些應用所需要。
2. 開啟並啟動服務:
# systemctl enable slapd.service
# systemctl start slapd.service
記住你也可以使用 systemctl 來禁用,重啟或停止服務:
# systemctl disable slapd.service
# systemctl restart slapd.service
# systemctl stop slapd.service
3. 由於 slapd 服務是由 ldap 用戶來運行的(你可以使用 ps -e -o pid,uname,comm | grep slapd
來驗證),為了使得伺服器能夠更改由管理工具創建的條目,該用戶應該有目錄 /var/lib/ldap
的所有權,而這些管理工具僅可以由 root 用戶來運行(緊接著有更多這方面的內容)。
在遞歸地更改這個目錄的所有權之前,將 slapd 的示例資料庫配置文件複製進這個目錄:
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown -R ldap:ldap /var/lib/ldap
4. 設置一個 OpenLDAP 管理用戶並設置密碼:
# slappasswd
正如下一幅圖所展示的那樣:
設置 LDAP 管理密碼
然後以下面的內容創建一個 LDIF 文件(ldaprootpasswd.ldif
):
dn: olcDatabase={0}config,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}PASSWORD
其中:
- PASSWORD 是先前得到的經過哈希處理的字元串。
- cn=config 指的是全局配置選項。
- olcDatabase 指的是一個特定的資料庫實例的名稱,並且通常可以在
/etc/openldap/slapd.d/cn=config
目錄中發現。
根據上面提供的理論背景,ldaprootpasswd.ldif
文件將添加一個條目到 LDAP 目錄中。在那個條目中,每一行代表一個屬性鍵值對(其中 dn,changetype,add 和 olcRootPW 為屬性,每個冒號右邊的字元串為相應的鍵值)。
隨著我們的進一步深入,請記住上面的這些,並注意到在這篇文章的餘下部分,我們使用相同的 通用名 (cn=)
,而這些餘下的步驟中的每一步都將與其上一步相關。
5. 現在,通過特別指定相對於 ldap 服務的 URI ,添加相應的 LDAP 條目,其中只有 protocol/host/port 這幾個域被允許使用。
# ldapadd -H ldapi:/// -f ldaprootpasswd.ldif
上面命令的輸出應該與下面的圖像相似:
LDAP 配置
接著從 /etc/openldap/schema
目錄導入一個基本的 LDAP 定義:
# for def in cosine.ldif nis.ldif inetorgperson.ldif; do ldapadd -H ldapi:/// -f /etc/openldap/schema/$def; done
LDAP 定義
6. 讓 LDAP 在它的資料庫中使用你的域名。
以下面的內容創建另一個 LDIF 文件,我們稱之為 ldapdomain.ldif
, 然後酌情替換這個文件中的域名(在 域名部分 dc=) 和密碼:
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=Manager,dc=mydomain,dc=com" read by * none
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=mydomain,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=mydomain,dc=com
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}PASSWORD
dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by
dn="cn=Manager,dc=mydomain,dc=com" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read
olcAccess: {2}to * by dn="cn=Manager,dc=mydomain,dc=com" write by * read
接著使用下面的命令來載入:
# ldapmodify -H ldapi:/// -f ldapdomain.ldif
LDAP 域名配置
7. 現在,該是添加一些條目到我們的 LDAP 目錄的時候了。在下面的文件中,屬性和鍵值由一個冒號(:)
所分隔,這個文件我們將命名為 baseldapdomain.ldif
:
dn: dc=mydomain,dc=com
objectClass: top
objectClass: dcObject
objectclass: organization
o: mydomain com
dc: mydomain
dn: cn=Manager,dc=mydomain,dc=com
objectClass: organizationalRole
cn: Manager
description: Directory Manager
dn: ou=People,dc=mydomain,dc=com
objectClass: organizationalUnit
ou: People
dn: ou=Group,dc=mydomain,dc=com
objectClass: organizationalUnit
ou: Group
添加條目到 LDAP 目錄中:
# ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f baseldapdomain.ldif
添加 LDAP 域名,屬性和鍵值
8. 創建一個名為 ldapuser 的 LDAP 用戶(adduser ldapuser
),然後在ldapgroup.ldif
中為一個 LDAP 組創建定義。
# adduser ldapuser
# vi ldapgroup.ldif
添加下面的內容:
dn: cn=Manager,ou=Group,dc=mydomain,dc=com
objectClass: top
objectClass: posixGroup
gidNumber: 1004
其中 gidNumber 是 ldapuser 在 /etc/group
中的 GID,然後載入這個文件:
# ldapadd -x -W -D "cn=Manager,dc=mydomain,dc=com" -f ldapgroup.ldif
9. 為用戶 ldapuser 添加一個帶有定義的 LDIF 文件(ldapuser.ldif
):
dn: uid=ldapuser,ou=People,dc=mydomain,dc=com
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: ldapuser
uid: ldapuser
uidNumber: 1004
gidNumber: 1004
homeDirectory: /home/ldapuser
userPassword: {SSHA}fiN0YqzbDuDI0Fpqq9UudWmjZQY28S3M
loginShell: /bin/bash
gecos: ldapuser
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0
並載入它:
# ldapadd -x -D cn=Manager,dc=mydomain,dc=com -W -f ldapuser.ldif
LDAP 用戶配置
相似地,你可以刪除你剛剛創建的用戶條目:
# ldapdelete -x -W -D cn=Manager,dc=mydomain,dc=com "uid=ldapuser,ou=People,dc=mydomain,dc=com"
10. 允許有關 ldap 的通信通過防火牆:
# firewall-cmd --add-service=ldap
11. 最後,但並非最不重要的是使用 LDAP 開啟客戶端的認證。
為了在最後一步中對我們有所幫助,我們將使用 authconfig 工具(一個配置系統認證資源的界面)。
使用下面的命令,在通過 LDAP 伺服器認證成功後,假如請求的用戶的家目錄不存在,則將會被創建:
# authconfig --enableldap --enableldapauth --ldapserver=rhel7.mydomain.com --ldapbasedn="dc=mydomain,dc=com" --enablemkhomedir --update
LDAP 客戶端認證
總結
在這篇文章中,我們已經解釋了如何利用一個 LDAP 伺服器來設置基本的認證。若想對當前這個指南里描述的設置進行更深入的配置,請參考位於 RHEL 系統管理員指南里的 第 13 章 – LDAP 的配置,並特別注意使用 TLS 來進行安全設定。
請隨意使用下面的評論框來留下你的提問。
via: http://www.tecmint.com/setup-ldap-server-and-configure-client-authentication/
作者:Gabriel Cánepa 譯者:FSSlc 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive