Slurm / 管理 user / 使用 LDAP 或 SSSD 管理 user === ###### tags: `Slurm` ###### tags: `Slurm`, `HPC`, `Linux`, `Slinky`, `SlinkyProject`, `user`, `LDAP`, `SSSD` <br> [TOC] <br> :::success ### 🎯 LDAP 或 SSSD 的導入教學範例 > by gpt-5 (2025/08/28) 下面提供兩套**彼此獨立**、可直接動手做的導入教學範例: * 教學 A:**OpenLDAP(LDAP 伺服器)+ nslcd 客戶端** * 教學 B:**SSSD 客戶端(連到既有的 LDAP,例如 OpenLDAP/AD)** > 系統以 Debian/Ubuntu 為例;RHEL 系改動處我也在關鍵步驟附註。 ::: <br> --- # 教學 A:OpenLDAP 伺服器 + nslcd 客戶端 ## A.1 伺服器端(建立 LDAP 目錄與使用者) > 目標網域:`dc=example,dc=org`;請按需替換。 > 建議先準備一台專責 LDAP 主機(或 VM)。 ### 1) 安裝套件 ```bash sudo apt update sudo apt install -y slapd ldap-utils # 若未詢問參數,可重設: sudo dpkg-reconfigure slapd # 依精靈設定: # - DNS domain name: example.org # - Organization name: Example Org # - Administrator password: <自訂> # - Database backend: MDB # - Do you want the database to be removed when slapd is purged? No # - Move old database? Yes ``` ### 2) 準備基本的 OU / 群組 / 使用者(LDIF) 先產生密碼雜湊(供 userPassword 使用): ```bash slappasswd # 輸出類似 {SSHA}h3H8... 請複製起來,稍後貼到 user LDIF ``` `base.ldif`(建立 People 與 Groups 的組織單位): ```ldif dn: ou=People,dc=example,dc=org objectClass: organizationalUnit ou: People dn: ou=Groups,dc=example,dc=org objectClass: organizationalUnit ou: Groups ``` `group-dev.ldif`(建立一個 posix 群組): ```ldif dn: cn=dev,ou=Groups,dc=example,dc=org objectClass: posixGroup cn: dev gidNumber: 20000 ``` `user-alice.ldif`(建立一個可登入的帳號,帶 posix 屬性): ```ldif dn: uid=alice,ou=People,dc=example,dc=org objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount cn: Alice Example sn: Example uid: alice uidNumber: 20011 gidNumber: 20000 loginShell: /bin/bash homeDirectory: /home/alice mail: alice@example.org userPassword: {SSHA}<把 slappasswd 產生的雜湊貼在這裡> ``` 匯入: ```bash # 以管理者身分新增資料(會要你輸入 admin 密碼) ldapadd -x -D "cn=admin,dc=example,dc=org" -W -H ldap://localhost -f base.ldif ldapadd -x -D "cn=admin,dc=example,dc=org" -W -H ldap://localhost -f group-dev.ldif ldapadd -x -D "cn=admin,dc=example,dc=org" -W -H ldap://localhost -f user-alice.ldif ``` 驗證: ```bash ldapsearch -x -H ldap://localhost -b "dc=example,dc=org" "(uid=alice)" uid uidNumber gidNumber ``` > (可選)**啟用 TLS**:生憑證後在 `cn=config` 下設定 `olcTLSCertificateFile/Key`,並在 `/etc/default/slapd` 啟用 `ldaps:///`。若用 Let’s Encrypt,更容易維護。此處略。 --- ## A.2 Linux 客戶端以 **nslcd(nss-pam-ldapd)** 連 LDAP ### 3) 安裝與設定 ```bash sudo apt install -y libnss-ldapd libpam-ldapd nslcd # 若跳出 debconf 問答,填: # - LDAP server URI: ldap://<ldap-server-FQDN-or-IP>/ # - Distinguished name of the search base: dc=example,dc=org # - LDAP version: 3 # - Make local root Database admin: No # - Does the LDAP database require login? 依需求(通常否) ``` 手動調整 `/etc/nslcd.conf`(重要節選): ```ini uid nslcd gid nslcd uri ldap://ldap.example.org/ base dc=example,dc=org # 若啟用 TLS(StartTLS 或 LDAPS): # ssl start_tls # tls_reqcert demand # tls_cacertfile /etc/ssl/certs/ca-example-org.crt # 若需要唯讀 bind: # binddn cn=readonly,dc=example,dc=org # bindpw <readonly-password> ``` `/etc/nsswitch.conf` 加上 `ldap`: ``` passwd: files ldap group: files ldap shadow: files ldap ``` 啟用自動建立家目錄(Ubuntu/Debian): ```bash echo 'session required pam_mkhomedir.so skel=/etc/skel umask=0077' \ | sudo tee -a /etc/pam.d/common-session ``` 重啟服務並測試: ```bash sudo systemctl restart nslcd getent passwd alice # 預期輸出含 alice:...:20011:20000:...:/home/alice:/bin/bash sudo su - alice whoami && id ``` > RHEL/CentOS:安裝 `nss-pam-ldapd` 後調整 `/etc/nslcd.conf`;NSS 改為 `files ldap`;PAM 用 `authselect` 啟用對應 profile 與 `mkhomedir`。 --- # 教學 B:SSSD 客戶端(推薦;連 OpenLDAP 或 AD) > **SSSD** 由系統端提供 NSS 與 PAM,一般比 nslcd 更穩定、快取能力更好。 > 前提:你的 LDAP 目錄已具備 **RFC2307**(posixAccount/posixGroup)屬性,或 AD 已啟用對應屬性。 ## B.1 安裝 ```bash sudo apt update sudo apt install -y sssd sssd-ldap sssd-tools libnss-sss libpam-sss # RHEL:sudo dnf install -y sssd sssd-ldap oddjob-mkhomedir ``` ## B.2 設定 `/etc/sssd/sssd.conf`(權限務必 600) ```bash sudo bash -c 'cat > /etc/sssd/sssd.conf' <<'SSS' [sssd] services = nss, pam config_file_version = 2 domains = ldap [domain/ldap] id_provider = ldap auth_provider = ldap chpass_provider = ldap ldap_schema = rfc2307 # 依你的 LDAP 調整:可用 ldaps:// 或 ldap:// + StartTLS ldap_uri = ldaps://ldap.example.org ldap_search_base = dc=example,dc=org # 只查特定 OU(建議) ldap_user_search_base = ou=People,dc=example,dc=org ldap_group_search_base = ou=Groups,dc=example,dc=org # 供查詢/驗證的 bind(唯讀帳號;若匿名可省略) ldap_default_bind_dn = cn=readonly,dc=example,dc=org ldap_default_authtok = <readonly-password> # TLS 設定:若用 ldaps,此項可不啟用 start_tls # ldap_id_use_start_tls = true ldap_tls_cacert = /etc/ssl/certs/ca-example-org.crt # 家目錄與 shell fallback_homedir = /home/%u ldap_user_shell = /bin/bash # 其他建議 cache_credentials = true enumerate = false access_provider = simple # 僅允許 dev 群組登入(可選) # simple_allow_groups = dev SSS sudo chmod 600 /etc/sssd/sssd.conf sudo chown root:root /etc/sssd/sssd.conf ``` `/etc/nsswitch.conf` 改為使用 `sss`: ``` passwd: files sss group: files sss shadow: files sss ``` 啟用自動建立家目錄(Ubuntu/Debian): ```bash echo 'session required pam_mkhomedir.so skel=/etc/skel umask=0077' \ | sudo tee -a /etc/pam.d/common-session ``` > RHEL/CentOS: > > ```bash > sudo authselect select sssd with-mkhomedir --force > ``` 啟動並測試: ```bash sudo systemctl enable --now sssd # 檢視 domain sudo sssctl domain-list # 查使用者 sudo sssctl user-show alice || true # 一般 NSS/PAM 測試 getent passwd alice sudo su - alice whoami && id ``` **快取管理與除錯:** ```bash # 清快取(變更屬性後) sudo sss_cache -E # 觀看日誌 journalctl -u sssd -f ``` **改用 StartTLS(非 ldaps)時:** ```ini ldap_uri = ldap://ldap.example.org ldap_id_use_start_tls = true ldap_tls_cacert = /etc/ssl/certs/ca-example-org.crt ``` --- ## 何時選 A 或 B? * 你**同時**需要建置 LDAP 伺服器與輕量客戶端 → **教學 A(OpenLDAP + nslcd)** * 你的 LDAP/AD 已存在、追求較佳快取/穩定性 → **教學 B(SSSD;建議)** > 多台機器時,請使用 **相同設定檔與相同 CA 憑證**,並以 `getent passwd <user>` 驗證每台主機都能解析到一致的 UID/GID。 --- ## 快速檢核清單(兩種做法皆適用) * [ ] `ldapsearch` 能查到使用者與群組 * [ ] 客戶端 `getent passwd <user>` 回傳含 `uidNumber/gidNumber` * [ ] 可 `su - <user>`,且家目錄自動建立成功 * [ ] 若使用 TLS/StartTLS,客戶端已安裝正確 CA 並驗證通過 * [ ] 多台主機上 `getent passwd <user>` 的 UID/GID **一致** 需要我把上述步驟包成一鍵安裝腳本(含範例 LDIF 與 `sssd.conf`/`nslcd.conf` 範本)嗎?我可以直接給你可複製的 `setup_ldap.sh` 與 `setup_sssd.sh`。 <br> {%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}