---
# System prepended metadata

title: Slurm / 管理 user / 使用 LDAP 或 SSSD 管理 user
tags: [SSSD, Slurm, Linux, LDAP, user, Slinky, SlinkyProject, HPC]

---

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