[AWS Technical Support Note] วิธีเพิ่ม IP address ที่มีการเข้าถึงเกินจำนวนครั้งที่กำหนดไปยังบัญชีดำ(Black list)โดยอัตโนมัติด้วยการใช้ AWS WAF

บทความนี้จะมาแนะนำวิธีการตั้งค่า rate-based rules ของ AWS WAF ให้ได้รู้จักกันครับ

ปัญหาที่เกิดขึ้น

URL ของทางบริษัทถูกโจมตีจากหลายร้อย IP address ในช่วงหลายวันที่ผ่านมานี้
รบกวนแนะนำวิธีเพิ่ม IP address ที่โจมตีเข้ามาให้ไปบันทึกที่ Blacklist โดยอัตโนมัติหน่อยครับ

วิธีแก้ปัญหา

ให้ตั้งค่า Rate-based rule ของ AWS WAF
หากต้องการการจัดการที่ละเอียดยิ่งขึ้นก็สามารถใช้งานSecurity Automations ของ AWS WAF ได้เช่นกัน

Rate-based rules ของ AWS WAF คืออะไร

ด้วยการตั้งค่า rate-based rules ของ AWS WAF จะนับจำนวนคำขอของ IP address และทำการบล็อก IP นั้นๆเมื่อมีการเข้าถึงเกินจำนวนที่กำหนดไว้โดยอัตโนมัติ

ปัจจุบันสามารถกำหนดค่าต่ำสุดได้ที่ 100 คำขอต่อ 5 นาที ตามขั้นตอนทางด้านล่างนี้

สร้าง Rate-based rules และ web ACL

ไปที่หน้าคอนโซลของ AWS WAF แล้วคลิก "Create web ACL"

จากนั้นให้ทำการป้อนรายละเอียดของ Web ACL โดยให้ป้อนชื่อ Web ACL และ CloudWatch Metric
ซึ่งในครั้งนี้จะทำการเชื่อมโยงกับ ALB ใน Oregon Region ให้เลือก Region type เป็น "Regional resources" และเลือก Region เป็น "US West (Oregon)"

จากนั้นกำหนด resources ที่จะเชื่อมโยงโดยเลือกที่ " Add AWS resources "

หลังจากเลือก "Application Load Balancer" แล้ว ให้ติ้กที่ช่องของ ALB ที่ต้องการเชื่อมโยง แล้วคลิก "Add" จากนั้นคลิก "Next"

ขั้นตอนต่อไปจะทำการตั้งค่า rule โดยเลือกไปที่ "Add my own rules and rule groups"

เลือก "Rule Builder" ที่หัวข้อ Rule type จากนั้นป้อนชื่อ rule เข้าไปและเลือก Type เป็น "Rate-based rule"

เนื่องจากเราต้องการกำหนดขีดจำกัดในการเข้าถึงมากกว่า 100 ครั้งใน 5 นาที ให้ระบุค่าที่จำกัดเป็น 100
และเลือก "Source IP address" เป็น IP address ที่จะทำการจำกัด

โดยในครั้งนี้จะทำการจำกัดด้วย rate-based rules ภายใต้ "/admin" ให้เลือก "Only consider requests that match the criteria in a rule statement"

จากนั้นจะทำการตั้งค่าเงื่อนไขโดยเลือกไปที่ "matches the statement" เพื่อให้ฟังก์ชั่นนี้ทำงานเฉพาะกรณีที่เงื่อนไขครบเท่านั้น
และกำหนด inspect เป็น "URI path" และ Match type เป็น "Start with string"
จากนั้นระบุ "/admin" เพื่อเป็น string ที่จะทำการจับคู่ (Match)กัน

จากนั้นเลือก Action เป็น "Block" และคลิก "Add rule"

และจะแสดง capacity ที่ใช้ในการสร้าง rule โดย rule ในครั้งนี้จะเท่ากับ "4"
และตั้งค่า Default action ของ Web ACL โดยเลือกที่ "Allow" สำหรับคำขอที่ไม่ตรงกับ rule และคลิก "Next"

ในหน้านี้จะสามารถกำหนดลำดับความสำคัญได้ แต่เนื่องจากครั้งนี้มีเพียง rule เดียวเท่านั้น เลือกที่ "Next" แล่วไปต่อข้อต่อไปได้เลย

ต่อไปจะเป็นการตั้งค่า Metric โดยสามารถเปลี่ยนชื่อ CloudWatch Metric สำหรับ rule ได้
นอกจากนี้ยังมี option ที่สามารถแสดงตัวอย่างคำขอที่ตรงกับ rule นี้บนหน้าคอนโซลของ WAF ด้วย โดยให้เลือก "Enable sampled requests" เพื่อเปิดใช้งาน

ในหน้าสุดท้ายจะแสดงรายละเอียดข้อมูลที่ลงรายละเอียดไว้
หากไม่มีปัญหาให้คลิกที่ "Create web ACL"
จากนั้น Web ACL จะถูกสร้างเรียบร้อย จากนี้จะทำการทดสอบการทำงานของ Rate-based rule กันต่อ

ทดสอบ

เริ่มด้วยสร้าง EC2 บน singapore region จากนั้นเชื่อมต่อผ่าน SSH และรันคำสั่ง curl ไปยัง ALB ใน Oregon Region ที่เชื่อมโยงกับ WAF หากไม่มีปัญหาจะตอบกลับมาตามด้านล่างว่า 200 OK

$ curl -I http://TESTWAFUS-707720361.us-west-2.elb.amazonaws.com/admin/
HTTP/1.1 200 OK
Date: Wed, 10 Jan 2024 04:26:25 GMT
Content-Type: text/html;charset=ISO-8859-1
Connection: keep-alive
Server: Apache/2.4.58 (Amazon Linux)

จากนั้นใช้ ApacheBench ส่งคำขอไปยัง ALB เป้าหมาย 200 ครั้ง
ผลลัพธ์ในแรกจะเป็นตามด้านล่างคือไม่บล็อกการเข้าถึง

$ ab -n 200 -c 1 http://TESTWAFUS-707720361.us-west-2.elb.amazonaws.com/admin/
(ย่อ)
Complete requests:      200
Failed requests:        0
Total transferred:      170200 bytes

ทันทีที่ผลลัพธ์ครั้งแรกแสดง ให้รันคำสั่งเดิมในครั้งที่ 2 ทันที และจะพบว่ามีคำขอ 26 รายการถูกบล็อก ** ค่าที่ได้อาจแตกต่างกันไปในแต่ละสภาพแวดล้อม **

$ ab -n 200 -c 1 http://TESTWAFUS-707720361.us-west-2.elb.amazonaws.com/admin/
(ย่อ)
Complete requests:      200
Failed requests:        26
   (Connect: 0, Receive: 0, Length: 26, Exceptions: 0)
Non-2xx responses:      26

และในครั้งที่ 3 การเข้าถึงจะถูกบล็อกไว้ทั้งหมด

$ ab -n 200 -c 1 http://TESTWAFUS-707720361.us-west-2.elb.amazonaws.com/admin/
(ย่อ)
Complete requests:      200
Failed requests:        0
Non-2xx responses:      200

เมื่อลองรันคำสั่ง curl อีกครั้ง จะแสดงเป็นข้อผิดพลาด 403 แล้ว

$ curl -I http://TESTWAFUS-707720361.us-west-2.elb.amazonaws.com/admin/
HTTP/1.1 403 Forbidden
Server: awselb/2.0
Date: Wed, 10 Jan 2024 05:12:24 GMT
Content-Type: text/html
Content-Length: 118
Connection: keep-alive

โดยสามารถใช้คำสั่งของ AWS CLI get-rate-based-statement-managed-keys เพื่อดู IP address ที่ถูกบล็อกโดย rate-based rules ได้

เนื่องจากมีการตั้งค่า Web ACL ใน ALB ไว้ จึงต้องตั้งค่าขอบเขตเป็น REGIONAL และระบุชื่อ Web ACL, Web ACL ID และชื่อ rule จากนั้นรันคำสั่งก็จะสามารถตรวจสอบได้ว่าปัจจุบัน IP ของ EC2 instance ใน sinagpore region จะถูกบล็อคอยู่

$ aws wafv2 get-rate-based-statement-managed-keys \
    --scope REGIONAL \
    --web-acl-name waf0512 \
    --web-acl-id b0171f79-7455-4533-94fd-e2463392512f \
    --rule-name Rate-based-rule-with-address
    
{
    "ManagedKeysIPV4": {
        "IPAddressVersion": "IPV4",
        "Addresses": [
            "13.250.19.50/32"
        ]
    },
    "ManagedKeysIPV6": {
        "IPAddressVersion": "IPV6",
        "Addresses": []
    }
}

เมื่อเวลาผ่านไปสักพัก พอลองรันคำสั่ง get-rate-based-statement-managed-keys อีกครั้ง จะพบว่า IP address ได้ถูกลบออกจากรายการ block list ไปแล้ว

$ aws wafv2 get-rate-based-statement-managed-keys \
    --scope REGIONAL \
    --web-acl-name waf0512 \
    --web-acl-id b0171f79-7455-4533-94fd-e2463392512f \
    --rule-name Rate-based-rule-with-address
    
{
    "ManagedKeysIPV4": {
        "IPAddressVersion": "IPV4",
        "Addresses": [
            ""
        ]
    },
    "ManagedKeysIPV6": {
        "IPAddressVersion": "IPV6",
        "Addresses": []
    }
}

บทความอ้างอิง

บทความต้นฉบับ

  • AWS WAF でアクセス数が一定回数を超えた IP アドレスを自動的にブラックリストに追加させる方法 | DevelopersIO (Japanese)