Apache BASIC認証にMTOSの認証情報を利用

MTOSはcrypt関数を使って、認証情報をDBへ格納しているので、Apache BASIC認証にMTOSの認証情報を利用することができます。


CentOSで確認をしています。Apache HTTP Server (httpd), MySQLはrpmでインストール、MTOSはMTOSのサイトからダウンロードしてきて、インストール済みだとします。最初に mod_auth_mysqlインストールをします。

$ sudo yum install mod_auth_mysql

認証をかける領域を用意します。index.htmlの内容は区別つく文字列をいれておけばよいでしょう。

$ sudo mkdir -p /var/www/auth_mysql/basic/
$ 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 vi /var/www/auth_mysql/basic/init.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 データベースのテーブルなどをみます。

$ mysql -u root auth

authデータベースが使えることを確認したら、Apache HTTP Serverの設定をします。MTOSの設定ファイルmt-config.cgiをみてDB接続情報確認してから、auth_mysqlの設定をします。ここでは、テスト用に作成したauthデータベースの情報を使う場合と、MTOSのデータベースを使う場合(MTOSにアカウントがあれば良いパターンと、blog_id=1のブログに関係するアカウントがあれば良いパターン)について、どう記述すれば良いか書いてあります。難しくないので見れば内容はすぐにわかるでしょう。設定の一部にコメント行がありますが、備忘録的に書いてあるだけです。必要に応じて有効にすればよいでしょう。

$ sudo vi /etc/httpd/conf.d/auth_mysql.conf 
$ 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 configtest
$ 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

関連書籍:

同じタグの記事: Apache
同じタグの記事: BASIC認証
同じタグの記事: MTOS
同じカテゴリの記事: General
関連書籍: Apache
関連書籍: MTOS