LDAP 問世也已經有相當長的一段時間了,
一直以來都沒有什麼時間去玩它,
隨著實驗室的 hosts 和 services 越來越多,
也逐漸有了類似的需求,
所以最近下定決心抽出三天時間來實驗它。
跟五六年前不同的是,
現在設定 OpenLDAP 的中文資料已經算是唾手可得了,
書上的資料有些已經很舊了,
除了觀念以外的部分其實都派不上什麼用場,
網路上的資料在透過書本建立了基本概念後其實都覺得沒什麼,
有些東西還是得靠自己動手查英文文件和測試才行。
軟體版本的話,
OpenLDAP 2.4.x 可以很輕易的在 FreeBSD 上安裝,
不過 Gentoo 的 2.4.x 還是被 mask 起來的,
而且似乎 mask 很久了一直說需要測試但是都沒人測的樣子,
用正常方式安裝的話只能裝到 2.3.x。
其實基本設定上並沒有什麼了不起的,
重點是 TLS 的設定真的是需要摸一下才行,
書上一堆 option name 都不再支援了,
沒有 TLS 的話那實在是太不安全了,
所以不可能放棄掉它,
FreeBSD 的 /etc/rc.conf 不必照 ports 安裝完的提示寫,
只要這樣就可以了:
1 2 |
slapd_enable="YES" slapd_flags='-h "ldap://ldap.xxx.org/"' |
現在測出來在 FreeBSD 上最穩定 TLS 設法是在 slapd.conf 加入:
1 2 3 4 5 |
TLSCipherSuite HIGH:MEDIUM:+SSLv2:+SSLv3:TLSv1 TLSCACertificateFile <CA cert 的路徑> TLSCertificateFile <cert 的路徑> TLSCertificateKeyFile <private key 的路徑> TLSVerifyClient never |
值得注意的是因為 slapd 在讀 key 和 certs 時並不是以 root 身份去讀的,
所以必須是 slapd 這個 user 可以存取到的路徑才行。
至於 client 端的話,
目前一定可行的設定方式是在 ldap.conf 和 nss_ldap.conf 加入下面這幾行:
1 2 3 |
ssl start_tls tls_checkpeer no tls_reqcert allow |
雖說不是最安全但也很夠了,
畢竟要是不能 work 的話就什麼都別談了,
如果 tls_checkpeer 設成 yes 的話就要額外指定 server 的 CA 路徑,
不過在某些狀況下就算指定了它還是會認為 CA 非法;
這兩個設定檔因為長得完全一樣所以其實可以用 symbolic link 搞出 nss_ldap.conf,
網路上和書上普遍也是這樣教,
當然如果有特殊需求的話 (像是分攤 ldap servers 的負載) 還是可以分開來做設定;
正確啟動 TLS 還有一個非常大的要素存在,
那就是 ldap.conf 和 nss_ldap.conf 的 host 和 uri 必須跟憑證的 Common Name 相符,
範例檔和很多網路上教都教人填 127.0.0.1 這種 ip address 是會有問題的,
反正原則就跟 apache 的 SSL 憑證設定差不多,
譬如這樣設定的話:
1 2 |
host ldap.xxx.org uri ldap://ldap.xxx.org/ |
那麼憑證的 Common Name 欄位就要是 ldap.xxx.org 才行,
不過憑證的 Common Name 其實可以支援多個 names,
高興的話可以在申請憑證時把 xxx.org 和 ip address 都填進去;
此外因為 rc.conf 沒有設定 socket file,
所以 ldapi:// 那行可以 mark 掉,
而且我們只使用 TLS 所以 uri ldaps:// 也是不用設。
書上有說 nss 在沒有指定 uri 的狀況下,
client 會直接去查 DNS 的 SRV record,
以上面的例子來說只要有一筆 _ldap._tcp.xxx.org 的 SRV record 就可以了,
看它會指到哪台 ldap server 上那 nss_ldap 模組就會去那台要資料,
我是有特別去設了一下,
如果沒有可控管的 domain name 就算了。
至於改 /etc/pam.d/* 和 /etc/nsswitch.conf 的方法,
網路上和書上教的其實都還適用於現代所以就不特別提了,
反正新加的 pam_ldap.so 那行原則上一定要放在原有的 pam_unix.so 那行之前,
記住這個原則的話就不會遇上什麼大問題;
基礎指令的整合方面,
Gentoo 是可以直接用 passwd 改 LDAP 帳號的密碼,
反倒是 FreeBSD 在這點就意外的弱很多了,
必須自己寫程式去達成相同目的,
否則就得要 user 自己打一大串指令才做得到相同功能。
跟 samba 接的話 smb.conf 要寫這些:
1 2 3 4 5 6 7 8 9 |
passdb backend = ldapsam:ldap://ldap.xxx.org ldap admin dn = "cn=Manager,dc=xxx,dc=org" ldap ssl = start_tls ldap user suffix = ou=people ldap group suffix = ou=group ldap machine suffix = ou=computers ldap suffix = dc=xxx,dc=org ldap passwd sync = on |
然後用 smbpasswd -w
不想直接用 ldap root 帳號的話也可以開像是 smbadmin 的帳號,
這樣設只是省麻煩;
因為 samba 的基本指令有直接跟 LDAP 整合,
所以用 smbpasswd 開帳號時就會把相關的東西設定好了,
要特別注意的是 samba 用的密碼欄位跟其它 service 是分開的。
apache 的 .htaccess 也能直接用 LDAP 帳號認證,
下面是給 apache 2.2 用的範例:
1 2 3 4 5 6 |
AuthType Basic AuthName "Name" AuthBasicProvider "ldap" AuthLDAPURL ldap://ldap.xxx.org/ou=people,dc=xxx,dc=org?uid?sub?(objectClass=posixAccount) TLS AuthzLDAPAuthoritative off Require valid-user |
目前只有在跟 ldap 帳號同一台機器上測過,
不同台的話可能需要設定憑證路徑和憑證檢查的選項,
等確定以後再來更新資料吧。