出自 Arch Linux 中文维基

這是關於如何配置 Arch Linux 安裝以針對 LDAP 目錄進行身份驗證的指南。LDAP 目錄服務可以是本地的(安裝在同一台計算機上)或網絡中的(例如,在需要集中身份驗證的實驗環境中)。

本指南分為兩部分。第一部分介紹如何安裝和配置 OpenLDAP 服務端。第二部分是如何在客戶端上配置所需的 NSS 和 PAM 模塊。如果您只想將 Arch 加入到已存在的 LDAP 伺服器進行身份驗證,可以跳到第二部分。

LDAP 服務端配置

安裝

LDAP服務端實現軟體如下:

  • 389 Directory Server — 這是一個高性能的開源企業級LDAP伺服器,用於存儲和管理身份認證、用戶、群組、組織結構等信息。
https://www.port389.org/ || 389-ds-base
  • OpenLDAP — 這是一個開源的輕量級LDAP伺服器,用於存儲和管理身份驗證、用戶、組、服務配置等信息。
https://www.openldap.org/ || openldap
  • ApacheDS — 這是Apache軟體基金會下的一個開源項目,提供LADP服務,用於存儲、管理和組織分布式信息如用戶、群組、權限的呢個,支持高度安全性和可擴展性。
    https://directory.apache.org/apacheds/

本文檔使用OpenLDAP進行演示,請安裝 OpenLDAP 伺服器 並配置伺服器客戶端。完成此操作後,請返回此處。

訪問控制

為確保LDAP服務中存儲的(已加密)密碼不被他人輕易讀取,但又允許用戶可更改自己的某些屬性(例如自己的密碼或圖片等),需要LDAP配置訪問控制策略,請創建臨時 LDIF 文件 allowpwchange.ldif

注意: 請根據實際情況將 exmapleorg 修改成對應域名。
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
提示:還可以使用 PADL 軟體的 openldap-migrationtoolsAUR 自動將所有本地帳戶(和組等)遷移到 LDAP 服務中。

客戶端配置

按照 OpenLDAP 中所述安裝 OpenLDAP 客戶端。確保可以使用 ldapsearch 查詢服務。

根據需求,選擇僅在線身份驗證或在線和離線身份驗證。

在線認證

NSS 配置

NSS[1] 是一種系統工具,它以配置資料庫的形式管理不同的源。例如:/etc/passwdpasswd 資料庫的文件類型源,用於存儲用戶帳戶。

安裝 nss-pam-ldapd 軟體包。

修改/etc/nsswitch.conf,它是 NSS 的主要配置文件。它定義 NSS 哪些源用於哪些系統資料庫。我們需要將ldap指令添加到passwdgroupshadow資料庫中,請將配置文件修改至如下所示:

/etc/nsswitch.conf
passwd: files ldap
group: files ldap
shadow: files ldap

修改/etc/nslcd.conf配置文件,並將baseuri修改為LDAP服務對應的值。

/etc/nslcd.conf
...
uri ldap://127.0.0.1/
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官方文檔。

提示:若想防止 UID 與系統上的本地用戶發生衝突,需要在pam_ldap.so行的末尾配置包含minimum_uid=10000 或類似值。並必須確保 LDAP 服務可返回與限制匹配的uidNumber欄位。
注意: 每個階段(auth、session、password、account)都構成一個獨立的鏈,其順序至關重要。帶有sufficient的行有時會「短路」,會跳過該階段的其餘內容,因此對於authpasswordaccount階段來說,需要在required行之前添加sufficient行,而在session階段則是放在required行之後;optional幾乎是放在最後。添加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 登錄時會自動創建主文件夾。請以相同的方式修改其他文件,例如當執行命令:susu --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的接口,用於擴展用戶信息。它還提供了一個資料庫來存儲本地用戶以及擴展用戶數據。

注意: 必須為 LDAP 伺服器配置TLS加密,否則 SSSD 將不起作用。

安裝 sssd

配置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
注意: 如果在用 GNOME/Keyring,當在 PAM 文件的開頭添加 'sufficient' 會導致 Gnome Keyring 無法解鎖。有關解決方案,請查看高級 PAM 配置。

若向要使用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 伺服器脫機或不可用時,仍然能夠使用緩存的憑據進行登錄。

參見

  1. NSS(Name Service Switch, 名稱服務開關)是類unix作業系統中的一種工具,它為通用配置資料庫和名稱解析機制提供了各種來源。這些源文件包括本地作業系統文件(例如:/etc/passwd、/etc/group和/etc/hosts)、域名系統(DNS)、網絡信息服務(NIS)和LDAP。| 博客園:Linux NSS簡介