2012年5月30日水曜日

mod_authn_dbd + MySQL (RDS) でBasic認証

MySQLに保存したユーザ情報を使用して、ApacheでBasic認証を行う方法です。

データベースに格納したユーザー情報を使って認証を行うためのモジュールは、Apacheの1.3系と2系でも違いますし、いろいろあってどれを使うべきなのかわかりづらいです。はじめに、Apacheクックブック 第2版に載っていたmod_authn_dbiを使おうとしたのですが、全く情報がなくmod_authn_dbdにたどり着きました。

サーバはubuntu server、DBはAmazon RDS(Relational Database Service)のMySQLで試しました。RDS上のMySQLを使うからといって特別なことはなく、mysqlコマンドでリモート接続して、データベースおよび接続するユーザーを作成し、権限を付与しておきます。

mod_authn_dbdは標準でインストールされていたのですが、MySQL用dbdドライバーがインストールされていなかったので、apt-getでインストールします。
sudo apt-get install libaprutil1-dbd-mysql
a2enmodでauthn_dbdを有効にします。
sudo a2enmod authn_dbd
Apacheの設定ファイルにて、認証の設定を行います。
DBDriver mysql
DBDParams host=<RDSエンドポイント>,user=<ユーザーID>,pass=<パスワード>,dbname=<DB名>
DBDPersist On
DBDKeep 5
DBDMax 10
DBDMin 3
DBDExptime 600
<Directory /var/www>
    AuthBasicProvider dbd
    AuthDBDUserPWQuery "SELECT encrypt(password) FROM users WHERE user = %s"
    AuthName "Please Enter Your Password"
    Authtype Basic
    require valid-user
</Directory>
DBDParamsで接続先DBを指定し、AuthDBDUserPWQueryで認証時にユーザのパスワードを取得するSQLを指定します。%sの部分にユーザIDが入ります。また、DBDPersist をOnにするとコネクションをプールします。

注意点というほどのことではありませんが、"DB***"というディレクティブは<Directory>のなかにはかけません。

Apacheを再起動して、認証が正しく行われることを確認します。Internal Server Errorが発生するなど問題がある場合にはApacheのエラーログを確認します。

0 件のコメント:

コメントを投稿