読者です 読者をやめる 読者になる 読者になる

KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

Apache 2.4 + MariaDB 5.5 でmod_dbd を使ったDigest認証の設定をしてみた。

Centos7 Apache2.4 MariaDB Digest Authentication

使いどころがあるのか謎だけど、Apacheの認証系でもDB連携あるぞというのをたまたまみかけたので、やってみた。

環境

必要なパッケージのインストール

DBドライバーのインストール。今回は、MariaDBで試すので、apr-util-mysqlをインストール。

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問合せ時に、Apachemod_auth_digestが求める形のパスワード形式(user:realm:passwordMD5ハッシュした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の再起動をして設定を反映させればよい。