Apache2 - MySQL認証
MySQLを使ったデータベース認証モジュールをAapche 2.2.x へ組み込みます
デフォルトのままではコンパイルに失敗するので、
こちらのサイトを参考に
パッチを作成して適用しています。
このページでは、既に
MySQLがデフォルトディレクトリにインストールされている事を前提としています。
用意するもの
mod_auth_mysql-3.0.0.tar.gz
公式サイト
ダウンロードサイト
コンパイルエラー修正パッチ
コンパイル&インストール
% tar zxvf mod_auth_mysql-3.0.0.tar.gz
% cd mod_auth_mysql-3.0.0
% patch -p0 < ../mod_auth_mysql.c.patch
% su
# /usr/local/apache2/bin/apxs -ci -I/usr/local/include/mysql -L/usr/local/lib/mysql -lmysqlclient -lz -lm mod_log_mysql.c (※)
※注意※
今回、apxsオプションに「-cia」を与えて一気にインストールまでせずに、
あえて「-ci」としてコンパイル&インストールまで行い、
アクティベーション(httpd.confにmod_auth_mysql.soを登録)は後ほど手動で行います。
理由は、「apxs -cia」でDSOモジュールをActivate(httpd.confへの組み込み)すると、
LoadModuleエントリの最後尾に登録されるものの、
Apache標準モジュール「mod_auth_basic.so」より前に記載しないと、
「500 Internal Server Error/以下エラーログ」を引き起こしてしまい、正常に動作しない事が分かりました。
そこで今回は、この現象を回避するために手動で組み込みます。
※500 Internal Server Error/エラーログ
[Sat Mar 31 16:54:33 2007] [error] Internal error: pcfg_openfile() called with NULL filename
[Sat Mar 31 16:54:33 2007] [error] [client 192.168.0.4] (9)Bad file number: Could not open password file: (null)
ロギング用データベース&テーブルの作成
# mysqladmin create auth_db_name
# mysql auth_db_name
mysql> CREATE TABLE auth_passwd_table (
mysql> id VARCHAR(255) BINARY,
mysql> passwd VARCHAR(255) BINARY
mysql> );
mysql> GRANT ALL ON auth_db_name.* TO db_connect_account IDENTIFIED BY 'db_connect_passwd';
mysql> GRANT ALL ON auth_db_name.* TO db_connect_account@localhost IDENTIFIED BY 'db_connect_passwd';
mysql> FLUSH PRIVILEGES;
mysql> EXIT
コンフィグレーション
# vi /usr/local/apache2/conf/httpd.conf
LoadModule mysql_auth_module modules/mod_auth_mysql.so ←mod_auth_basic.soの前に記述する。
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
・・・
<Directory /usr/local/apache2/htdocs>
Options all
AllowOverride all
Order allow,deny
Allow from all
AuthMySQLHost localhost
AuthMySQLDB auth_db_name
AuthMySQLUserTable auth_passwd_table
AuthMySQLUser db_connect_account
AuthMySQLPassword db_connect_passwd
AuthMySQLNameField id
AuthMySQLPasswordField passwd
AuthMySQLPwEncryption none
AuthMySQLAuthoritative On
AuthMySQLNoPasswd Off
AuthType Basic
AuthName "You are requested to input password"
require valid-user
</Directory>
id、passwd以外に有効期限や他のアクティブなフラグを認証条件に含ませたい場合は、
httpd.confの「AuthMySQLUserCondition」パラメータを追加して
AuthMySQLUserCondition "active=1 AND expire_date >= curdate()"
という具合に、認証時に問合せるSQL構文を記述します。すると、
SELECT passwd FROM auth_passwd_table WHERE id='testuser01' AND active=1 AND expire_date >= curdate()
追加されたクエリが投げられ柔軟な認証設定が可能になります。
起動
# /usr/local/apache2/bin/apachectl start