這是關於如何配置 Arch Linux 安裝以針對 LDAP 目錄進行身份驗證的指南。LDAP 目錄服務可以是本地的(安裝在同一台計算機上)或網絡中的(例如,在需要集中身份驗證的實驗環境中)。
本指南分為兩部分。第一部分介紹如何安裝和配置 OpenLDAP 服務端。第二部分是如何在客戶端上配置所需的 NSS 和 PAM 模塊。如果您只想將 Arch 加入到已存在的 LDAP 伺服器進行身份驗證,可以跳到第二部分。
服務端配置
安裝
服務端實現軟體如下:
- 389 Directory Server — 這是一個高性能的開源企業級LDAP伺服器,用於存儲和管理身份認證、用戶、群組、組織結構等信息。
- OpenLDAP — 這是一個開源的輕量級LDAP伺服器,用於存儲和管理身份驗證、用戶、組、服務配置等信息。
- ApacheDS——這是Apache軟體基金會下的一個開源項目,提供LADP服務,用於存儲、管理和組織分布式信息如用戶、群組、權限的呢個,支持高度安全性和可擴展性。
https://directory.apache.org/apacheds/
本文檔使用OpenLDAP進行演示,請安裝 OpenLDAP 伺服器並配置伺服器和客戶端。完成此操作後,請返回此處。
訪問控制
為確保LDAP服務中存儲的(已加密)密碼不被他人輕易讀取,但又允許用戶可更改自己的某些屬性(例如自己的密碼或圖片等),需要LDAP配置訪問控制策略,請創建臨時 LDIF 文件 allowpwchange.ldif
。
allowpwchange.ldif
dn: olcDatabase={1}mdb,cn=config changetype: modify replace: olcAccess olcAccess: {0}to attrs=cn,givenName,sn,userPassword,shadowLastChange,mail,loginShell,photo by self write by anonymous auth by dn.base="cn=Manager,dc=example,dc=org" write by * none olcAccess: {1}to * by self read by dn.base="cn=Manager,dc=example,dc=org" write by * read
在資料庫編號 0 (cn=config) 上導入它:
$ slapmodify -n 0 -l allowpwchange.ldif
然後重新啟動 slapd.service
。
導入基本組織架構
創建臨時文件base.ldif
base.ldif
# 域 dn: dc=example,dc=org dc: example o: Example Organization objectClass: dcObject objectClass: organization # 域管理員帳戶 dn: cn=Manager,dc=example,dc=org cn: Manager description: LDAP administrator objectClass: organizationalRole objectClass: top roleOccupant: dc=example,dc=org # 用戶 dn: ou=People,dc=example,dc=org ou: People objectClass: top objectClass: organizationalUnit # 用戶組 dn: ou=Group,dc=example,dc=org ou: Group objectClass: top objectClass: organizationalUnit
導入到域服務中
$ ldapadd -D "cn=Manager,dc=example,dc=org" -W -f base.ldif
使用下面命令檢測是否導入成功
$ ldapsearch -x -b 'dc=example,dc=org' '(objectclass=*)'
導入用戶信息
按照下面模板創建文件user_joe.ldif
user_joe.ldif
dn: uid=johndoe,ou=People,dc=example,dc=org objectClass: top objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount uid: johndoe cn: John Doe sn: Doe givenName: John title: Guinea Pig telephoneNumber: +0 000 000 0000 mobile: +0 000 000 0000 postalAddress: AddressLine1$AddressLine2$AddressLine3 userPassword: {CRYPT}xxxxxxxxxx labeledURI: https://archlinux.org/ loginShell: /bin/bash uidNumber: 9999 gidNumber: 9999 homeDirectory: /home/johndoe/ description: This is an example user
userPassword 條目中的 xxxxxxxxxx
應替換為 /etc/shadow
中的值或使用 slappasswd
命令。使用下面命令導入用戶:
$ ldapadd -D "cn=Manager,dc=example,dc=org" -W -f user_joe.ldif
添加同名的POISX用戶組
group_joe.ldif
dn: cn=joe,ou=Group,dc=example,dc=org objectClass: top objectClass: posixGroup cn: joe gidNumber: 9999
客戶端配置
按照 OpenLDAP 中所述安裝 OpenLDAP 客戶端。確保可以使用 ldapsearch 查詢服務。
在線認證
NSS 配置
NSS[1] 是一種系統工具,它以配置資料庫的形式管理不同的源。例如:/etc/passwd
是 passwd
資料庫的文件類型源,用於存儲用戶帳戶。
安裝 nss-pam-ldapd包 軟體包。
修改/etc/nsswitch.conf
,它是 NSS 的主要配置文件。它定義 NSS 哪些源用於哪些系統資料庫。我們需要將ldap
指令添加到passwd
、group
和shadow
資料庫中,請將配置文件修改至如下所示:
/etc/nsswitch.conf
passwd: files ldap group: files ldap shadow: files ldap
修改/etc/nslcd.conf
配置文件,並將base
和uri
修改為LDAP服務對應的值。
/etc/nslcd.conf
... uri ldap://ldap-server.example.org/ base dc=example,dc=org binddn cn=Manager,dc=example,dc=org bindpw YourPassword ...
重啟服務nslcd.service
。
若配置正確,在客戶端上執行命令:getent passwd
將會列出LDAP服務上面的用戶。
PAM 配置
簡單的PAM配置原則是將pam_ldap.so
配置在任何包含pam_unix.so
的配置文件中。Arch在使用pambase包後有效地減少了編輯量,有關於PAM的更多信息,請查閱RedHat文檔,如果需要可查看nss-pam-ldapd官方文檔。
pam_ldap.so
行的末尾配置包含minimum_uid=10000
或類似值。並必須確保 LDAP 服務可返回與限制匹配的uidNumber
欄位。pam_ldap.so
行時,請不要無故改變其他行的相對順序!只需將LDAP插入到現有鏈中即可。首先修改/etc/pam.d/system-auth
。此文件包含在pam.d
的大多數其他文件中,因此在此處的更改可很好地分發配置。當pambase包更新時可能會更改此文件。
在每個階段的開始位置添加pam_ldap.so
,並將其配置為sufficient,但session階段需要配置為optional。
/etc/pam.d/system-auth
auth sufficient pam_ldap.so auth required pam_unix.so try_first_pass nullok auth optional pam_permit.so auth required pam_env.so account sufficient pam_ldap.so account required pam_unix.so account optional pam_permit.so account required pam_time.so password sufficient pam_ldap.so password required pam_unix.so try_first_pass nullok sha512 shadow password optional pam_permit.so session required pam_limits.so session required pam_unix.so session optional pam_ldap.so session optional pam_permit.so
然後以相同的方式修改文件/etc/pam.d/su
和/etc/pam.d/su-l
,當用戶執行命令:su --login
時,會用到su-l
文件。
在每個階段開始位置添加pam_ldap.so
,但不要放在pam_rootok
的前面,並配置為sufficient,而在auth階段中的pam_unix.so
模塊後面則需要添加use_first_pass
。
/etc/pam.d/su
#%PAM-1.0 auth sufficient pam_rootok.so auth sufficient pam_ldap.so # 取消對以下行的注釋,以默認信任「wheel」組中的用戶。 #auth sufficient pam_wheel.so trust use_uid # 取消對以下行的注釋,以必須要求用戶位於「wheel」組中。 #auth required pam_wheel.so use_uid auth required pam_unix.so use_first_pass account sufficient pam_ldap.so account required pam_unix.so session sufficient pam_ldap.so session required pam_unix.so
若要使用戶能修改自己密碼,需要修改文件/etc/pam.d/passwd
/etc/pam.d/passwd
#%PAM-1.0 password sufficient pam_ldap.so password required pam_unix.so sha512 shadow nullok
登錄時創建主文件夾
若希望在登錄時自動創建主文件夾(註:不打算使用NFS存儲主文件夾情況下),請修改文件/etc/pam.d/system-login
並將pam_mkhomedir.so
添加到任何session階段的「sufficient」項目上方。若需從 ssh、xdm、sddm、gdm 等或在 tty 登錄時會自動創建主文件夾。請以相同的方式修改其他文件,例如當執行命令:su
和su --login
時會使用文件/etc/pam.d/su
和/etc/pam.d/su-l
。如果不想在 ssh 登錄是執行此操作,請修改文件system-local-login
,而不是文件system-login
。
/etc/pam.d/system-login
...未顯示文件頭部... session optional pam_loginuid.so session include system-auth session optional pam_motd.so motd=/etc/motd session optional pam_mail.so dir=/var/spool/mail standard quiet -session optional pam_systemd.so session required pam_env.so session required pam_mkhomedir.so skel=/etc/skel umask=0077
/etc/pam.d/su-l
...未顯示文件頭部... session required pam_mkhomedir.so skel=/etc/skel umask=0077 session sufficient pam_ldap.so session required pam_unix.so
啟用 sudo
要從 LDAP 用戶啟用 sudo,請編輯 /etc/pam.d/sudo。並相應地修改 sudoers。
/etc/pam.d/sudo
#%PAM-1.0 auth sufficient pam_ldap.so auth required pam_unix.so try_first_pass auth required pam_nologin.so
還需要在/etc/openldap/ldap.conf
中添加以下內容:
/etc/openldap/ldap.conf
... sudoers_base ou=sudoers,dc=example,dc=org
用SSSD完成在線和離線認證
SSSD 是一個系統守護程序。它的主要功能是通過一個通用框架提供對身份和身份驗證以及遠程資源的訪問,該框架可以為系統提供緩存和離線支持。它提供PAM和NSS模塊,未來將提供基於D-BUS的接口,用於擴展用戶信息。它還提供了一個資料庫來存儲本地用戶以及擴展用戶數據。
配置sssd
修改sssd配置文件/etc/sssd/sssd.conf
,如果文件不存在請自行創建。
/etc/sssd/sssd.conf
[sssd] config_file_version = 2 services = nss, pam domains = LDAP [domain/LDAP] cache_credentials = true enumerate = true id_provider = ldap auth_provider = ldap ldap_uri = ldap://server1.example.org, ldap://server2.example.org ldap_search_base = dc=example,dc=org ldap_id_use_start_tls = true ldap_tls_reqcert = demand ldap_tls_cacert = /etc/openldap/certs/cacerts.pem chpass_provider = ldap ldap_chpass_uri = ldap://server1.example.org entry_cache_timeout = 600 ldap_network_timeout = 2 # 若 OpenLDAP 支持 posixGroup,可取消注釋以下兩行 # 獲取用戶組成員身份支持(需要注釋下面衝突配置) #ldap_schema = rfc2307 #ldap_group_member = memberUid # 其他 LDAP 服務可能支持的組成員身份功能 ldap_schema = rfc2307bis ldap_group_member = uniqueMember
以上只是一個示例。參見sssd.conf(5) 了解完整的細節。
最後將文件權限chmod 600 /etc/sssd/sssd.conf
,否則 sssd 將無法啟動。
配置 NSS
修改/etc/nsswitch.conf
配置文件如下:
/etc/nsswitch.conf
passwd: files systemd sss group: files [SUCCESS=merge] systemd sss shadow: files systemd sss gshadow: files systemd sudoers: files sss publickey: files hosts: mymachines resolve [!UNAVAIL=return] files myhostname dns networks: files protocols: files services: files ethers: files rpc: files netgroup: files
配置 PAM
首先配置系統認證/etc/pam.d/system-auth
,所有與系統相關的流程都會經過當前文件,每當用戶登錄時,使用sssd模塊進行認證。
/etc/pam.d/system-auth
#%PAM-1.0 auth sufficient pam_sss.so forward_pass auth required pam_unix.so try_first_pass nullok auth optional pam_permit.so auth required pam_env.so account [default=bad success=ok user_unknown=ignore authinfo_unavail=ignore] pam_sss.so account required pam_unix.so account optional pam_permit.so account required pam_time.so password sufficient pam_sss.so password required pam_unix.so try_first_pass nullok sha512 shadow password optional pam_permit.so session required pam_mkhomedir.so skel=/etc/skel/ umask=0077 session required pam_limits.so session required pam_unix.so session optional pam_sss.so session optional pam_permit.so
若向要使用su
命令時通過sssd進行認證,則請按照下面示例修改文件/etc/pam.d/su
。
/etc/pam.d/su
#%PAM-1.0 auth sufficient pam_rootok.so auth sufficient pam_sss.so forward_pass auth required pam_unix.so account [default=bad success=ok user_unknown=ignore authinfo_unavail=ignore] pam_sss.so account required pam_unix.so session required pam_unix.so session optional pam_sss.so
啟用 sudo
按照下面示例修改文件/etc/pam.d/sudo
/etc/pam.d/sudo
#%PAM-1.0 auth sufficient pam_sss.so auth required pam_unix.so try_first_pass auth required pam_nologin.so
配置/etc/sssd/sssd.conf
文件,添加sudo服務和sudo用戶搜索路徑。
/etc/sssd/sssd.conf
[sssd] ... services = nss, pam, sudo ... [domain/LDAP] ... ldap_sudo_search_base = ou=sudoers,dc=example,dc=org ...
或者配置 sudo 以允許所需的 LDAP 用戶使用 sudo。
密碼管理
若要在使用su
登錄時能修改用戶過期密碼,請參照下面示例修改文件/etc/pam.d/su
。
/etc/pam.d/su
#%PAM-1.0 ... auth include system-auth account include system-auth session include system-auth password include system-auth
重啟sshd.service
服務。
若配置正確,使用命令getent passwd LDAP用戶名
或id LDAP用戶名
能查看到用戶信息。
使用用戶登錄後,憑據將被緩存,當 ldap 伺服器脫機或不可用時,仍然能夠使用緩存的憑據進行登錄。
參見
- ↑ Name Service Switch (NSS) 是類Unix系統中用於配置如何查找用戶和組信息的服務。它通過 /etc/nsswitch.conf 配置文件定義了系統應如何查詢各種類型的信息,例如用戶帳戶、組帳戶、主機名解析等。 | 博客園:Linux NSS簡介