MovableTypeのMySQLをネットワーク経由で使用する

Webサーバを二重化したので、バックエンドのMySQLサーバも二重化してレプリケーションしたい。その前段階として、MySQLにネットワーク経由でアクセスできるようにしたい。

MySQLのユーザ情報や権限情報はMySQLのデータベースの中に保存されている。まず認証はuserテーブルで行う。どのホストから誰が接続してきたかという情報をもとにレコードとマッチさせ、パスワードが一致したら認証成功。この順序はまずホスト名でマッチし、次にユーザ名でマッチさせる。ワイルドカード(%)も使えるが優先順位は下がる。フィールドが空白の場合はすべてにマッチするが、それで許可されるわけではなく次の認証段階へ判断が持ち越される。

userテーブルの認証に成功したら、次にdbテーブルで権限をチェックする。userテーブルでも権限の付与は可能だが、そうするとすべてのデータベースに対して同じ権限を付与してしまうので、通常はuserテーブルではすべての権限をなし(N)としておき、dbテーブルでデータベースごとの権限を付与(Y)する。

まずローカルでMySQLに接続して設定をする。

ユーザ情報などを保存しているmysqlデータベースを選択する。

[root@db1 ~]# mysql -u root -p
Enter password:

mysql> use mysql;

現在登録されているユーザを確認。

mysql> select user,host from user;
+--------+---------------------+
| user   | host                |
+--------+---------------------+
|        | localhost           |
| mtuser | localhost           |
| root   | localhost           |
+--------+---------------------+
3 rows in set (0.00 sec)

ネットワークから接続できるようにユーザを追加。SQL文は途中で改行を入れても大丈夫で、その際に>が表示される。

mysql> INSERT INTO `user` VALUES ('www1.grandarbre.net','mtuser',PASSWORD('MYPASSWORD'),
>'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',
>'N','N','N','N','N','','','','',0,0,0,0);
Query OK, 1 row affected (0.01 sec)
mysql> INSERT INTO `user` VALUES ('www2.grandarbre.net','mtuser',PASSWORD('MYPASSWORD'),
>'N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N',
>'N','N','N','N','N','','','','',0,0,0,0);
Query OK, 1 row affected (0.01 sec)

ユーザが追加されている。

 mysql> select user,host from user;
+--------+---------------------+
| user   | host                |
+--------+---------------------+
|        | localhost           |
| mtuser | localhost           |
| root   | localhost           |
| mtuser | www1.grandarbre.net |
| mtuser | www2.grandarbre.net |
+--------+---------------------+
5 rows in set (0.00 sec)

同様にホストを確認する。

mysql> select host,user,db from db;
+------------------+--------+---------+
| host             | user   | db      |
+------------------+--------+---------+
| %                |        | test    |
| %                |        | test\_% |
| localhost        | mtuser | mt      |
+------------------+--------+---------+
3 rows in set (0.00 sec)

同様にホストを追加。

INSERT INTO `db` VALUES ('www1.grandarbre.net','mt','mtuser',
>'Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
Query OK, 1 row affected (0.01 sec)
INSERT INTO `db` VALUES ('www2.grandarbre.net','mt','mtuser',
>'Y','Y','Y','Y','Y','Y','N','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
Query OK, 1 row affected (0.01 sec)

以下のように追加されている。

mysql>mysql> select host,user from db;
+---------------------+--------+
| host                | user   |
+---------------------+--------+
| %                   |        |
| %                   |        |
| localhost           | mtuser |
| www1.grandarbre.net | mtuser |
| www2.grandarbre.net | mtuser |
+---------------------+--------+
5 rows in set (0.00 sec)

最後に、変更した権限情報を反映させる。

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

ネットワーク経由で接続するので、iptablesの設定をする。

[root@db1 ~]# vi /etc/sysconfig/iptables
...
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp -s 192.168.0.0/16 --dport 873 -j ACCEPT
...
[root@db1 ~]# service iptables restart

クライアント側からmysqlコマンドで接続確認をする。

[root@www2 mt]# mysql -h db1 -u mtuser -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 153 to server version: 5.0.22

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

クライアント側で、HTTPDがネットワーク越しにデータベース接続できるようにSELinuxの設定をする。

[root@www1 tmp]# setsebool -P httpd_can_network_connect_db on
[root@www2 tmp]# setsebool -P httpd_can_network_connect_db on