読者です 読者をやめる 読者になる 読者になる

たごもりすメモ

コードとかその他の話とか。

mod_authnz_ldapを使ったときのユーザ名の扱いについて

Apache

さくっとメモっておく。昨夜調べてた限りだと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 というような変数に入れてくれるようだ。HOGELDAPサーバから返ってくる属性値でないといけない。
いっぽう 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には入るんだよなー。謎。コードを追えばいいんだけど。