mod_authnz_ldapを使ったときのユーザ名の扱いについて
さくっとメモっておく。昨夜調べてた限りだとWeb上でぜんぜんうまいこと情報が見付けられなかったので。
mod_proxy でリバースプロキシを構成するんだけど認証だけは面倒だからApache上で mod_authnz_ldap でやりたい! ということはある。よくある。あるよね?
だいたいこんな感じで設定を書くはず。VirtualHostの中だと思いねえ。
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
<Proxy *>
AllowOverride None
AuthName "app auth"
AuthType Basic
AuthBasicProvider ldap
AuthLDAPUrl "ldap://ldapserver:389/ou=Users,dc=tagomor,dc=is?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN "cn=bindname,dc=tagomor,dc=is"
AuthLDAPBindPassword HOGEPOS
Require valid-user
</Proxy>で、そういうときに認証したユーザ名をバックエンドのアプリケーションに渡したい。普通のCGIとかだと REMOTE_USER を見ろということだけどHTTPリクエスト経由なので X-Forwarded-User ヘッダとかに埋めようという話になる。
mod_auth_basic だと mod_rewrite 使って云々という話がよくWebに転がってるんだけど、これは mod_authnz_ldap ではうまくいかない。
mod_authnz_ldapの場合
REMOTE_USERにはそもそもユーザ名がちゃんと入ってない*1。じゃあどうするのかというと AUTHENTICATE_HOGE というような変数に入れてくれるようだ。HOGEはLDAPサーバから返ってくる属性値でないといけない。
いっぽう mod_rewrite を使って云々というのは必要ない。ということで、以下のように書けば、バックエンドのアプリケーションサーバへのリクエストにおいては X-Forwarded-User ヘッダにきちんとユーザ名が入っていくことになる。
ProxyPass / http://localhost:5000/
ProxyPassReverse / http://localhost:5000/
<Proxy *>
AllowOverride None
AuthName "app auth"
AuthType Basic
AuthBasicProvider ldap
AuthLDAPUrl "ldap://ldapserver:389/ou=Users,dc=tagomor,dc=is?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN "cn=bindname,dc=tagomor,dc=is"
AuthLDAPBindPassword HOGEPOS
Require valid-user
RequestHeader set X-Forwarded-User %{AUTHENTICATE_SAMACCOUNTNAME}e
</Proxy>やったね!
*1:んだけどログのremote userには入るんだよなー。謎。コードを追えばいいんだけど。