今回の設定はMySQL自身は誰でも歓迎Listen!を行って、iptablesで制御する方法です。DBユーザ側で制御しないのは、今後誰かがサーバの管理を引き継いだ時に、DBユーザの設定に手を加えないで済むから。
iptablesでの制御なら設定ファイルに記述があるので、修正や追加が必要な場合にもスキルに関わらず容易に保守がしやすいという大きなメリットがあります٩(๑❛ᴗ❛๑)۶これなら、別のネットワークのIPアドレスも簡単に追加できる。
今後永遠に自分だけが使って管理するというならどうやってもいいけど。そんなことはまずないはず(笑
寂しい話、いつしか他の会社がシステム保守を引き継ぐかもしれないし、お客様の社内にサーバー好きなIT担当者が入ってきたら、その方が引き継ぐかもしれない。だからドキュメントを残して、お客様のシステム要件を満たしつつも出来るだけ保守しやすくしたいと考えて設定します。
誰でもListenさせる
MySQLのデフォルトではlocalhostしか待ち受けしていないので、公開範囲を指定します。
1 2 3 |
# vi /etc/my.cnf bind-address = 0.0.0.0 |
1 |
# /etc/init.d/mysqld restart |
これでどのようなIPが来ても受け入れます。
※mysqldはserviceコマンドから起動するより起動スクリプトから起動すると、mysqld_safeデーモン経由でmysqldを起動するので、直接mysqldを起動するより安全です。
mysqld_safe
エラー発生時の再起動やランタイム情報のエラーログファイルへのロギングなど、いくつかの安全機能を追加します。
@see http://dev.mysql.com/doc/refman/5.6/ja/mysqld-safe.html
ログイン用のDBユーザを作成する。
1 |
mysql> grant all privileges on hoge_db.* to hoge_db@'%' identified by 'パスワード'; |
iptablesで制御しよう
これまで行ってきた設定ではMySQLは誰でも待ち受けてしまい非常に危険な状態。だからiptablesで門を正確に制御しよう。
1 |
# vi /etc/sysconfig/iptables |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
## MySQL ############################## #-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT #-A INPUT -s 153.xxx.200.0/24 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT ## 参照系WEBサーバ -A INPUT -s 153.xxx.200.10/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT -A INPUT -s 153.xxx.200.11/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT -A INPUT -s 153.xxx.200.12/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT -A INPUT -s 153.xxx.200.13/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT ## 管理系WEBサーバ -A INPUT -s 153.xxx.200.51/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT ## レプリケーション #DB-master -A INPUT -s 153.xxx.200.66/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT #SlaveDBロードバランサ(GMO altus) -A INPUT -s 192.168.0.0/16 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT #DB-slave1 -A INPUT -s 153.xxx.200.67/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT #DB-slave2 -A INPUT -s 153.xxx.200.68/32 -p tcp -m tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT #それ以外のMySQLへの接続を拒否 -A INPUT -p tcp -m tcp --dport 3306 -j REJECT --reject-with icmp-port-unreachable ### MySQL ここまで ########################################################## |
許可するサーバを列挙して、最後にそれ以外の接続を拒否。
1 |
# service iptables restart |
これで安全にMySQLを外部公開できますね!