読者です 読者をやめる 読者になる 読者になる

kur.jp

バイオリンと自転車をこよなく愛するkurのチラシの裏。たまには技術的なことを書いたりするかも知れません。

MySQLサーバに外部からアクセスする

Webサービスを作ってる時、複数のMySQLサーバを使いたかったり、WebサーバをMySQLサーバをWebサーバと別に用意したかったり、ってのが結構ある。

そのための方法についてまとめてみた。下記にあげる各項目は、サーバに対して通信が行われた後、どの段階で接続制限をかけるかが異なっている。ちなみにOSは私が主に使っているUbuntu10.04を前提に書いているが、FedoraだとがCentOSだろうが基本的には変わらないと思う。

1. MySQLのユーザによる設定

mysqlでユーザを作成する際に、接続を許可するホストを選択することが出来る。ローカルからのみの接続を許すのであればlocalhostを指定すればよいし、ホストテーブルによって制御することや、全ての接続を受け入れるように設定することも出来る。このあたりはアプリの性質によって決めたら良いんじゃないかと思う。

2. MySQLへのアクセスの設定

/etc/mysql/my.confのbind-addressの項目に、mysqlサーバに対する接続を許可するホストを指定することが出来る。ローカルのIPを指定してもよいし、外部のIPを指定しても良い。ただし注意点としては、複数のIPを羅列することは出来ないと言うこと。全てコメントアウトすれば、全てのホストからの接続を許可することが出来る。

3. hosts.allowとhosts.denyによる設定

MySQLはlocalhost以外からの接続を受ける場合、TCP Wrapperを解した接続になる。このため、/etc/hosts.allowと/etc/hosts.denyによる設定、mysqldに接続できるホストを指定することが出来る。ただしこれはアプリケーションレベルでの設定であり、パケットはアプリケーションまで届くことになる。基本的な使い方としては、hosts.denyで全てのホストからのアクセスを禁止して、hosts.allowでアクセスを許可するホストを指定するといった感じ。

4. iptablesによる設定

これはIP通信レベルでのファイアーウォールになる。ここで制御しておくと、許可されていないホストからのパケットはそもそもMySQLのサーバまで到達できない。なお、Ubuntuだとufwっていう便利な設定ツールがある。

論理的に考えれば4で接続元ホストを指定しておけば良い様な気もするのが、念のため、実際には、1~4を組み合わせて利用するのが良いと思う。