Apache 2.4 + MariaDB 5.5 でmod_dbd を使ったDigest認証の設定をしてみた。
使いどころがあるのか謎だけど、Apacheの認証系でもDB連携あるぞというのをたまたまみかけたので、やってみた。
環境
必要なパッケージのインストール
DBドライバーのインストール。今回は、MariaDBで試すので、apr-util-mysqlをインストール。
- apr-util-ldap.x86_64 : APR utility library LDAP support
- apr-util-mysql.x86_64 : APR utility library MySQL DBD driver
- apr-util-odbc.x86_64 : APR utility library ODBC DBD driver
- apr-util-pgsql.x86_64 : APR utility library PostgreSQL DBD driver
- apr-util-sqlite.x86_64 : APR utility library SQLite DBD driver
Daigest認証用のDB.TABLE作成、ユーザーデータ登録
まずDBとテーブルを作る
DB名:apacheauth (任意)
TABLE名:digest_auth_users (任意)
CREATE DATABASE apacheauth; CREATE TABLE digest_auth_users ( id INTEGER PRIMARY KEY AUTO_INCREMENT, user VARCHAR(255) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, realm VARCHAR(255) DEFAULT 'AuthRequirePage' );
** realmは後にApacheの設定でAuthNameで指定する文字列。
Apacheからデータを参照するためのDB接続ユーザーを作成する
基本的には参照権限だけあれば十分。プログラムで動的に変更するなど操作を同じユーザーでさせるならば、UPDATEやDELETEも権限を与えてあげる。
GRANT SELECT ON apacheauth.* TO 'apache'@'localhost' identified by 'apache';
テスト用のユーザーデータを入れる
セキュアじゃないけど今回はDB上には平文のパスワードを保持させることにした。
INSERT INTO digest_auth_users ( user, password ) VALUES ( "test", "test" );
id | user | password | realm |
---|---|---|---|
1 | test | test | AuthRequirePage |
Apacheの設定
conf/httpd.conf(またはconf.d/<任意の名称>.conf)または、VirtualHostディレクティブ内 に以下の記述を行う。
DBD~の部分は、Directoryディレクティブの中には書けないので注意。
参照 --> mod_dbd - Apache HTTP Server Version 2.4
DBDriver mysql DBDParams "host=localhost,dbname=apacheauth,user=apache,pass=apache" DBDMin 2 DBDKeep 2 DBDMax 10 DBDExptime 300 <Directory "/var/www/auth_html"> Options Indexes FollowSymLinks AllowOverride None Require valid-user AuthType Digest AuthDigestAlgorithm MD5 AuthName "AuthRequirePage" AuthDigestProvider dbd AuthDBDUserRealmQuery "SELECT MD5(CONCAT(user, ':', realm, ':', password)) AS password FROM digest_auth_users WHERE user = %s AND realm = %s" </Directory>
今回はDBには平文でパスワードを保存したので、AuthDBDUserRealmQueryの部分でDB問合せ時に、Apacheのmod_auth_digestが求める形のパスワード形式(user:realm:passwordをMD5ハッシュした32文字列)
参照 --> Password Formats - Apache HTTP Server Version 2.4
%sには、前から順に入力されたuser名、AuthNameの値が入る。
一応SQLの部分だけ抜き出しておくとこんな感じ。
SELECT MD5( CONCAT(user, ':', realm, ':', password) ) AS password FROM digest_auth_users WHERE user = %s AND realm = %s
%sに入る値は、mod_dbdでうまいことSQLインジェクション対策として不正な文字列はエスケープしてくれるらしい。
参照 --> mod_dbd - Apache HTTP Server Version 2.4
完了!
あとはApacheの再起動をして設定を反映させればよい。