LDAP 認證 - Arch Linux 中文维基

跳至內容

# LDAP 認證

出自 Arch Linux 中文维基
翻譯狀態：

- 本文（或部分內容）譯自 LDAP_authentication，最近一次同步於 2024-05-30，若英文版本有所更改，則您可以幫助同步與翻譯更改的內容。
- 您可以在 ArchWiki 的對應頁面找到本文翻譯的原始修訂歷史。
- 本文可能與英文原文存在出入。

相關文章

- OpenLDAP
- 認證管理

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

本指南分為兩部分。第一部分介紹如何安裝和配置 OpenLDAP 服務端。第二部分是如何在客戶端上配置所需的 NSS 和 PAM 模塊。如果您只想將 Arch 加入到已存在的 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`。

注意：請根據實際情況將 exmaple 和 org 修改成對應域名。

    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/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官方文檔。

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

注意：必須為 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. ↑ Name Service Switch (NSS) 是類Unix系統中用於配置如何查找用戶和組信息的服務。它通過 /etc/nsswitch.conf 配置文件定義了系統應如何查詢各種類型的信息，例如用戶帳戶、組帳戶、主機名解析等。 | 博客園:Linux NSS簡介

分類：​

- 網絡
- 認證

LDAP 認證
新增話題