これまでのお話
Amazon Lightsail インスタンスに接続出来なくなったので対応したけど原因がよくわからない
「現在サイトが繋がりにくくなっております」(サーバへの高負荷のため)
ざっくり書くとWordPressにアクセスが集中した結果データベースの同時接続数を上回るようになり、断続的にサイトが停止してしまいました。問題を切り分けるためにWordPress以外の機能をEC2に移行してみたところ、そちらは全く問題がなく、高負荷状態のときのアクセスログを追ってみるとCloudFrontを経由しない形で一部のWordPressファイルにアクセスが集中していることがわかりました。というわけでセキュリティ対策も兼ねていくつか対策を実施しています。
実施した対策
- Lightsailデータベースのデフォルトユーザーのパスワード変更
- WordPress他、用途別データベースユーザーの作成と設定
- LightsailインスタンスへのSSH接続をVPN経由のみに制限
- CloudFrontにWAF導入
- wp-cron.phpの使用を停止
- wp-config.phpを上の階層へ移動した上でパーミッションを「400」に変更
データベース関連
データベースに関してはさして重要なデータ(個人情報とか)が入っているわけではありませんが、上書きされたらそれはそれでしょんぼりなので対策しておきました。マニュアル通りにやるとLightsailデータベースのデフォルトユーザー(スーパーユーザー)を使い回すことになっちゃうんですよね。さすがに怖い。というわけでWordPressを始め、使用するDBが限定されている機能についてはそれぞれ権限を絞ったユーザーを作成して割り当てました。セキュリティの穴を完全に塞ぐのは難しいですけど、どこかから漏れて全部がダメになるというのは防げるかなと。
SSH接続
SSH接続についてはたぶん大丈夫だろうとは思うんですけど、念のため。せっかくVPNを契約しているので。仕事でもないのに毎回VPNに接続してからSSHというのも煩雑って言えば煩雑ですけど、毎日触るものでもないしまあ良いかと。VPNに関してはこのへん。
VPNサービスを使って固定IPアドレスを設定する
CloudFrontのWAF
設定はしてみたもののWordPressでの運用がなかなか難しく、「ブログ執筆 → 下書き保存 → 403エラー」となってうわああああみたいなことが何回かあったので、試行錯誤中です。モニターモードで動かした限りではほとんどヒットしていなかったので、あんまり必要ないかもしれません。wp-cron.php
いわゆる予約投稿などを制御しているプログラムですが、僕知らなかったんですけどこれって「人力」で動いてたんですね。ページにアクセスがあるたびに呼び出されるって言う。そんなに動かす必要ある?ページが繋がりにくくなっていた時間帯のアクセスログを追っていたら wp-cron.php に直接アクセスしてきているログもあったので、wp-cron.php を使うのを止めました。代わりに crontab に設定しています。
WordPress has something called wp-cron. If you haven’t read about it, its fine. But please be aware that you cannot live without it! That is why, I am not asking you to disable wp-cron.
Better wp-cron using linux’s crontab
wp-config.php
データベース情報とか記載されていて見られたらあかんやつですが、WordPressの場合普通にドキュメントルートにあるんですよね。それでも通常は見られることはありませんが、一応対策。先日WordPress関連のセキュリティ対策の見直しを行いました。 主にこちらのページを参考に行いました。 そこで面白いなと思った「wp-config.phpの強化」について、ご紹介します そこまで専門的な知識なし、コードコピペでできます
WordPressのセキュリティ対策/wp-config.phpの移動によるリスク回避。 #WordPress – Qiita
効果のほどは?
正直いってよくわかりません。最後の対策を行ってから24時間以上経過し、その間高負荷にはなっていませんが、これが対策によるものなのか単純に攻撃が収まっているだけなのかなんとも言い難いです。ただ1つだけ言えることは、
wp-cron.phpだけは止めておいた方が良い
ってことですかね。例えDoS攻撃的なアクセス集中が起きたとしても、wp-cron.php を止めておけばなんとか生き延びられるような気がします。CloudFrontもあるし。逆にCloudFrontがあったとしても、wp-cron.php がアクセスごとに動いちゃうのであれば全然負荷軽減になってませんよね。
いやー知らんかった。
このまましばらくは様子を見たいと思います。どうなるかなー