[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 %}
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up