データベースを使ったユーザ認証・Apache2.0系

 Apache2.0系において、パスワードファイルではなく、データベースを使ってユーザ認証を行う方法を紹介する。使用するデータベースはPostgreSQLである。
 なお、Apache2.2系では利用できないので注意する。

1.ユーザデータの作成

 PostgreSQLがインストールされているサーバに任意のデータベースを作成し、ユーザ情報を格納するテーブルを作成する。

1-1 テーブルの作成

 当たり前だが、ユーザ認証に必要なデータは「ユーザ名」と「パスワード」の2つである。よって、作成するテーブルには最低限、この2つの列があればよい。もちろん、開発するアプリケーションの都合で、他の列を追加してもよい。

列名データ型
useridvarchar(50)
passwordvarchar(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.インストール

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

3.動作確認

 ユーザ認証を設定したディレクトリにWebからアクセスし、ユーザ認証がかかれば成功である。


[ BACK ]