さくらのVPSで運用している当ブログがDDoS/DoS攻撃を受けました。なので今回はそのDDoS/DoS攻撃について具体的な対処法とこれからの対策方法を実施した記録をご説明します。なお、今回は下記のページを参考にして記事を書きました。
- 不正アクセスからサーバを守るfail2ban。さくらのクラウド、VPSで使ってみよう! | さくらのナレッジ
- DoS攻撃/DDoS攻撃からサーバーを守る方法(fail2banのススメ) | colori
- CentOS 7 で fail2ban を使ってみたメモ 愛しく切ない1bed
DDoS/DoSの応急措置
あまり良い方法ではありませんが、DDoS/DoS攻撃攻撃を受けているとHTTPS接続もSSH接続もできません。したがってさくらのVPSのコントロールパネルに入って、強制停止のボタンを押します。
# shutdown -h now
本来サーバーを停止するときは、通常停止のshutdownコマンドを使うことが推奨されています。実際に強制停止のボタンを押すかどうかは自己責任でお願いします。「強制停止 → 再起動」をすることによって、特定のIPアドレスからの攻撃はとりあえず止めることができました。
DDoS/DoS攻撃攻撃の対策
もちろん応急措置して終わりではありません。DDoS/DoS攻撃攻撃に対して恒久的な対策が必要です。
被害状況の確認
今後の対策を立てるために、被害状況を確認します。
# view /var/log/htttpd/access_log /22\/Dec\/2017\:14
“/(スラッシュ)”を用いて、攻撃を受けていたと思われる時間を検索してアクセスログの状況を確認します。どうやら218.×××.×××.0というIPアドレスから、wp-login.phpにしつこく不正ログインのattackをされていたようです。他のIPアドレスからも同様の不正ログインがあり、タチの悪いattackであると言わざるを得ません。
fail2banの稼働状況の確認
# systemctl restart fail2ban ● fail2ban.service - Fail2Ban Service Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled) Active: active (running) since ...
さくらのVPSでは、デフォルトでfail2banという不正攻撃のログ痕跡からアクセスを自動遮断するアプリケーションが、標準でインストールされています。
今回はなぜ機能を発揮して、DDoS/DoS攻撃攻撃を防ぐことができなかったのでしょうか?fail2banの設定ファイルであるjail.confを確認してみましょう。今回、特に確認したのは2箇所です。
jail.confの確認~その1
1つめはSSHのフィルタ設定です。
# vi /etc/fail2ban/jail.conf ... # "bantime" is the number of seconds that a host is banned. bantime = 600 # A host is banned if it has generated "maxretry" during the last "findtime" # seconds. findtime = 600 # "maxretry" is the number of failures before a host get banned. maxretry = 5
デフォルトの設定では対象ホストを自動遮断(ban)する時間は10分で、ログファイルにおいて10分間攻撃と見られる兆候が5回続いた場合、自動遮断します。
jail.confの確認~その2
次に常習犯対策の確認です。”recidive“の箇所を確認しました。
... [recidive] logpath = /var/log/fail2ban.log banaction = %(banaction_allports)s bantime = 604800 ; 1 week findtime = 86400 ; 1 day
常習犯とみなしたIPアドレスは、1日の間に攻撃と見られる兆候があった場合、1週間banされる設定になっています。
jail.confの設定ファイルの変更
# pwd /etc/fail2ban/ # cp jail.conf jail.conf.org # vi jail.conf
ここからが具体的対策です。jail.confは設定ファイルなので、変更に当たっては必ず元のjail.confのコピーファイルを作成します。
jail.confの確認~その1
# "bantime" is the number of seconds that a host is banned. bantime = 150 # A host is banned if it has generated "maxretry" during the last "findtime" # seconds. findtime = 150 # "maxretry" is the number of failures before a host get banned. maxretry = 3
自動遮断する時間と攻撃と見なす時間は、それぞれデフォルトで設定されていた数値から4分の1に減らしました。また自動遮断する回数も5回から3回に減らしました。
jail.confの確認~その2
[recidive] ... # added enabled = true port = http,https maxretry = 3 action = %(action_mwl)s destemail = hoge@example.com ← 普段自分が使っているメール
recidiveの設定を見ていると、常習犯に対する定義が甘いように感じました。そこで以下の設定を追記しました。
- 常習犯対策を講じていることを明確に示す
- httpやhttpsを通じてやってくるDDoS/DoS攻撃も常習犯とみなす
- BANが行われた回数が3回に達したIPアドレスは長期間アクセス拒否
- BANしたIPアドレスの詳細な身元確認を行いメールに送信する
fail2banの再起動
# systemctl restart fail2ban # systemctl status fail2ban ● fail2ban.service - Fail2Ban Service Loaded: loaded (/usr/lib/systemd/system/fail2ban.service; enabled; vendor preset: disabled) Active: active (running) since 金 2017-12-22 17:31:52 JST; 19h ago Docs: man:fail2ban(1) Process: 2422 ExecStop=/usr/bin/fail2ban-client stop (code=exited, status=0/SUCCESS) Process: 10046 ExecReload=/usr/bin/fail2ban-client reload (code=exited, status=0/SUCCESS) Process: 2518 ExecStart=/usr/bin/fail2ban-client -x start (code=exited, status=0/SUCCESS) Main PID: 2521 (fail2ban-server) CGroup: /system.slice/fail2ban.service └─2521 /usr/bin/python2 -s /usr/bin/fail2ban-server -s /var/run/fa...
“recidive”の設定内容を保存したら、サービスの再起動を行いfail2banの変更を反映させます。
fail2banの動作確認
# view /var/log/fail2ban.log
fail2banのログを確認して特に何もなければ、このような画像が表示されます。こちらのGistGitHubのコードを確認すると、ところどころ”BAN”の文字列が表示されています。
なお、IPアドレスとして固定IPアドレスを使われている方は、fail2banが動作しているかどうか、自分でF5攻撃をしてみると良いかもしれません(その場合、自己責任でお願いします)。