post by tommy @ 22 三月, 2017 10:42
Apache 本身有 mod_authnz_ldap 這個模組可以支援 ldap 的認證. 使用上並不困難, 使用下列的設定就可以:
<Location />
AuthName "Enter AD's Username/Password"
AuthType Basic
AuthBasicProvider ldap
AuthLDAPBindDN "CN=xxx,CN=Users,DC=xxx,DC=xxx,DC=xxx,DC=xx"
AuthLDAPBindPassword "password"
AuthLDAPURL "ldap://adserver:3268/DC=xxx,DC=xxx,DC=xxx,DC=xx?sAMAccountName?sub?(objectClass=*)"
AuthLDAPGroupAttributeIsDN on
require ldap-group CN=DEPT_xxx,DC=xxx,DC=xxx,DC=xxx,DC=xx
require ldap-user xxx
ErrorDocument 401 "Please use AD's username and password to login."
</Location>
是先透過一個帳號去 bind, 然後檢查帳號密碼是否正確, 再去判斷是否在允許的帳號或群組內.
我們用上面的設定跑了一陣子, 最近因為群組的設定有些變動, 會有 nested group 的情形, 就是群組內有另一個群組, 並不是直接是使用者. 這時發現上面的設定就不能正常運作了.
依據 AuthLDAPMaxSubGroupDepth 的預設值, 應該會檢查 10 層內的群組成員才對, 不過... 實際上就是不能用.
試了一陣子, 發現在 AuthLDAPSubGroupClass 的預設值只有 groupOfNames groupOfUniqueNames 這兩個, 而在 Windows AD 裡頭, 群組的 objectClass 屬性是 top; group, 所以 apache 在查詢時, 並不知道那是一個群組.
AuthLDAPSubGroupClass group
加上這個設定後, 重啟 apache 就可以正常的驗證到子群組的成員了.