使用 ldap-user 的 Apache2 OpenLDAP 授權失敗
我有一個在 Docker 容器中執行的 Apache2 伺服器(httpd:2.4.54-bullseye)和一個 LDAP 伺服器(Debian 11.1 上的 OpenLDAP slapd 2.4.57+dfsg-3)
我正在嘗試使用
mod_authnz_ldap
Apache 模組對來自 LDAP 的某些使用者進行身份驗證。這是 Apache 的配置:
<AuthnProviderAlias ldap org> AuthLDAPURL ldap://org.com/dc=org,dc=com?uid </AuthnProviderAlias> <VirtualHost _default_:80> ServerAdmin webmaster@localhost DocumentRoot /usr/local/apache2/htdocs <Location "/"> AuthName "Apache2 LDAP Check" AuthType Basic AuthBasicProvider org Require ldap-user me collegue1 collegue2 </Location> </VirtualHost>
根據文件,我應該只將 uids 放入
Require ldap-user
.日誌顯示認證成功,但無法授權
Require ldap-user
!!web_auth | [Tue Aug 30 09:09:13.594015 2022] [authz_core:debug] [pid 10:tid 139920102389504] mod_authz_core.c(815): [client 192.168.103.66:2189] AH01626: authorization result of Require ldap-user me collegue1 collegue2: denied (no authenticated user yet) web_auth | [Tue Aug 30 09:09:13.594064 2022] [authz_core:debug] [pid 10:tid 139920102389504] mod_authz_core.c(815): [client 192.168.103.66:2189] AH01626: authorization result of <RequireAny>: denied (no authenticated user yet) web_auth | [Tue Aug 30 09:09:13.594137 2022] [authnz_ldap:debug] [pid 10:tid 139920102389504] mod_authnz_ldap.c(548): [client 192.168.103.66:2189] AH01691: auth_ldap authenticate: using URL ldap://org.com/dc=org,dc=com?uid web_auth | [Tue Aug 30 09:09:13.599377 2022] [authnz_ldap:debug] [pid 10:tid 139920102389504] mod_authnz_ldap.c(630): [client 192.168.103.66:2189] AH01697: auth_ldap authenticate: accepting me web_auth | [Tue Aug 30 09:09:13.599404 2022] [authz_core:debug] [pid 10:tid 139920102389504] mod_authz_core.c(815): [client 192.168.103.66:2189] AH01626: authorization result of Require ldap-user me collegue1 collegue2: denied web_auth | [Tue Aug 30 09:09:13.599411 2022] [authz_core:debug] [pid 10:tid 139920102389504] mod_authz_core.c(815): [client 192.168.103.66:2189] AH01626: authorization result of <RequireAny>: denied web_auth | [Tue Aug 30 09:09:13.599417 2022] [authz_core:error] [pid 10:tid 139920102389504] [client 192.168.103.66:2189] AH01631: user me: authorization failure for "/":
我錯過了什麼嗎?
PS:當我使用
Require valid-user
一切工作正常!
我錯過了什麼嗎?
可能!今天早上我在玩這個配置,我看到你描述的完全一樣的行為。首先,我的測試配置如下所示:
<AuthnProviderAlias ldap example> AuthLDAPURL ldap://ldap/ou=users,dc=example,dc=com?cn AuthLDAPBindDN uid=authreader,ou=system,dc=example,dc=com AuthLDAPBindPassword secret </AuthnProviderAlias> <Location "/"> AuthName "LDAP" AuthType Basic AuthBasicProvider example Require ldap-user user1 </Location>
我有一個 LDAP 目錄,
dc=example,dc=com
其中包括cn=user1,ou=users,dc=example,dc=com
和cn=user2,ou=users,dc=example,dc=com
.我在我的伺服器中啟用了調試日誌記錄 (
LogLevel debug
),並在我看到的身份驗證嘗試期間查看日誌:... AH01697: auth_ldap authenticate: accepting user1 ... AH01626: authorization result of Require ldap-user user1: denied
這很有趣,因為它表明
mod_authnz_ldap
正確地驗證了使用者。憑直覺,我替換了:Require ldap-user user1
和:
Require user user1
令我驚訝的是,一切都剛剛好。所以,這很好,但這是否意味著所有文件都是錯誤的?這似乎不太可能。據我所知,這與
AuthnProviderAlias
指令的使用有關。我嘗試用 替換
Require ldap-user user1
,Require example-user user1
認為這ldap-
部分應該是提供者名稱,但失敗了:Unknown Authz provider: example-user
所以我嘗試了一個不使用提供者別名的配置:
<Location "/"> AuthLDAPURL ldap://ldap/ou=users,dc=example,dc=com?cn AuthLDAPBindDN uid=authreader,ou=system,dc=example,dc=com AuthLDAPBindPassword secret AuthName "LDAP" AuthType Basic AuthBasicProvider ldap Require ldap-user user1 </Location>
這也可以正常工作,我認為這證實了我的理論,即罪魁禍首是提供者別名。
基於上述結果,我的理論是存在錯誤。看起來這方面以前有過一些麻煩,請參見例如https://stackoverflow.com/questions/18874062/can-authnprovideralias-ldap-work-with-apache2-4-x。
Require ldap-group
如果您需要 , 之類的東西Require ldap-group
來工作(除了Require ldap-user
),看起來唯一的解決方案是將 AuthLDAP 指令嵌入到與Require
語句相同的 location/directory/etc 塊中。如果您只需要Require user ...
orRequire valid-user
,那麼使用別名應該可以正常工作。我將嘗試 ping 其他一些人,以確認我們都沒有 遺漏文件中的某些內容。
你可以在這裡找到所有這些的測試環境。