---
# System prepended metadata

title: '[Ubuntu] 在 Ubuntu 上設定 ldapd 的詳細教學'
tags: [ldapd, LDAP, Ubuntu]

---

[Ubuntu] 在 Ubuntu 上設定 ldapd 的詳細教學
===
###### tags: `LDAP`
###### tags: `LDAP`, `Ubuntu`, `ldapd`

<br>

[TOC]

<br>


> NSS/PAM 直接走 LDAP、不經 SSSD）」的做法。
> by gpt-5 (2025/10/18)

## 一、安裝正確套件（選擇 *ldapd/nslcd* 路線）

```bash
sudo apt update
sudo apt install -y libnss-ldapd libpam-ldapd nslcd
# 建議不要同時啟用 SSSD：之後會把 nsswitch 裡的 `sss` 拿掉
```

> **為什麼不是 libnss-ldap / libpam-ldap？**
> 舊的 *libnss-ldap* 由每個程式自己打 LDAP，常造成卡死；*libnss-ldapd* 透過 **nslcd** 常駐程序統一連線，較穩定。兩者都屬於「模式二」。

---

<br>

## 二、設定 nslcd（LDAP 連線與屬性對映）

編輯 **/etc/nslcd.conf**（以下示範，請改成你的實際 DN、Server、CA）：

```conf
uid nslcd
gid nslcd
uri ldap://openldap.openldap:389
base dc=www,dc=asus,dc=com

# 服務帳號（若匿名不可查）
binddn cn=system@ci.asus.com,ou=users,dc=cloud-infra,dc=asus,dc=com,dc=tw
bindpw system

# 物件與欄位對映（你的目錄若用自訂屬性，這裡要對映）
filter passwd (objectClass=posixAccount)
filter shadow (objectClass=shadowAccount)
filter group  (objectClass=posixGroup)
# 例：若 uid 用 userAccount，則：
map    passwd uid            userAccount
map    passwd gecos          cn
map    passwd homeDirectory  homeDirectory
map    passwd loginShell     loginShell

# TLS（強烈建議）
ssl start_tls
tls_reqcert demand
tls_cacertfile /etc/ssl/certs/your-openldap-ca.crt

# 時間/錯誤處理（避免網路壞掉時卡很久）
bind_timelimit 5
timelimit 10
reconnect_sleeptime 2
```

另外放一份 **/etc/ldap/ldap.conf**（客戶端全域設定）：

```conf
URI ldap://openldap.openldap:389
BASE dc=www,dc=asus,dc=com
TLS_CACERT /etc/ssl/certs/your-openldap-ca.crt
TLS_REQCERT demand
```

---

<br>

## 三、讓 NSS 走 LDAP（取代 sss）

編輯 **/etc/nsswitch.conf**，把 `sss` 拿掉，改成：

```conf
passwd: files ldap
group:  files ldap
shadow: files ldap
```

> 不要同時放 `sss` 與 `ldap`，否則查詢路徑會混亂。

---

<br>

## 四、讓 PAM 走 LDAP（登入驗證）

最簡單用工具：

```bash
sudo pam-auth-update
# 勾選：LDAP Authentication
#（可選）Create home directory on login
```

或手動（Ubuntu 的 PAM 共用檔）：

* **/etc/pam.d/common-auth**

  ```
  auth    [success=1 default=ignore] pam_ldap.so try_first_pass
  ```
* **/etc/pam.d/common-account**

  ```
  account sufficient pam_ldap.so
  ```
* **/etc/pam.d/common-password**

  ```
  password sufficient pam_ldap.so use_authtok
  ```
* **/etc/pam.d/common-session**

  ```
  session optional   pam_mkhomedir.so umask=0077 skel=/etc/skel
  session optional   pam_ldap.so
  ```

---

<br>

## 五、啟動並測試

```bash
sudo systemctl restart nslcd
getent passwd tj_tsai
id tj_tsai
# 驗證 PAM 登入路徑
sudo su - tj_tsai        # 或以 SSH 測試
```

---

<br>

## 六、確保「每次都連網」的行為

* **不要安裝/啟用 nscd 或 sssd 的快取**（`sudo apt purge nscd sssd*`）。
* nslcd 沒有離線快取（與 SSSD 相比），網路壞掉時會依 `bind_timelimit/timelimit` 超時並失敗，正符合「模式二」特性。

---

<br>

## 七、常見問題

* **卡很久才登入**：調小 `bind_timelimit/timelimit`，確保 LDAP 不通就快失敗；也檢查 DNS/防火牆/TLS 憑證。
* **找不到使用者**：確認 `filter` 與 `map` 是否符合你的 schema（例如你用 `userAccount` 當 uid，就一定要 `map passwd uid userAccount`）。
* **家目錄不存在**：啟用 `pam_mkhomedir.so`（上面已示範）。
* **容器/Pod 內沒有 systemd**：用前景模式啟動 `nslcd` 測試：

  ```bash
  /usr/sbin/nslcd -d
  ```

  另外 `getent/id/su` 一樣可測 NSS/PAM 流程。


<br>

{%hackmd vaaMgNRPS4KGJDSFG0ZE0w %}