使用 AWS WAF v2 Web ACL 限制存取小記
有時候在業務上會碰到一些超量存取的狀況,
所以今天要來測試 AWS WAF v2 Web ACL 來限制存取
情境:
使用 AWS Web ACL 對 ALB 限制存取超過一定門檻的行為
建立 ELB 以及 EC2
參考之前的筆記來建立
這邊有變化的大概就是目前 openSUSE Leap 已經出道 15.2
所以這次是使用 openSUSE Leap 15.2
查詢 image id 方式
# aws ec2 describe-images --filters "Name=name,Values=openSUSE-Leap-15.2*"
但是也是碰到找到的 image id 要先接受協議而無法非互動安裝
所以最快的方式就是先用 console 裝一個然後看他的 image id :)
我是用 ansible playbook 的方式建立 2 台 EC2
指派 default 與 ssh 的 security group
根據得到的 IP 進行連線測試
> ssh -i test-key.pem ec2-user@18.223.195.175
連入 2 台 openSUSE Leap 15.2 安裝 apache 並啟動服務, 編輯基本網頁, 建立 port 80 的 security Group, 確認可以存取
使用參考筆記的指令
建立 Load Balancer , 可以觀察 Type : application ( 所以是 ALB )
建立 Target Group, 建立 listener , 讓 ALB 可以存取到後端的 2 台 openSUSE Leap
確認 ALB 可以順利存取後端的服務
好的, 現在終於要進入本番角色 WAF 了 :)
在 AWS console 搜尋 WAF 服務, 登入 WAF 主控台
點選 Create web ACL
選取 Region
輸入 名稱
點選 Next
在 Rules: 點選 Add rules
點選 Add my own rules and rule groups
預設的 Rule type 爲 Rule builder
輸入 名稱
Type: 選取 Rate-based rule
Rate limit: 輸入要設定的門檻, 這邊輸入 1000 (1000 / 5 mins)
Action : Block
點選 Add rule
確認規則建立
點選 Next
點選 Next ( 如果沒有調整 )
點選 Next
確認相關資訊
點選 Create web ACL
接下來要來套用 WAF 到剛剛建立的 LB
點選剛剛建立的 Web ACL
點選 Associated AWS resources
點選 Add AWS resources
點選 Resource type: Application Load Balancer
選取剛剛建立的 ELB
點選 Add
觀察資訊
這樣就建立完成
接下來進行驗證, 我在外部使用 ab 指令 來進行測試
參考之前文章安裝 ab 指令 http://sakananote2.blogspot.com/2019/10/ab-apache-http-server-benchmarking-tool.html
節錄指令如下 # zypper install apache2-utils
確認 ab 版本
# ab -V
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
使用 ab 指令 打LB 900次
# ab -n 900 -c 1 http://test-elb-757822458.us-east-2.elb.amazonaws.com/index.html
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking test-elb-757822458.us-east-2.elb.amazonaws.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 900 requests
打完之後測試是否可以存取
# curl http://test-elb-757822458.us-east-2.elb.amazonaws.com/index.html
<html>This is site 2 </html>
因為沒有超過門檻 1000 / 5 mins 所以沒有問題
接下來打 1100 次
# ab -n 1100 -c 8 http://test-elb-757822458.us-east-2.elb.amazonaws.com/index.html
This is ApacheBench, Version 2.3 <$Revision: 1826891 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking test-elb-757822458.us-east-2.elb.amazonaws.com (be patient)
Completed 110 requests
Completed 220 requests
Completed 330 requests
Completed 440 requests
Completed 550 requests
Completed 660 requests
Completed 770 requests
Completed 880 requests
Completed 990 requests
Completed 1100 requests
Finished 1100 requests
再次測試存取
# curl http://test-elb-757822458.us-east-2.elb.amazonaws.com/index.html
<html>
<head><title>403 Forbidden</title></head>
<body bgcolor="white">
<center><h1>403 Forbidden</h1></center>
</body>
</html>
這邊就會觀察到, 目前無法進行存取
同場加映: 使用 IP sets 建立白名單, 允許連線
點選 WAF 控制台的 IP sets
點選 Create IP set
輸入名稱與 IP address
點選 Create IP set
點選剛剛建立的 Web ACL
點選 Rules
點選 Add rules
點選 Add my own rules and rule groups
Rule type: 選取 IP set
輸入名稱
選取剛剛建立的 IP set
Action: 點選 Allow
點選 Add rule
將 白名單的規則 priority 向上調整
點選 Save
再次以 ab 指令進行測試, 這次就會發現不會被 WAF 阻擋了
同場加映: 用 aws 指令列出 Web ACL 內容以及目前被阻擋的 IP
列出 WAF 在單一 region 的 web acl
# aws wafv2 list-web-acls --scope REGIONAL --region us-east-2 --profile default
{
"NextMarker": "test20200801",
"WebACLs": [
{
"Name": "test20200801",
"Id": "32f779c2-1c2b-4069-a625-b7d216802012",
"Description": "",
"LockToken": "34194f29-b629-4df3-b57c-f3d0f79e7619",
"ARN": "arn:aws:wafv2:us-east-2:783127631924:regional/webacl/test20200801/35e779c2-1c2b-4089-a615-b7d217801012"
}
]
}
這邊主要需要的資訊是 Name 與 Id
列出該 Web ACL 相關資訊
# aws wafv2 get-web-acl --scope REGIONAL --id 32f779c2-1c2b-4069-a625-b7d216802012 --name test20200801 --region us-east-2 --profile default
{
"WebACL": {
"Name": "test20200801",
"Id": "32f779c2-1c2b-4069-a625-b7d216802012",
"ARN": "arn:aws:wafv2:us-east-2:783127631924:regional/webacl/test20200801/35e779c2-1c2b-4089-a615-b7d217801012",
"DefaultAction": {
"Allow": {}
},
"Description": "",
"Rules": [
{
"Name": "test20200801",
"Priority": 0,
"Statement": {
"RateBasedStatement": {
"Limit": 1000,
"AggregateKeyType": "IP"
}
},
"Action": {
"Block": {}
},
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "test20200801"
}
}
],
"VisibilityConfig": {
"SampledRequestsEnabled": true,
"CloudWatchMetricsEnabled": true,
"MetricName": "test20200801"
},
"Capacity": 2,
"ManagedByFirewallManager": false
},
"LockToken": "34194f29-b629-4df3-b57c-f3d0f79e7619"
}
列出目前被阻擋的 IP
# aws wafv2 get-rate-based-statement-managed-keys --scope REGIONAL --region us-east-2 --web-acl-name test20200801 --web-acl-id 32f779c2-1c2b-4069-a625-b7d216802012 --rule-name test20200801 | jq '.ManagedKeysIPV4'
{
"IPAddressVersion": "IPV4",
"Addresses": [
"210.85.244.94/32"
]
}
這邊我使用 jq 來搭配過濾 IP v4 的部分, 原本會顯示 IPv4 與 IPv6
又前進了一步
~ enjoy it
Reference:
英明的同事文件
https://sakananote2.blogspot.com/2019/04/aws-elastic-load-balancing-with.html
https://sakananote2.blogspot.com/2019/04/aws-cli-opensuse-leap-15-in-aws-ec2.html
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/wafv2/list-web-acls.html
http://sakananote2.blogspot.com/2019/10/ab-apache-http-server-benchmarking-tool.html
沒有留言:
張貼留言