apache-2.2でmod_authnz_externalを使う
小さなwebサーバ兼日常生活計算機の場合、webdavしたいときとか、unixアカウントとwebサーバの認証に使うアカウントを同じにしたい場合、apache-2.0.xであればmod_auth_anyで簡単に認証できるけど、apache-2.2で認証モジュールのアーキテクチャが大幅に変更されたので、駄目だったりする。
もちろんpamっているのであれば、LDAPした上でmod_auth_ldapするとかいろいろできるけど、LDAPに失敗してひどい目にあったことがあるので却下した。
そんなとき、mod_authnz_externalを使えばmod_auth_anyと同じようなことができそうなので試してみた。
mod_authnz_externalのビルド
いずれにしても野良ビルドするしかない。mod_soしている場合は以下のようにする。
% cd mod_authnz_external-3.1.0
% apxs -c mod_authnz_external.c
# apxs -i -a mod_authnz_external.la
pwauthのビルド
pwauthは少し面倒。config.hをいろいろいじる必要がある。
netbsd-4 beta2の場合、いちおうpamなのでPAMをdefineしてからUNIX_LASTLOG, MIN_UNIX_UID, NOLOGIN_FILEをコメントアウトする。
また、SERVER_UIDSをwwwユーザにする。
#define PAM
/* #define UNIX_LASTLOG /* */
/* #define MIN_UNIX_UID 500 /* */
/* #define NOLOGIN_FILE "/etc/nologin.h" /* */
#define SERVER_UIDS 1002
ここまで準備してからmake
% cd pwauth-2.3.2
% make
できたpwauthコマンドは標準入力からユーザ名とパスワードを読み込んで認証がOKならステータスコード0で終了するというもの。
早速実行して試してみよう。
# sudo -u www ./pwauth
foo
bar
# echo $status
1
駄目ですね。rootで実行すると大丈夫なのでsetuidで逃げることに。このコマンドがあればパスワードアタックされることになるので本当はsetuidしたくないところだが仕方ない。これを/usr/local/libexecなどに置いておく。
設定
httpd.confにLoadModuleが入っていることを確認(apxs -iで書いてくれるはず)したうえで、以下の記述を追加。
AddExternalAuth pwauth "/usr/local/libexec/pwauth"
SetExternalAuthMethod pwauth pipe
守りたいエリアでは以下のようにする。残念なことにmod_authnz_externalはダイジェスト認証は対応していない。仕組み上対応するのは難しいのであきらめる。なので、SSLRequireSSLを激しく推奨する。
Dav On
Order Allow,Deny
Allow from all
SSLRequireSSL
AuthType Basic
AuthName DAV
AuthBasicProvider external
AuthExternal pwauth
require valid-user