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 %}