fail2banとCloud Armorでbanする

こんにちは角田(tsunoda)です。
ゼノバース2のレイドボス強ぇ~。。
最長老に会いたいけどなかなか会ってくれません(´ཀ`」 ∠)
Happy Halloween☆

そんな中先日、fail2banとCloud Armorの組み合わせでIPをbanしたのでご紹介します。

fail2banとは

fail2banとは、SSH等の不正アクセス(ログイン失敗)を検知し、一定時間そのIPアドレスからのアクセスをブロックするソフトです。
通常、fail2banは単体では使用せず、iptablesやfirewalldとともに使用します。
今回はCloud Armorを使用した次第です。

Cloud Armorとは

GCPのglobal HTTP(S) Load Balancerの新しいセキュリティ対策サービスです。
主な機能は以下になります。

DDoS対策  
IP制限(whitelist,bkacklist)

まだbetaなので無料です☆

Policy,ルールの作成

CloudArmorのPolicyとルールを作成してみます。
Policyの作成

$ gcloud beta compute security-policies create sample-policy

Policyが作成されました。

次にルールの作成を行なってみましょう。

$ gcloud beta compute security-policies rules create 1000 \
  --action deny-403 --security-policy sample-policy \
  --description "block" --src-ip-ranges xxx.xxx.xxx.xxx/32

・1000は優先度です。
数字が低いほど優先度が上です。

・–action
許可、拒否の設定ができます。
拒否ステータスは以下が選択可能です。
403(サクセス拒否)
404(ファイル未検出)
502(不正なゲートウェイ)

・–security-policy
対象となるsecurity-policyの選択。

・–src-ip-ranges
許可または拒否したいIP。

ルールが作成されました。

fail2banでbanされたらCloudArmor発動!

fail2banでbanが実行  
↓
そのIPに対してCLoud Armorで拒否ルールを作成
↓ 
unbanされたら拒否ルールを削除する。  

という一連の流れをfail2ban側で設定します。
今回はnginxを使用しています。

まずはポリシールールの作成、削除のスクリプトを作成しておきます。

/test/make-policy.sh
/test/delete-policy.sh


作成したスクリプトを
fail2ban/action.d/nginx-dos.conf
このファイルに登録しておきます。

[Definition]

actionban = sh /test/make-policy.sh

actionunban = sh /test/delete-policy.sh


さらにそのnginx-dos.confをfail2ban/jail.local
nginx-dosルールのactionに登録する。

[nginx-dos]
enabled = true
port = http,https
filter = nginx-dos
logpath = /var/log/fail2ban/fail2ban.log
maxretry = 15
findtime = 10
bantime = 180
action = nginx-dos

10秒の間に15回同じIPからアクセスが来たらそのIPを180秒banします。
すると、banされればactionbanに登録したmake-policy.shが、
unbanされればactionunbanに登録したdelete-policy.shが実行され、
ポリシールールの作成、削除が可能になります。

Cloud Armorの特徴

Cloud Armorを色々触って得た特徴をご紹介します。
・反映に時間がかかる。
ルールの作成、削除が実際に反映されるのに少し時間がかかりました。
2〜3分。

図のように、計算上はbantimeと同じ時間banされますが、
反映時間がまちまちなので30~60秒ぐらいbantimeとズレる事があります。

・同時にルールの作成、削除ができない。
ポリシールールを作成、または削除していると、
その間での新たな作成、削除はエラーで返ってきちゃいます。

まとめ

反映までに時間がかかるので、その間に負荷が上がってしまう事が考えられますが、
LB越しでのfail2banとの併用は大量のbotアクセスに対する対策になります。
LBでの拒否なので、今まではサーバ毎にバラバラにカウントしていたものが、
1台検知したら他のサーバでもbanできます。
betaで無料ですが、logは貯まるのでその料金は気をつけなきゃです。

fail2banは条件を分けてbantimeを設定できたり、
ホワイトリストも作れるし、
banactionもある程度自由なので個人的に好きだ!好きなんだよ!
それとGCPのサービスCloud Armorを合せて使ってみるのは面白かったです。
botアクセスによるサーバ負荷にお困りの方には一つの選択肢になるのではと思います。