星期六, 8月 01, 2020

使用 AWS WAF v2 Web ACL 限制存取小記

使用 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 版本


# 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 -chttp://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:

沒有留言: