[AWS Security] How to Block an IP Address

Posted by MinhHungTrinh on 2021-05-22
Estimated Reading Time 10 Minutes
Words 1.6k In Total
Viewed Times

Chào mọi người, ở bài viết trước mình có nói qua về một số giải pháp về Network Security (https://minhhungtrinh.github.io/2021/05/17/AWS-Security-Network-Security/) trên AWS. Hôm nay, mình sẽ trình bày vài cách để block an IP address trên vài mô hình phổ biến trên AWS.

Blocking an IP address with 1 EC2

main

Khi ứng dụng của chúng ta là kiến trúc đơn giản chỉ sử dụng 1 EC2. Instance nằm trong Public Subnet. Instance thì có public IP để client có thể access từ internet. Chúng ta có thể sử dụng các firewalls như mình đã nói ở bài viết trước (https://minhhungtrinh.github.io/2021/05/17/AWS-Security-Network-Security/#Network-Security), như sau:

  • NACL (Subnet Firewall)
  • Security Group (Instance firewall)
  • Firewall Software trong EC2 (Cái này là optional, bạn có thể enable)

Ở trường hợp này khi muốn block 1 IP address nào đó, thì use case tốt nhất là sử dụng NACL (được attach vào subnet chức EC2) để Deny. Ưu điểm là:

  • Cung cấp console để quản lý dễ dàng hơn, cung cấp action để thực hiện Allow và Deny nhanh chóng, hiệu quả.
  • Việc allow và deny với inbound và outbound là độc lập.
  • Chi phí rẻ, tức là chúng ta không cần trả phí

Ở trường hợp này người ta không dùng Security Group bởi vì nó không có Deny Rule, và việc nó là stateful nên chỉ cần allow inbound thì outbound sẽ ok. Vậy nên Security Group phù hợp cho trường hợp ta muốn Allow 1 IP nào đó chứ không dành cho việc Block IP nào đó.

Ở trường hợp này cũng không nên sử dụng firewall software để block IP. Bản chất Firewall Software cài đặt trên EC2. Nếu có request tới EC2, thì sẽ phải sử dụng tài nguyên của EC2 để firewall software allow hay block IP. Vậy tất nhiên là sẽ tốn tài nguyên của EC2, nó sẽ là vấn đề khi lượng request spam lớn. Hơn nữa, việc quản lý nó chúng ta phải access vào EC2 để quản lý, sẽ bất tiện và cũng như khi EC2 bị hết tài nguyên thì chúng ta cũng không thể thực hiện bất kỳ action nào.

Vậy nên bạn hãy nhớ khi cần allow thì dùng security group, khi cần deny thì dùng NACL. Vì các service này xử lý độc lập không liên quan tới EC2 nên sẽ không bị ảnh hưởng bởi vấn đề tài nguyên của EC2

Blocking an IP address with - ALB, NLB

ALB

main

Mô hình này sẽ gồm dịch vụ Elastic Load Balancer (ở đây ví dụ sử dụng ALB) ở Public Subnet, các behind server là EC2 chỉ cần private IP (tốt nhất là nằm trong private subnet) để giao tiếp private với nhau và với ALB.

Client sẽ giao tiếp với Server bằng service trung gian là ALB. Và ALB sẽ có nhiệm vụ phân tải request tới các EC2.

Có 1 điều nên nhớ, các EC2 sẽ detect được IP request tới là IP của ALB chứ không phải Client. Vậy nên trong case này, Security group của các EC2 sẽ chỉ cần allow security group của ALB thôi. Khi thiết lập như thế, bạn sẽ không thể truy cập trực tiếp vào EC2 được mà phải qua ALB.
Đó cũng là lý do việc Allow hay Deny truy cập phải thao tác ở Network của ALB.
Ví dụ muốn block IP thì bạn phải thực hiện Deny IP đó ở NACL, và NACL này được gán vào Subnet chứa ALB.

NLB

Một sự khác biệt với NLB:
main

NLB thì cũng có nhiệm vụ phân tải giống ALB thôi. Khác biệt 1 chút là nó làm việc ở Layer4 còn ALB làm việc ở layer7. Các bạn tìm hiểu thêm nhé, vì nó không thuộc scope bài này.

Sự khác biệt ở chỗ khi Client request tới NLB, thì NLB sẽ forward request tới EC2. Và IP mà EC2 nhận được từ request sẽ là IP của Client chứ không phải IP của NLB (Khi sử dụng ALB thì sẽ là IP của ALB).
Điều đó liên quan đến việc Security Group của các EC2 phải allow địa chỉ IP của Client thì Client mới thực hiện request tới hệ thống được.
Điều đó đồng nghĩa với lý do NLB nó không sử dụng Security Group. Nên việc Allow thì phải allow ở Security Group của các EC2.
Tất nhiên giải thích lan man thế thôi nhưng việc Block IP thì vẫn sử dụng NACL như ALB nhé. :))

