Apache2.0系において、パスワードファイルではなく、データベースを使ってユーザ認証を行う方法を紹介する。使用するデータベースはPostgreSQLである。
なお、Apache2.2系では利用できないので注意する。
PostgreSQLがインストールされているサーバに任意のデータベースを作成し、ユーザ情報を格納するテーブルを作成する。
1-1 テーブルの作成
当たり前だが、ユーザ認証に必要なデータは「ユーザ名」と「パスワード」の2つである。よって、作成するテーブルには最低限、この2つの列があればよい。もちろん、開発するアプリケーションの都合で、他の列を追加してもよい。
列名 データ型 userid varchar(50) password varchar(50) このテーブルを、userdata というテーブル名で作成するSQLは次のようになる。
CREATE TABLE userdata {
userid VARCHAR(50) PRIMARY KEY,
password VARCHAR(50) NOT NULL
};※Webからこのテーブルを参照するため、Webで利用するユーザを作成し、SELECT権限を与えておくこと。
なお、PHPなどで、Web上からユーザの作成やパスワードの変更を行えるようにするなら、SELECT権限のほかに、INSERT / UPDATE / DELETE 権限もつけておく。
1-2 ユーザデータの作成
作成したテーブルに、ユーザデータを追加する。
INSERT INTO userdata VALUES ('user1', 'passwd1');
INSERT INTO userdata VALUES ('user2', 'passwd2');
INSERT INTO userdata VALUES ('user3', 'passwd3');
・
・
・この例では、パスワードをクリアテキストで保存している。CryptやMD5で暗号化したものを格納してもよい。
2-1 前準備
使用するデータベースが同一サーバ上にインストールされていれば問題ないが、別サーバにある場合、Webサーバ側にもPostgreSQLをインストールする必要がある。ただし、データベースは不要なので、initdbは必要なく、データベースを起動する必要もない。
2-2 ソースファイルの入手
PostgreSQLを使ってデータベース認証を行うには、mod_auth_pgsqlというモジュールをインストールする。以下のサイトから最新のソースをダウンロードし、/usr/local/srcに配置する。
http://www.giuseppetanzilli.it/mod_auth_pgsql2/
なお、対応するPostgreSQLのバージョンは 7.x と書いてあるが、8.2.3でも動作した。
2-3 インストール
ダウンロードしたソースを解凍し、DSOとしてインストールする。
# cd /usr/local/src/
# tar zxvf mod_auth_pgsql-2.0.3.tar.gz
# cd mod_auth_pgsql-2.0.3
# /usr/local/apache2/bin/apxs -i -a -c -I /usr/local/pgsql/include -L /usr/local/pgsql/lib -lpq mod_auth_pgsql.c※インストール方法は /usr/local/src/mod_auth_pgsql-2.0.3/INSTALL ファイルに書かれているので、詳しくはそちらを参照
インストールが終わったら、Apacheの設定ファイル httpd.conf に、以下の行が追加されているかを確認する。
LoadModule auth_pgsql_module modules/mod_auth_pgsql.so
2-4 ユーザ認証の設定
ユーザ認証はディレクトリに対して設定する。この設定を行うと、そのディレクトリ以降のすべてのファイル/ディレクトリに認証がかかるようになる。
設定には .htaccessファイルを使う方法と、Apacheの設定ファイルに記述する方法があるが、ここでは後者のやり方を紹介する。
Apacheの設定ファイル httpd.conf を開き、以下の行を追加する。<Directory "/usr/local/apache2/htdocs/users/">
AuthName "USER LOGIN"
AuthType Basic
Require valid-user
# DBサーバ名(Webサーバと同一ホストなら不要)
Auth_PG_host db.andokomuten.jp
# DBサーバと通信するポート
Auth_PG_port 5432
# データベース名
Auth_PG_database SampleDB
# データベースに接続するユーザ名
Auth_PG_user nobody
# データベースに接続するユーザのパスワード(設定していなければ不要だが、設定すべき)
Auth_PG_pwd nobodypassword
# ユーザ情報が格納されているテーブル名
Auth_PG_pwd_table userdata
# ユーザ名が入っている列名
Auth_PG_uid_field userid
# パスワードが入っている列名
Auth_PG_pwd_field password
# パスワードがクリアテキストなら、OFF(デフォルトはON)
Auth_PG_encrypted Off
# パスワードを暗号化するなら、暗号化方式を指定(クリアテキストなら不要)
#Auth_PG_hash_type Crypt
#Auth_PG_hash_type MD5
</Directory>この例では、usersディレクトリに対してユーザ認証がかかるように設定している。また、パスワードはクリアテキストで格納されているものとして設定しているが、変更も可能。
2-4 再起動
以上の設定が終わったら、Apacheを再起動する。
# /etc/rc.d/init.d/httpd stop
# /etc/rc.d/init.d/httpd start
ユーザ認証を設定したディレクトリにWebからアクセスし、ユーザ認証がかかれば成功である。