GCP Cloud armorとAWS WAFのban反映時間を比較

こんにちは角田(tsunoda)です。
最近腹が出てきた気がします。( ‘-’ )

GCPのCloud armorと、AWSのWAF、
実際に両方使ってみたのでban-timeを比較した結果を書いていこうと思います!
Cloud armorについては以前ご紹介したので、今回はWAFを主にご紹介します。
fail2banとCloud armorでbanする

Cloud armorとは

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

DDoS対策
IP制限(whitelist,bkacklist)

検証詳細はこちら↓
fail2banとCloud armorでbanする

AWS WAFとは

可用性、セキュリティ侵害、リソースの過剰消費といった一般的なウェブの脆弱性から
ウェブアプリケーションまたは API を保護するウェブアプリケーションファイアウォールです。
こちらもDDoS対策やIP制限に使えます!

WAFを設定してみる

まずはWeb ACLを作成します。

regionの選択を忘れがちなので注意です。 Create web ACL をぽち。
detailsの設定をして、今回Ruleなどは後で作成します。
Create web ACL ぽち!できました。

Web ACLができたら、作成したWeb ACLを選択、Add rules をぽちってRuleを作成します。
こんな感じで設定します。↓

5分間で100アクセス以上してきたIPをbanするルールを作成してみます。↓

-Rule/Type
  Regular ruleか、Rateをベースにしたルールを作るよという意味

-Request rate details/Rate limit
  この値はアクセス数。全アクセスか、リクエスト指定か選べる。  
  Rate-based ruleの場合はここでrateを設定する。  

-Action/Action
  Blockは実際にルールにしたがってbanする。Countにすると計測のみ行いbanはしない。

Add rule ぽちで作成完了です。
5分間で100アクセス以上アクセスのあるIPを5分間ban ルールができました。
すると先ほど作成したWeb ACLに設定されています。

次にこの設定を入れるresourceを選びます。
Add AWS resources ぽち。

API GatewayかLBか選択できます。
今回はLBを選択します。

以上で基本的な設定は完了です。おっしゃおっしゃ。

AWS WAF検証

ということで、banされるまでおもむろにLBにcurlを投げてみます。

$ while true; do curl ${LB-DNS_NAME} -I; done
HTTP/1.1 200 OK
Date: Thu, 19 Dec 2019 09:28:32 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive

・・・

HTTP/1.1 403 Forbidden
Server: awselb/2.0
Date: Thu, 19 Dec 2019 08:09:07 GMT
Content-Type: text/html
Content-Length: 134
Connection: keep-alive

HTTP/1.1 403 Forbidden
Server: awselb/2.0
Date: Thu, 19 Dec 2019 08:09:08 GMT
Content-Type: text/html
Content-Length: 134
Connection: keep-alive

アクセスし続けること約30秒。
403が返ってきました。
Web ACLのoverviewでもちゃんとbanされたことを確認できます。

unbanは5分後なので、時々アクセスしながら待ってみます。

$ curl ${LB=DNS_NAME} -I
HTTP/1.1 200 OK
Date: Thu, 19 Dec 2019 09:15:10 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive

5分と言いながら実際にbanされてから約6分後にunbanでした。
何回か検証しましたが、banになる時間、unbanになる時間は大体同じでした。

GCP Cloud armorとAWS WAF ban-time比較

banされるまでの時間 unbanされるまでの時間
GCP Cloud armor 約2~3min 設定可能(約2〜3min〜)
AWS WAF 約30sec 約6min
WAF早っ!

### まとめ AWS WAFは `反映時間が早く、インスタンスより手前でのアクセス計測なので` 同一IPからの大量アクセスによる高負荷は最小限に抑えられそうですね。 かゆい所としては、 ``` unbanされるまでの時間をまだ設定できない所、 overviewでは過去3時間分しか確認できない所、 より詳細なデータを収集するにはcloud watchやs3にログを吐かせる設定を追加しなければならない所 ``` でしょうか。

GCP Cloud armorは 反映時間が遅く、インスタンス単位でのアクセス計測なので 高負荷がやってくる事もしばしば。。
unbanの反映にも最低2〜3分はかかります。
ただfail2banと併用すればban-timeや、ルールの微調整も可能なので、柔軟性があると思いました。
logもstackdriver loggingで調査し易く、過去のデータも閲覧しやすいです。

両方使ってみて、
迅速な対応に向いているのは反映時間の早いAWS WAFでした。
DDoS対策などに加えてホワイトリスト登録やbanの微調整など融通が効くのはGCP Cloud armorといった印象です。

もう少し詳細なWAFの設定などはまた次回紹介しようと思います。