前回は、テキストファイルによるベーシック認証を行ったが、今回はテキストファイルの代わりに MySQL を利用する。テキストファイルを利用する方法は簡単で便利だが、ユーザー数が増えてきたり、ユーザーをアプリケーションで管理するときに不便だ。そこで、MySQL のテーブルを利用して認証する方法を検証してみた。
検証環境は、Cent OS 6.4 と Apache 2.2.15、MySQL 5.1.69だ。Windows 環境の場合、残念ながらApache でダウンロードできるバイナリでは動作しない。mod_auth_mysql モジュールが含まれていないためだ。
テキストファイルを利用した場合と同様、MySQL を利用する基本認証は複数のモジュールを経由して行われる。
- AuthType Basic により mod_auth_basic が起動
- AuthMYSQLEnable on により mod_auth_mysql が起動し、定義に従ってデータベースを参照する
- Require の定義に従って、mod_authz_user が承認
MySQL を使ってベーシック認証を行う場合、以下のような定義が必要になる。
#基本認証 LoadModule auth_basic_module modules/mod_auth_basic.so #ホスト名/IPアドレスによる制御 LoadModule authz_host_module modules/mod_authz_host.so #ユーザー名による承認 LoadModule authz_user_module modules/mod_authz_user.so #MySQL の認証モジュール LoadModule mysql_auth_module modules/mod_auth_mysql.so ... <Directory "/var/www/html"> Options FollowSymLinks AllowOverride None AuthType Basic AuthName "User Zone" AuthMYSQLEnable on # MySQL に接続する時のユーザー ID AuthMySQLUser user # MySQL に接続する時のパスワード AuthMySQLPassword password # MySQL のデータベース名 AuthMySQLDB auth # AuthMySQLDB で指定したデータベース内のテーブル名 AuthMySQLUserTable users # AuthMySQLUserTable で指定したテーブル内のユーザーID列 AuthMySQLNameField login_id # AuthMySQLUserTable で指定したテーブル内のパスワード列 AuthMySQLPasswordField password # パスワード列の暗号化方式 AuthMySQLPwEncryption sha1 Require valid-user Order allow,deny Allow from all </Directory>
MySQL で認証を行うための「mod_auth_mysql」モジュールを読み込み、「AuthMYSQLEnable」に「On」を指定すると MySQL による認証が有効になる。以降の定義は、MySQL と接続する時の認証情報、利用するデータベース、テーブル、列名、パスワードの暗号化方式になる。
認証に利用するテーブルには、Apache で利用しない列が含まれていてもよい。Apache で上記の定義を行っている前提で、プライマリーキーに user_id を用意し、AUTO INCREMENT する列を追加したテーブルを作成する例を挙げる。
CREATE DATABASE auth; USE auth; CREATE TABLE users ( user_id int(11) NOT NULL AUTO_INCREMENT, login_id varchar(40) NOT NULL, password varchar(40) NOT NULL, PRIMARY KEY (user_id) ); GRANT SELECT ON auth.users TO user@localhost IDENTIFIED BY 'password'; FLUSH PRIVILEGES;
ユーザーを追加する場合は、SQL で行を追加するだけだ。
INSERT INTO users VALUES ('user1', SHA1('password'));
暗号化方式に SHA1 を使っているので、パスワード列に挿入するデータは SHA1 関数を通している。