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と同じようなことができそうなので試してみた。

必要なもの

  1. Mod_Auth_External and Mod_Authnz_External
  2. pwauth

どうでもよいことだが、pwauthは別配布になっているので両方必要。

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

後はhttpdをリスタートすると個人ディレクトリのdav配下にunixユーザとしての認証がかかるようになる。