MTOSはcrypt関数を使って、認証情報をDBへ格納しているので、Apache BASIC認証にMTOSの認証情報を利用することができます。
CentOSで確認をしています。Apache HTTP Server (httpd), MySQLはrpmでインストール、MTOSはMTOSのサイトからダウンロードしてきて、インストール済みだとします。最初に mod_auth_mysqlインストールをします。
認証をかける領域を用意します。index.htmlの内容は区別つく文字列をいれておけばよいでしょう。
$ sudo mkdir /var/www/auth_mysql/mt/
$ sudo vi /var/www/auth_mysql/basic/index.html
$ sudo vi /var/www/auth_mysql/mt/index.html
$ sudo vi /var/www/auth_mysql/index.html
$ sudo chown -R apache:apache /var/www/auth_mysql/
$ sudo chcon -R user_u:object_r:httpd_sys_content_t /var/www/auth_mysql/
動作確認用にbasicディレクトリを用意します。またこのディレクトリにファイルを用意しますが、ここではSQL文を記述したテキストファイルを用意しました。
$ sudo cat /var/www/auth_mysql/basic/init.sql
CREATE DATABASE auth;
USE auth;
CREATE TABLE users (
name CHAR(30) NOT NULL,
pass CHAR(20) NOT NULL,
PRIMARY KEY (name)
);
GRANT SELECT
ON auth.users
TO authtest@localhost
IDENTIFIED BY 'secret';
INSERT INTO users VALUES ('testuser', ENCRYPT('testpass'));
$ mysql -u root < /var/www/auth_mysql/basic/init.sql
確認をするために、mysqlコマンドでアクセスして、auth データベースのテーブルなどをみます。
authデータベースが使えることを確認したら、Apache HTTP Serverの設定をします。MTOSの設定ファイルmt-config.cgiをみてDB接続情報確認してから、auth_mysqlの設定をします。ここでは、テスト用に作成したauthデータベースの情報を使う場合と、MTOSのデータベースを使う場合(MTOSにアカウントがあれば良いパターンと、blog_id=1のブログに関係するアカウントがあれば良いパターン)について、どう記述すれば良いか書いてあります。難しくないので見れば内容はすぐにわかるでしょう。設定の一部にコメント行がありますが、備忘録的に書いてあるだけです。必要に応じて有効にすればよいでしょう。
$ sudo cat /etc/httpd/conf.d/auth_mysql.conf
LoadModule mysql_auth_module modules/mod_auth_mysql.so
Alias /auth_mysql/ /var/www/auth_mysql/
<Directory /var/www/auth_mysql/basic>
AuthName "MySQL auth"
AuthType Basic
AuthMYSQLEnable on
#AuthMySQLSocket /var/lib/mysql/mysql.sock
#AuthMySQLHost localhost
AuthMySQLUser authtest
AuthMySQLPassword secret
AuthMySQLDB auth
AuthMySQLUserTable users
AuthMySQLNameField name
AuthMySQLPasswordField pass
#AuthMySQLPwEncryption sha1
#AuthMySQLNoPasswd Off
AuthGroupFile /dev/null
require valid-user
</Directory>
<Directory /var/www/auth_mysql/mt>
AuthName "MySQL with MT auth"
AuthType Basic
AuthMYSQLEnable on
AuthMySQLUser dbuser
AuthMySQLPassword dbpass
AuthMySQLDB mtos
AuthMySQLUserTable mt_author
AuthMySQLNameField author_name
AuthMySQLPasswordField author_password
AuthMySQLPwEncryption crypt
#AuthMySQLNoPasswd Off
AuthGroupFile /dev/null
require valid-user
</Directory>
<Directory /var/www/auth_mysql/mtub2>
AuthName "MySQL with MT blog2 authenticated zone"
AuthType Basic
AuthMYSQLEnable on
AuthMySQLUser dbuser
AuthMySQLPassword dbpass
AuthMySQLDB mtos
AuthMySQLUserTable "mt_author, mt_permission"
AuthMySQLNameField author_name
AuthMySQLPasswordField author_password
AuthMySQLUserCondition "mt_permission.permission_blog_id=1 and mt_permission.permission_author_id=mt_author.author_id"
AuthMySQLPwEncryption crypt
#AuthMySQLNoPasswd Off
AuthGroupFile /dev/null
require valid-user
</Directory>
設定ができたら、httpdの設定を確認してから再起動します。
$ sudo /sbin/service httpd restart
httpdが再起動したら、ブラウザから「http://localhost/auth_mysql/basic/」や「http://localhost/auth_mysql/mt/」へアクセスをして、認証が必要となっていることを確認します。testuserというアカウントで、パスワードがtestpassで認証がとおるはずです。
うまく動作しないときは、MySQLのログを見ます。my.cnfのmysqldセクション([mysqld])へlogの設定を追加してMySQLを再起動しておくと、クエリログが出力されるので、問題解決がしやすくなります。logとだけ書いたら、mysqld.logにクエリ等のログが出ます。ファイル名を指定しなければ、mysqlのインストール場所(/var/lib/mysql/ など)がデフォルト出力先となります。
なお、AuthMySQLUserTableやAuthMySQLUserConditionへいろいろと指定してみると、これらがどのようにSQL文へ影響するか見てみると理解が深まります。ちなみに、IP制限をするにあたり、MySQLを使うこともできます。この場合は、AuthMySQLUserCondition へ「ip_address = '%a'」を指定すれば良いということになります。
参考資料: http://modauthmysql.sourceforge.net/CONFIGURE
関連書籍: