犬ターネット

Apache+DBでDigest認証

2011-05-02 apache

ApacheとDB使ったBasic認証の記事は見つかるんだけど、Digest認証は見つからなかったので、メモがてら残しておく。

環境

centOS 5.5
PostgreSQL 8.1.23
Apache 2.2.3

PostgreSQLインストール&設定

yumでサクッとインストールしたので省略。あ、pg_config が必要になるので、postgresql-devel もインストールした。

# yum install postgresql-server
# yum install postgresql-devel

Apacheインストール&設定

Apacheはソースコンパイルしていれた。mod_dbd と mod_authn_dbd が必須なのでこんな感じのオプションを指定。

# cd /usr/local/src/
# wget http://...../httpd-2.2.3.tar.gz
# tar -xzvf httpd-2.2.3.tar.gz
# cd httpd-2.2.3
# ./configure
--prefix=/usr/local/apache
…(略)
--enable-dbd 
--enable-authn-dbd 
--with-pgsql=/usr/lib/pgsql
# make
# make install

ApacheからPostgreSQLのモジュールを呼び出せるよう、共有ライブラリの設定を変更。

# vi /etc/ld.so.conf
/usr/lib/pgsql ← 一番下に追記

で、ldconfig を再起動。

# /sbin/ldconfig

digest認証の設定

digest認証に使うユーザテーブルを作る。

CREATE TABLE userdata (
 userid varchar(64) NOT NULL,
 relm varchar(64) NOT NULL,
 password varchar(64) NOT NULL,
 primary key (userid,relm)
);

で、認証用データとしてこんな値を入れておく(userid:test, relm:aaa, password:test)
password の値は暗号化されたものをいれる。htdigestコマンド使えば作成可能。この辺も参照。

INSERT INTO userdata (userid,relm,password) VALUES ('test','aaa','6c39e707fdc9510e4560b840751c8ac1');

httpd.confにDB経由Digest認証設定を書く。http://xxxxxx/aaa/ にアクセスされたらDigest認証させることを想定。

# vim /usr/local/apache/conf/httpd.conf

### mod_dbd config
DBDriver pgsql
DBDParams "host=localhost dbname=testdb user=dbuser password=dbuser"
DBDMin  4
DBDKeep 8
DBDMax  20
DBDExptime 300

### /aaa digest auth setting
<Directory "/var/docroot/aaa">
AuthType Digest
AuthName "aaa" # ←userdata.relmを指定
AuthDigestProvider dbd
Require valid-user
AuthDBDUserRealmQuery "SELECT password FROM userdata WHERE userid=%s AND relm=%s"
</Directory>

見て分かるように、httpd.confに認証用のSQLを直接書いている。%sにuseridとrelm がバインドされる( ※SQLインジェクション対策は考慮されてるっぽい)

で、Apache起動、http://xxxxxx/aaa/ にアクセスして認証ダイアログが出てきたらOK。


GW

PerlとPHPでDigest認証ファイルを作る