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

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の新しいセキュリティ対策サービスです。
主な機能は以下になります。

Plain text
DDoS対策
IP制限(whitelist,bkacklist)

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

AWS WAFとは

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

WAFを設定してみる

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

AWS WAFのコンソールでWeb ACLの作成を開始する画面

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

AWS WAFでWeb ACLのリージョンや基本情報を設定する画面

Create web ACL ぽち!できました。

AWS WAFで作成が完了したWeb ACL

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

AWS WAFでWeb ACLにルールを追加する画面

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

AWS WAFで5分間に100アクセスしたIPをブロックするレートベースルールの設定

Plain text
-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 ぽち。

AWS WAFのWeb ACLに保護対象リソースを追加する画面

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

AWS WAFの保護対象としてApplication Load Balancerを選択する画面

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

AWS WAF検証

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

Plain text
$ 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されたことを確認できます。

AWS WAF検証の画面

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

Plain text
$ 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の設定などはまた次回紹介しようと思います。