急にデータベースにつながらなくなった!? 〜それはphpMyAdminのせいかもしれない編〜

この記事はだいぶ前に書かれたものなので情報が古いかもしれません
甘いものは別腹。美味いものも別腹

おまとめ三行

おちついてブロックを解除するんだ
オッケー!! 解除キタ―――(゚∀゚)――――!!
シュークリームなんて久しぶりに食べたよ

これと言って何もしていないのに、ある日突然データベースにつながらなくなった。それも特定のウェブサーバーからだけ。DBサーバーが落ちているわけでもない。でも接続エラーになる。

そんな経験はあるでしょうか。僕はあります。

でも慌てることはない。解決方法さえ分かっていれば、すぐに復旧できる……かもしれない。

あ、ちなみにMySQLの話です。他の場合も一緒かどうかは……すまん、分からん。



おちついてブロックを解除するんだ

今回の僕と同じような症状であれば、以下のようなエラーメッセージが出てるはずです。

Host ‘IPアドレス’ is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts’

あるIPアドレスからの接続が、大量のエラーがあったせいでブロックされてますよー的な内容です。

MySQLには「max_connect_errors」というパラメータが設定されています。一言で言うと、接続エラーの上限回数、みたいなもんです。二言で言うと……やっぱり接続エラーの上限回数ですかね。それ以上の説明がないわね。

ようはこの上限回数を超えて接続エラーが発生すると、そのホストからの接続はスパムじゃね?的な判断が下されてしまい、接続がブロックされてしまうんですね。

ってことで、このブロックを解除してあげれば問題は解決です。

上記のエラーメッセージにも「unblock with ‘mysqladmin flush-hosts’」って書いてありますが、この「flush-hosts」って命令を実行すれば、ブロックは解除されます。

# mysqladmin -h ホスト -u root -p flush-hosts

コマンドラインから実行する場合は、こんな感じですね。admin権限(管理者権限って言った方が良い?)じゃないと行えないってとこがポイントでしょうか。

もしこのエラーじゃなく急にDBにつながらなくなったって場合は……すまん、やっぱり分からん。



AWSのRDSを使っている場合

RDSの場合、管理者権限を持ったユーザーを作ることができません。つまり上記のようなやり方が使えない。

じゃあどうするかってことなんですが、例えば特定のEC2インスタンスからの接続がブロックされても、別のインスタンスからはDBに接続することができるはずです。何なら一時的に新しいインスタンスを立ち上げて、そっから接続しても良いでしょう。

で、接続ができたら以下のSQLを流せばオッケーです。

FLUSH HOSTS

phpMyAdminなんかを使って接続できれば、一発ですね。やってることは一緒です。ホストをフラッシュしてます。フラッシュするって何だろ?

flushには、興奮、輝き、芽生えなどの意味があるから……ホストをフラッシュするってことは、ホストが興奮したり輝くってことですかね。「俺のブロックを解除しろぉ!!」「オッケー!! 解除キタ―――(゚∀゚)――――!!」「俺様が歌舞伎町のナンバーワンホストだぜ!!(-д☆)キラッ」的な。

まあ、水に流すって意味もあるそうですから、たぶんそっちの意味なんでしょうね。ブロックされた状態を水に流して消してしまう的な。

僕の微妙なボケも軽くフラッシュしてください。

ちなみに、データベースを再起動しても解除されるっぽいです。僕はこのエラーが出たとき、原因が分からなかったからとりあえず再起動してみようと思ってやってみたんですが、そしたらつながるようになったから、たぶんそれでもいける。本番稼動している場合はオススメできませんが、テスト環境でこうなったなら、再起動というのも一つの手かもしれません。



phpMyAdminが狙われてる!?

じゃあ、どうして今まで問題なく接続できていたのに、ある日突然そんな大量に接続エラーが出てしまったんだろうって話なのですが……その原因は、phpMyAdminを使っているせいかもしれません。

phpMyAdminをインストールするとき、webrootの直下にインストールしてフォルダ名をそのままphpMyAdminとしておけば「http://ホスト/phpMyAdmin/index.php」でアクセスできます。が、当然ながらこのURLには誰でもアクセスできる。不正なアクセスだってできる。

どうやらphpMyAdminに対する不正アクセスってのはそう珍しいことでもないようです。僕の場合もそうでしたが、アクセスログを見たら大量のアクセスがあった。

例えばこんなん。

