AWS WAF Security Automations

這個大概是2019/12更新出來的新功能

1
2
3
4
AWS WAF Security Automations
Version 2.3.1
Last updated: 12/2019
Author: AWS

之前有用過WAF的Rate rule以及這個stack的舊版

都沒辦法做到設定自訂時間/次數 request ban

會卡在5min/2000 request的限制

而且ban完之後只要低於此規則就會自動release

對間歇性的DDOS沒啥用….

當時support推薦了我fail2ban,其實是滿有效的

但是現在要全面轉到fargate上面,fail2ban的對應上面設定就變得麻煩很多

於是我又跑去問support有沒有更好的方案

才發現原來這玩意更新了而且更好用XD


這邊是Resource

awslabs/aws-waf-security-automations

AWS WAF Security Automations


由官方這張圖可以得知這次更新了兩種 parser

Lambda Parser

Athena Parser

原理跟之前一樣都是撈取S3中的ALB log去做比對

這次我實作是採用Lambda Parser

WAFAutomations


執行CloudFormation

Step1.

把範本丟進去

1
https://s3.amazonaws.com/solutions-reference/aws-waf-security-automations/latest/aws-waf-security-automations.template

Step2.

設定完Name,選擇

Activate HTTP Flood Protection =>Yes - Lambda Parser

目前這邊用不到其他防護 要啟用也是可以 所以 其他選項 => No

Endpoint Type => ALB

這邊目前是套用在ALB上,如果是要做在Cloudfront上就選

Application Access Log Bucket Name

設定S3 Bucket Name 例如 alb-log-bucket,不需要加arn之類的東西

Request Threshold

設定你要的request數,這邊雖然說明寫五分鐘但是實際是每一分鐘的request數[1]

WAF Block Period

設定你要Ban多久再解Ban,單位是分鐘

Step3.

一路Next,最後Create的時候有兩個權限確認要打勾


WAF建立完成後連結ALB

這邊就不贅述了,但是這個時間點在實作的時候碰到WAF有新舊版介面之分

有詢問Support得知Api是走不同的

實測了一下這個stack建立出來的在WAF Classic那邊的介面才看得到

之後新舊版會不會整合完成不確定


修改Kinesis Firehose抓取時間

有玩過kinesis的應該知道他會有一個值是多少容量/時間會傳送

這邊實測是覺得預設的300s (5分鐘) 有點久

就改小一點變60s,阻擋速度會比較快一些

當然你設多久基本上只有影響阻擋反應時間,他判別還是一分鐘內的request數量


AWS CLI/SDK

可以用CLI去撈取ban List

範例如下

1
aws waf-regional get-ip-set --ip-set-id feadf9ad-1165-490e-ba9c-ee08d5a16a47 --region ap-southeast-1

也可以使用AWS SDK[2]去撈取,並傳送到Slack

撈取出來的型態如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"IPSet": {
"IPSetId": "feadf9ad-1165-490e-ba9c-ee08d5a16a47",
"Name": "DDoS - HTTP Flood Set",
"IPSetDescriptors": [
{
"Type": "IPV4",
"Value": "72.14.199.103/32"
},
{
"Type": "IPV4",
"Value": "72.14.199.125/32"
},

]
}
}

Notice

這邊碰到的Bug是S3 Bucket權限問題,為了這個還跟support連線了一次XD

建議是直接使用ALB去Create Bucket會少很多bug…

後來有看了一下應該是手設policy有缺了一些東西


小結

這邊特別感謝超專業的AWS Support解答我的問題XD

AWS的中文Support Team真的很強,有買plan的人要多多使用啊~XD

還有感謝強者同事Derek大大幫我搞定SDK問題~

跑了幾天有發現阻擋了不少fail2ban沒抓到的ip,看來架在哪一層還是有點差異性在…

Athena parser這次沒用到,不過我覺得應該比Lambda貴很多…(?)


Reference

[1]Appendix C: Log Parser JSON file

1
2
3
Request Threshold [required]: the maximum acceptable requests per minute per IP address. The solution uses the value you define when provisioning/updating the CloudFormation stack.

Block Period [required]: the period (in minutes) to block applicable IP addresses. The solution uses the value you define when provisioning/updating the CloudFormation stack.

[2]AWS WAF Regional

get-ip-set

GetIPSet