【AWS】LightsailインスタンスにホストするWPサイトへのDOS攻撃をfail2banで防ごう!

どもども、インフルエンザ抜け瀕死状態の僕です。皆様、ご自愛くださいませ。


Amazon Lightsailはコンピューティングリソースをコストパフォーマンス良く利用できるAWSサービスです。さらに事前設定された開発スタック(bitnamiなど)を含むインスタンスによりWordpressによるWebサイトの作成などを非常に少ない手順で開始することもできます。


しかしご存知の通り、Wordpressはサイト作成における王道であり攻撃方法は日々研究されており被害に遭う確率も高く、立ち上げただけの状態ではセキュリティ面に少し不安が残ります。


そこで今回はWordpress用Lightsailインスタンスにfail2banをインストールする方法を共有いたします。DOS攻撃や極端なスクレイピングに対策しておきましょう。

インストール手順

今回はWordpressのプラグインは利用せず、http及びhttpsポートに対し制限を設ける方法です。


まずはabコマンドを利用しホストしているサイトに対し、接続テストをしておきます。様々な結果が表示されますが、Complete requestsが指定した接続回数になっていることを確認しておきましょう。

$ ab -n 20 <サイトURL>
...
Complete requests:      20
...

続いてサーバーに接続しましょう。まずはapacheのアクセスログがどこにあるかをあらかじめ把握する必要があります。アクセスログに記載されているIPをもとにアクセスブロックが行われるためです。

$ which httpd
/opt/bitnami/apache/bin/httpd
$ ls /opt/bitnami/apache/
... logs  ...
$ ls /opt/bitnami/apache/logs
access_log
...

これでアクセスログのパスが/opt/bitnami/apache/logs/access_logであることがわかりました。

それではfail2banをインストールしていきましょう。fail2banはあくまで条件に合致するアクセスを検出するツールであり、実際のブロックはiptablesを利用するため両方インストールしておく必要があります。

$ sudo apt-get install fail2ban
$ sudo apt-get install iptables
$ sudo apt-get install iptables-persistent

続いてfail2banの設定を行なっていきます。条件に合致するアクセスに対しどのようなアクションを取るかはjailと名のつくファイルで設定します(条件の設定方法は後ほど説明)。デフォルトでjail.confというファイルが見つかりますがこちらは書き換えず、jail.localというファイルを新たに作成して設定を行います。jail.localはjail.confをオーバーラップするため、jail.confの内容を全て網羅する必要はありません。

$ sudo vim /etc/fail2ban/jail.local
[DEFAULT]
ignoreip = 127.0.0.1/8 xx.xx.xx.xx(LightsailインスタンスにアタッチしているEIP)
maxretry = 10
findtime = 300
bantime = 3600
apache_access_log = /opt/bitnami/apache2/logs/access_log

# 事前によく使う変数を定義
protocol = tcp
chain = INPUT
port = 0:65535
banaction = iptables-multiport
action_ = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]

[sshd]
enabled = true

[apache-dos]
enabled = true
port = http,https
filter = http-dos
logpath = %(apache_access_log)s
maxretry = 12
findtime = 3
bantime = 86400
action = %(action_)s
#destemail = hoge@mail.jp

上記の例はあくまで参考です。メール通知は行われず、ブロックのみを行います。

http,httpsポートに対し、3秒間の間に12回の条件に合致する接続があった場合そのIPを86400秒ブロックします。

続いて条件(filter)の設定を行いましょう。今回はDOS攻撃やスクレイピングなど特定IPからの過剰なリクエストをブロックするのでfilter名はhttp-dosとしておきます。

それではファイルを新規作成し、条件を記載していきましょう。ファイル名はfilter名.confとなります。

$ sudo vim /etc/fail2ban/filter.d/http-dos.conf
[Definition]
failregex = ^<HOST> -.*"(HEAD|GET|POST).*
ignoreregex = \.(?i)(jpe?g|gif|png|bmp|pdf|js|css|woff|eot|ttf|ico|txt|xml|swf|xlsx?|docx?|pptx?)

正規表現でHOSTとなる部分をアクセスログから抽出します。

これで準備完了です、fail2banを再起動しましょう。

$ sudo service fail2ban restart

続いてfail2banに起動エラーがないかをログで確認し、エラーがある場合は適宜修正とfail2banの再起動を行なってください。

$ less /var/log/fail2ban.log

正常にfail2banが起動しましたら、早速テストしてみましょう。

fail2banのテスト

前章の冒頭で登場した方法を再び利用します。

$ ab -n 20 <サイトURL>
...
SSL read failed (5) - closing connection
SSL read failed (5) - closing connection
...
Test aborted after 10 failures
...

一度目は成功するかもしれませんが、二度目からアクセスが遮断されていることが確認できるかと思います!これでfail2banが正常に機能していることが確認できました!

実際にfail2ban側のステータスでもこの様子は確認できます。

$ sudo fail2ban-client status http-dos
...
Banned IP list:	xx.xx.xx.xx (ブロックされたIP)


接続できないままでは困るので一通り確認ができましたらブロックを解除しておきましょう。

$ sudo fail2ban-client set apache-dos unbanip xx.xx.xx.xx (ブロックされたIP)


編集者が間違ってブロックされないようにjail.localのignoreipに編集者の利用IPを記載しておいてもいいかもしれません。

[DEFAULT]
ignoreip = 127.0.0.1/8 xx.xx.xx.xx(LightsailインスタンスにアタッチしているEIP) xx.xx.xx.xx(編集者IP)
...

まとめ

WordPressのプラグインや外部サービスを利用する方法もありますが、料金面を考えるとfail2banは無料であるためサービス規模によっては十分とられるべき選択肢だと思います。


昨今の世界情勢から国外から日本サービスへの攻撃は激化の一途を辿っています。取れる対策はどんどん取っていくようにしていきたいところです。


最後まで読んでいただきありがとうございました!

参照:
https://www.noorix.com.au/blog/how-to/guide-on-setting-up-a-secure-wordpress-hosting-on-aws-lightsail/
https://colo-ri.jp/develop/2016/02/fail2ban.html

AWS

Posted by CY