Blocking an IP address with - ALB + WAF

main
Giống hệt mô hình ở trên, chỉ khác là chúng ta có tích hợp WEF vào Load Balancer thôi. WAF là gì thì bạn tham khảo bài viết này nhé (https://minhhungtrinh.github.io/2021/05/17/AWS-Security-Network-Security/#AWS-WAF-Web-Application-Firewall)

Tất nhiên vì nó là 1 firewall service chúng ta tích hợp vào chứ không phải có sẵn ở ALB nên chúng ta sẽ phải mất phí cho các rules của nó.

Trường hợp này chúng ta có thể sử dụng chức năng WAF filter IP Addrress để block IP. WAF có thể tạo các filter phức tạp với IP address của request cũng như thiết lập các rules như kiểu đếm số requests để ngăn chặn các request giống nhau từ clients (mục đích spam chẳng hạn), tất nhiên là còn nhiều rules nữa. Vậy nên chúng ta sẽ có nhiều cách để đảm bảo về security trên ALB.

WAF không phải là 1 service trung gian đứng ở giữa Client và ALB. Mà nó là service chúng ta tích hợp trên ALB và thiết lập các rules. Vậy nên ở mô hình này, sử dụng WAF giúp bổ sung thêm cho chúng ta 1 layer bảo mật nữa.

Blocking an IP address witth - ALB, Cloudfront + WAF

main

Đây là mô hình tương tự với mô hình ở trên. Khác ở chỗ chúng ta sử dụng Cloudfront đứng trước ALB. Cloudfront là global service vậy nên nó nằm bên ngoài VPC của bạn.

Ở đây, Security Group của ALB cần allow tất cả các public IP của Cloudfront edge location. Lý do vì khi có request tới, ALB sẽ không nhìn thấy các client IP, nó chỉ nhìn thấy IP của Cloudfront edge location thôi. Và từ đó chúng ta cũng thấy việc sử dụng NACL (được attach vào subnet của ALB) để block IP ở đây không còn tác dụng nữa.

Vậy chúng ta sẽ có những giải pháp để Block IP với trường hợp này như sau:

  • Nếu sử dụng Cloudfront, chúng ta sử dụng geo-restriction feature để giới hạn IP đang truy cập. Tức là xác định IP đó ở vị trí địa lý nào, thì mình giới hạn không cho tất cả các clients ở khu vực đó. => Cách này sẽ làm ảnh hưởng các users khác, nên có vẻ không hiệu quả
  • Sử dụng WAF giống như cách trên. Tức là thay vì tích hợp WAF vào ALBthì chúng ta tích hợp nó vào 1 thành phần đứng trước ALB là Cloudfront. Và việc Block IP bằng cách filter IP cũng giống như các ở trên thôi.

Đây là Blog cá nhân của MinhHungTrinh, nơi mình chia sẻ, lưu giữ kiến thức. Nếu các bạn có góp ý, thắc mắc thì vui lòng comment bên dưới cho mình biết nhé. Mình luôn là người lắng nghe và ham học hỏi. Các vấn đề đặc biệt hoặc tế nhị mọi người có thể gửi email tới minhhungtrinhvn@gmail.com. Cảm ơn Mọi Người đã đọc Blog của mình. Yolo!