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には入るんだよなー。謎。コードを追えばいいんだけど。