ApacheでMySQLを利用して認証を行う

パスワードファイルでの認証はわかりやすいですが、数が増えてくると管理が大変になり、パフォーマンスも落ちてきます。

今回はMySQLを利用した認証方法を紹介します。

手順の確認

  1. MySQLにアクセするためのドライバーをインストール
  2. DB認証のためのモジュールを有効化
  3. dbdの設定ファイルの作成
  4. パスワードを作成して控えておく
  5. MySQLの設定
  6. ベーシック認証とdbdの設定
  7. 再起動と確認

ドライバーのインストール

MySQLにアクセスするためのライブラリをインストールします。

sudo apt-get install libaprutil1-dbd-mysql

モジュールを有効化

データベース(DB)での認証を行うには以下の2つを有効にします。

a2enmod dbd
a2enmod authn_dbd

dbdの設定ファイルを作成

どこに作成しても構いませんが、confファイルとしてdbd-mysql.confを次の場所に作成しましょう。

/etc/apache2/conf-available/dbd-mysql.conf

最終的に次のような設定を記述します。

DBDriver mysql
DBDParams "host=127.0.0.1 port=3306 user=root pass=password dbname=apache"
DBDMin 2
DBDKeep 4
DBDMax 10
DBDExptime 300

保存ができたら設定を有効にします。

a2enconf dbd-mysql

パラメーターの説明

この中で重要なのはDBDriverDBDParamsです。

他の設定項目はパフォーマンスが気になったときに見直します。

DBDriver

使用するDBを指定します。

ここではMySQLなのでmysqlとします。

DBDParams

DBのアクセス情報を指定します。

host

hostはDBの場所を指定します。

今回はApacheとMySQLは同じ場所にあるので127.0.0.1(localhost)とします

port

DBのポート番号を指定します。

MySQLのデフォルトポートは3306です。

user

DBにアクセスするユーザー名を指定します。

ここではrootユーザーにしています。

pass

userで指定したユーザーのパスワードを指定します。

dbname

DBのスキーマを指定します。

今回はapacheという名前で作成しています。

DBDMin

プロセスごとの最低コネクション数を指定します。

DBDKeep

ピーク時以外でのコネクション数を指定します。

DBDMax

プロセスごとの最大コネクション数を指定します。

DBDExptime

DBKeepを超えた接続数において、アイドル接続を解除するまでの時間を指定します。

パスワードの生成

ベーシック認証でのパスワード生成はhtpasswdコマンドを利用します。

-nオプションを使うと作成結果をコンソールに表示します。

htpasswd -n kana
kana:$apr1$0fguFWWX$/EqiI3681rsK1qgRPgkGu1

表示されたパスワードは後ほど使用するので、どこかにメモしておきましょう。

MySQLの設定

MySQLのインストール

まずはMySQLをイントールしましょう。

apt-get install mysql-server

rootユーザーのパスワードを聞かれますので設定します。

今回の例ではpasswordとなっていますが、本番環境で使用するときは注意してください。

MySQLの接続

コンソール画面で設定を行っていきます。

次のコマンドでMySQLにアクセスします。

mysql -hlocalhost -uroot -p

-hで接続先を、-uに続いてユーザー名指定し、-pでパスワードの使用を明示します。

パスワードを聞かれますので、先ほどのインストール時に指定した値を入力します。

Enter password:

次のようなmysqlのコマンド入力画面になればOKです。

mysql>

DBの作成

インストールしたばかりだとスキーマ(DB)がありません。

名前は何でも構いませんが、apacheという名前で作成していきます。

create database apache;
Query OK, 1 row affected (0.01 sec)

DBが作成されたか確認しましょう。

次のコマンドですべてのDBを表示します。

show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| apache             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

テーブルの作成

DBの作成ができたので、次にユーザー名とパスワードを格納するテーブルを作成します。

まずは使用するDBを指定しましょう。

use apache
Database changed

次にテーブルを作成するSQLを入力します。

一番最後の;を忘れないようにします。

CREATE TABLE `password` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `username` varchar(255) default NULL,
  `password` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.01 sec)

テーブルが作成できたか見てみましょう。

show tables;
+------------------+
| Tables_in_apache |
+------------------+
| password         |
+------------------+
1 rows in set (0.00 sec)

ユーザー名と先ほど生成したパスワードのデータを登録します。

ユーザー名とパスワードはご自身の環境のものを入れてください。

insert into password (username, password) values ("kana", "$apr1$0fguFWWX$/EqiI3681rsK1qgRPgkGu1");
Query OK, 1 row affected (0.00 sec)

ここまでできたらMySQLから抜けましょう。

exit;

ベーシック認証の設定

apache2.confにベーシック認証の設定を行います。

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride None

        AuthName "Auth with MySQL"
        AuthType Basic
        AuthBasicProvider dbd
        AuthDBDUserPWQuery "select password from password where username = %s"
        Require valid-user
</Directory>

dbdを使った認証の設定方法だけ確認しておきましょう。

AuthBasicProvider

パスワードのデータ形式を指定します。

パスワードファイルのときはfileにしてましたが、dbdにします。

AuthDBDUserPWQuery

DBを利用するのでSQL文で指定します。

再起動と確認

Apacheを再起動して設定を反映させます。

apachectl restart

まとめ

MySQLの細かい話などは省いてしまいましたので、わかりづらいところもあるかもしれません。

コメントなどいただければ追記したいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です