Apache 2.2のBasic認証のユーザー管理をPostgreSQLでやる。
旧来使えてたって言われている*1mod_auth_pgsqlはApache 2.2の認証モジュールの仕様変更で駄目になっている(っぽい)。
んで、Apache 2.2からは認証とユーザー管理の部分を分離しているんで、その分離されたユーザー管理の部分をPostgreSQLでやるようなモジュールを使う。
分離されたうんぬんは http://www.atmarkit.co.jp/flinux/special/apache22/apache01.html に詳しくのってるのでそこを参照してくださいな。
というわけでmod_authn_pgsqlの導入しようと思ったんだけど、日本語の情報はおろか、英語の情報もまったくみつからない。
つーわけでソースコード読んでなんとなく理解してみる。
CentOS4.4のApache 2.2.3と2.2.4で動作確認したっぽい。
wget http://hypermail.linklord.com/new-httpd/att-4846/mod_authn_pgsql.c /usr/local/apache2/bin/apxs -cia -I/usr/local/pgsql/include mod_authn_pgsql.c
Apache再起動してインストールは終了
あとは認証の設定をするべし。
.htaccessで
AuthName "PGSQL"(通常のAuthNameと同じ) AuthBasicAuthoritative off(とりあえずOff) AuthBasicProvider pgsql(認証方式の定義) AuthType Basic(Basic認証) #AuthPGSQLHost localhost(書かなくてもいい) AuthPGSQLHostaddr 127.0.0.1(DBサーバーのIPアドレス/ホスト名じゃ駄目) AuthPGSQLPort 5432(ポート番号) AuthPGSQLConnectionTimeout 10(タイムアウトまでの時間) AuthPGSQLDatabase DBName(ユーザーテーブルが入っているDB名) AuthPGSQLUser postgres(接続ID) AuthPGSQLPassword postgres(接続パスワード) AuthPGSQLSSLMode disable(SSL使用するか/大概はdisable) AuthPGSQLSelect "select userid from usertable where userid = '%u' and password = '%p'" require valid-user
な感じで設定するといける。
ついでにユーザー情報を格納しているテーブルは
Table "public.usertable" Column | Type | Modifiers
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
こんな感じ。
ただ、他の情報(このユーザーが有効かどうかのフラグとか、本名)とか持ってても問題なさげ。
AuthPGSQLSelectで設定するので。
AuthPGSQLSelectの%uがBasic認証のユーザー名/%pがパスワードになります。
受けた認証情報をそのまま受け流し、レコードが帰ってきたら認証という扱いのようです。
AuthPGSQLSelectで
select userid from usertable where userid = '%u' and password = '%p' and enabled = 't'
みたいなSQL使ってアカウントの有効性までチェックしてみたり、パスワード無視してユーザー名と有効フラグだけ確認してBasic認証するっていう時にも使えそう*2。
このモジュールはどっかのMyDNSみたいな変なところ*3でこけたりしないのでいい子だ。