GET /mysqladmin/index.php?pma_username=root&pma_password=server HTTP/1.1

GETパラメータつきで送られてるせいで、何らかの処理が行われたんですかね。その際にデータベースへの接続があったけど接続エラーになって、それがいつのまにかmax_connect_errorsの上限を超えていたと。そんな感じじゃないでしょうか。

対策としてはphpMyAdminを使わないようにするとか、使うならBASIC認証をかけておくとか、「/phpMyAdmin/index.php」のような分かりやすいURLでアクセスされないようにするとかが有効でしょうか。BASIC認証はどこまで有効か分からないけど、かけないよりはかけた方が良いんじゃないかなぁ。

ちなみに、やむって(yumを使ってという意味)インストールした場合、「/phpMyAdmin/index.php」「/phpmyadmin/index.php」「/mysqladmin/index.php」などでアクセスできるようになっているはずです。

これは、インストール時にphpmyadmin.confというファイルが作成されるのですが、そこにそういうURLでアクセスできるような設定が書いてあるからです。

<Directory "/usr/share/phpMyAdmin">
   Order Allow,Deny
   Allow from all
</Directory>

Alias /phpmyadmin /usr/share/phpMyAdmin
Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /mysqladmin /usr/share/phpMyAdmin

phpMyAdminは「/usr/share/」の下に入っているが、エイリアスを設定することで、「/phpmyadmin/index.php」などでアクセスできるようになってると、そういう感じです。
(/usr/share/はURLからアクセスできない場所にあるとする)

もしこんな設定がある場合は、エイリアスの設定をいじれば「/phpmyadmin/index.php」などでアクセスはできなくなります。

<Directory "/usr/share/phpMyAdmin">
   Order Allow,Deny
   Allow from all
</Directory>

Alias /chou-cream /usr/share/phpMyAdmin

これだと「http://ホスト/chou-cream/index.php」でphpMyAdminにアクセスできます。こんな感じでphpMyAdminだと分からないようなURLにしとけば、認証をかけてなかったとしても簡単には不正なアクセスはされないでしょう、たぶん。

chou-creamはシュークリームと書いたつもりです。今シュークリーム食べながらこの記事書いてるもんで……ごめん。シュークリームなんて久しぶりに食べたよ。やっぱり美味しいですね。個人的にはエクレアの方が好きですが……。

ちなみにちょい古い情報ですが、phpMyAdminをやむって入れる方法は前に書いたことがあるので、もし参考になるなら。

サーバー初心者の俺でもできた!! 〜apacheのインストールからドメインを当てるまでの激闘が今ここに〜

もしphpMyAdminを入れてないのに接続エラーが大量に発生して接続できなくなったって場合は……すまん、糖分補給しても分からん。



閑話的な

これはphpMyAdminだけを狙ったものではないかもしれないんですが、「phpmyadmin」や「mysqladmin」みたいなデフォルトで設定されるようなやつじゃなきゃ大丈夫なんだろって言われると、案外そうでもなさそうです。似たような名前で総当たり的なアクセスをしてくる場合もある。

僕がアクセスログを見た限りでも「phpmyadmin」「mysqladmin」辺りは当然として、「phpmyadmin2」「phpmyadmin3」「1phpmyadmi」「2phpmyadmin」とか「sqladmin」「sysadmin」「myadminphp」「admin/phpmyadmin」「databese」「db」「db/phpmyadmin」「mysql」「mysql-admin」みたいに、データベースの管理ツールに使いそうなURLをとにかく叩いてくるようです。その中でステータスが200を返したところに今度は別の攻撃を仕掛けてくると、そんな感じですかね。

こちらの日々成長さんが、アクセスリストを載せてくれてます。かなりいっぱい書いてあるので、参考になると思います。






何か設定をいじったりした直後に接続エラーが出るようになったって場合は、何かしらその設定に問題がある可能性が高いと思うんですが、何もしてないのにある時点を境に急に接続エラーが大量に出たって場合は、まずはこの辺を疑ってみても良いんじゃないでしょうか。

ところで、シュークリームの「シュー」ってのはフランス語でキャベツって意味なんですけど、作ってみたら何かキャベツっぽい形になったからシュークリームって名前にしたのか、シュークリームって名前にしたいがためにあえてキャベツっぽい形にしたのか、どっちなのかな。

まだコメントはいただけてないみたい……
もしかしたら何か関連しているかも?