Làm Thế Nào Để Lựa Chọn Một Rule Firewall Hiệu Quả?

Rule Firewall linux

Sử dụng Firewall không chỉ đòi hỏi bạn phải nắm vững cú pháp mà còn cần đưa ra các quyết định Rule Firewall thông minh. Các tường lửa như iptables được thiết kế để thực thi các rule thông qua việc diễn giải các quy tắc do quản trị viên thiết lập. Tuy nhiên, với vai trò quản trị viên, bạn cần hiểu rõ những loại quy tắc nào phù hợp với hạ tầng của mình.

Trong khi các hướng dẫn khác tập trung vào các lệnh cần thiết để khởi chạy, bài viết này sẽ bàn luận về một số quyết định quan trọng mà bạn sẽ phải đưa ra khi triển khai tường lửa. Những lựa chọn này sẽ ảnh hưởng đến cách tường lửa hoạt động, mức độ khóa chặt của máy chủ và phản ứng của nó với các tình huống phát sinh. Mặc dù ta sẽ sử dụng iptables làm ví dụ cụ thể, hầu hết các khái niệm được nêu ra đều có thể áp dụng chung cho nhiều hệ thống khác nhau.

Xác Định Rule Firewall Mặc Định

Khi xây dựng một tường lửa, một trong những quyết định quan trọng nhất là chọn rule mặc định. Điều này xác định hành vi khi lưu lượng truy cập không khớp với bất kỳ quy tắc nào khác. Theo mặc định, tường lửa có thể hoặc là CHO PHÉP (ACCEPT) tất cả các lưu lượng không khớp với các quy tắc trước đó, hoặc là LOẠI BỎ (DROP) lưu lượng đó.

DROP Mặc Định vs ACCEPT Mặc Định

Một rule mặc định là ACCEPT có nghĩa là mọi lưu lượng không khớp được cho phép vào máy chủ. Tuy nhiên, điều này thường không được khuyến khích vì bạn sẽ phải làm việc ngược lại để chặn tất cả lưu lượng không mong muốn. Phương pháp loại trừ (blocklist) khó quản lý vì bạn cần dự đoán và chặn mọi loại lưu lượng không mong muốn, dẫn đến những rắc rối trong việc bảo trì, dễ mắc lỗi, cấu hình sai và có thể bỏ sót những lỗ hổng không lường trước trong rule.

Phương án thay thế là sử dụng rule mặc định là DROP. Điều này có nghĩa là bất kỳ lưu lượng nào không khớp với quy tắc cụ thể sẽ không được cho phép. Mỗi dịch vụ đều phải được cho phép một cách rõ ràng, có vẻ như đòi hỏi nhiều cấu hình ban đầu. Tuy nhiên, nhờ vậy, rule của bạn sẽ nghiêng về bảo mật và bạn biết chính xác những gì được phép nhận lưu lượng trên máy chủ. Hầu hết các rule được cấu hình sẵn đều theo cách tiếp cận này, giúp bạn dễ dàng xây dựng trên nền tảng mặc định hiện có.

rule DROP Mặc Định So Với Quy Tắc DROP Cuối Cùng

Quyết định chọn rule mặc định là DROP dẫn đến một lựa chọn tinh tế khác. Với iptables và các tường lửa tương tự, rule mặc định có thể được thiết lập qua chức năng tích hợp sẵn của tường lửa hoặc được thực hiện bằng cách thêm một quy tắc DROP “bắt tất cả” ở cuối danh sách các quy tắc.

Sự khác biệt giữa hai phương pháp này nằm ở điều xảy ra khi các quy tắc tường lửa bị xóa sạch (flush). Nếu chức năng rule tích hợp của tường lửa được đặt là DROP và các quy tắc của tường lửa bị xóa (reset) hoặc một số quy tắc khớp bị loại bỏ, các dịch vụ của bạn sẽ ngay lập tức không thể truy cập từ xa. Đây thường là ý tưởng hay đối với những dịch vụ không quan trọng, nhằm đảm bảo máy chủ không bị phơi bày lưu lượng độc hại nếu các quy tắc bị xóa.

Nhược điểm của phương pháp này là các dịch vụ của bạn sẽ hoàn toàn không khả dụng cho khách hàng cho đến khi bạn tái cấu hình lại các quy tắc cho phép. Thậm chí, bạn có thể tự khóa mình ra khỏi máy chủ nếu không có phương án truy cập cục bộ hoặc từ xa qua web.

Phương án thay thế cho việc thiết lập rule DROP bằng chức năng tích hợp là đặt rule mặc định của tường lửa là ACCEPT và sau đó triển khai một rule DROP thông qua các quy tắc thông thường. Bạn có thể thêm một quy tắc tường lửa thông thường ở cuối chuỗi các quy tắc để khớp và từ chối tất cả lưu lượng còn lại không khớp.

Trong trường hợp này, nếu các quy tắc tường lửa bị xóa, các dịch vụ của bạn sẽ vẫn có thể truy cập nhưng không được bảo vệ. Tùy thuộc vào phương án truy cập cục bộ hoặc thay thế của bạn, đây có thể là một “ác” cần thiết để đảm bảo bạn có thể truy cập lại máy chủ nếu các quy tắc bị xóa. Nếu bạn chọn sử dụng phương án này, hãy đảm bảo rằng quy tắc “bắt tất cả” luôn được đặt làm quy tắc cuối cùng trong tập hợp các quy tắc của bạn.

Làm Thế Nào Để Lựa Chọn Một Rule Firewall Hiệu Quả

LOẠI BỎ (DROP) vs TỪ CHỐI (REJECT) Lưu Lượng

Có một số cách khác nhau để ngăn một gói tin đến đích của nó. Lựa chọn giữa các cách này ảnh hưởng đến cách mà khách hàng cảm nhận về nỗ lực kết nối cũng như tốc độ họ nhận ra yêu cầu của mình sẽ không được phục vụ.

  • DROP:
    Đây là cách đầu tiên để từ chối các gói tin. Bạn có thể sử dụng DROP làm rule mặc định hoặc làm mục tiêu cho các quy tắc khớp. Khi một gói tin bị DROP, iptables chỉ đơn giản là loại bỏ nó mà không gửi bất kỳ phản hồi nào về cho khách hàng, do đó khách hàng (dù hợp lệ hay không) sẽ không nhận được bất kỳ xác nhận nào về việc gói tin đã được nhận.Đối với các kết nối TCP (ví dụ như kết nối qua trình duyệt web), kết nối sẽ bị đình trệ cho đến khi hết thời gian chờ. Với các kết nối UDP, việc không nhận phản hồi càng trở nên mơ hồ hơn. Thực tế, không nhận được phản hồi UDP thường được hiểu là gói tin đã được chấp nhận. Nếu khách hàng UDP quan tâm đến việc xác nhận gói tin, họ sẽ phải gửi lại để xác định liệu gói tin đã được chấp nhận, bị mất trong quá trình truyền, hay bị loại bỏ. Điều này có thể làm tăng thời gian mà kẻ xấu phải tốn để thu thập thông tin về trạng thái các cổng trên máy chủ của bạn, nhưng đồng thời cũng có thể gây ra vấn đề cho lưu lượng hợp lệ.
  • REJECT:
    Một phương án thay thế cho việc DROP là từ chối (REJECT) các gói tin mà bạn không cho phép. ICMP (Internet Control Message Protocol) là giao thức meta được sử dụng rộng rãi trên Internet để gửi thông báo trạng thái, chẩn đoán và lỗi giữa các host qua một kênh ngoài luồng, không phụ thuộc vào các giao thức thông thường như TCP hay UDP. Khi bạn sử dụng mục tiêu REJECT thay vì DROP, lưu lượng bị từ chối và một gói ICMP được trả về cho người gửi để thông báo rằng gói tin của họ đã được nhận nhưng sẽ không được chấp nhận. Thông điệp trạng thái cũng có thể được kèm theo để giải thích lý do.Điều này dẫn đến một số hệ quả. Nếu lưu lượng ICMP được phép đến khách hàng, họ sẽ ngay lập tức nhận được thông báo rằng lưu lượng của họ bị chặn. Đối với khách hàng hợp lệ, điều này có nghĩa là họ có thể liên hệ với quản trị viên hoặc kiểm tra các tùy chọn kết nối để đảm bảo rằng họ đang kết nối đến cổng đúng. Trong khi đó, với kẻ xấu, họ có thể nhanh chóng hoàn thành việc quét và xác định các cổng mở, đóng và bị lọc.

Có rất nhiều yếu tố cần cân nhắc khi quyết định giữa DROP và REJECT lưu lượng. Một lưu ý quan trọng là hầu hết lưu lượng độc hại thường do các script tự động thực hiện. Vì các script này thường không được giám sát, việc DROP lưu lượng không hợp lệ không thực sự răn đe chúng, và lại có thể gây ảnh hưởng tiêu cực đến lưu lượng hợp lệ. Bạn có thể tìm hiểu thêm về vấn đề này trên website của Peter Benie.

Bảng So Sánh DROP vs REJECT

Dưới đây là bảng so sánh cách một máy chủ được bảo vệ bởi tường lửa sẽ phản hồi các yêu cầu khác nhau tùy theo rule áp dụng cho cổng đích:

Loại Gói Tin Gửi Từ Khách Hàng Lệnh Nmap rule Cổng Phản Hồi Trạng Thái Cổng Được Suy Diễn
TCP `nmap [-sT -sS] -Pn <server>` ACCEPT TCP SYN/ACK
TCP `nmap [-sT -sS] -Pn <server>` DROP (không phản hồi) Không có phản hồi
TCP `nmap [-sT -sS] -Pn <server>` REJECT TCP RESET
UDP nmap -sU -Pn <server> ACCEPT (không phản hồi) Mở hoặc Được lọc Mở hoặc Được lọc
UDP nmap -sU -Pn <server> DROP (không phản hồi) Không có phản hồi Mở hoặc Được lọc
UDP nmap -sU -Pn <server> REJECT ICMP Port Unreachable Đóng

Rule ICMP

Tương tự như quyết định DROP hay REJECT lưu lượng, bạn có thể lựa chọn cho phép hoặc từ chối các gói ICMP đến máy chủ của mình.

ICMP là giao thức được sử dụng cho nhiều mục đích khác nhau. Như đã đề cập, nó thường được gửi lại để cung cấp thông tin trạng thái cho các yêu cầu sử dụng các giao thức khác. Một trong những chức năng phổ biến nhất của ICMP là gửi và phản hồi các gói ping để xác nhận khả năng kết nối đến các host từ xa. Ngoài ra, ICMP còn có nhiều ứng dụng khác ít được biết đến nhưng cũng rất hữu ích.

Các gói ICMP được tổ chức theo “loại” (type) và sau đó là “mã” (code). Một loại (type) chỉ ra ý nghĩa chung của thông điệp. Ví dụ, Type 3 có nghĩa là đích đến không thể truy cập được. Một mã (code) thường được dùng để cung cấp thêm thông tin về loại đó. Cụ thể, ICMP Type 3 Code 3 nghĩa là cổng đích không khả dụng, trong khi ICMP Type 3 Code 0 có nghĩa là mạng đích không thể tiếp cận được.

Một số loại ICMP đã lỗi thời (deprecated) nên có thể bị chặn mà không cần kiểm tra điều kiện. Trong số này có ICMP source quench (type 4, code 0) và alternate host (type 6). Các loại 1, 2, 7 và từ type 15 trở lên đều đã bị lỗi thời, được dành cho tương lai hoặc chỉ mang tính thử nghiệm. Nhiều mẫu tường lửa chuẩn của các nhà cung cấp sẽ xử lý điều này theo mặc định.

Các Loại ICMP Cần Chặn Tùy Thuộc Vào Cấu Hình Mạng

Một số loại ICMP có ích trong một số cấu hình mạng nhất định nhưng nên được chặn trong các trường hợp khác.

Ví dụ, thông điệp ICMP redirect (type 5) có thể hữu ích để chỉ ra thiết kế mạng kém hiệu quả. Một thông điệp redirect được gửi khi có một tuyến đường tốt hơn sẵn có cho khách hàng. Nếu một router nhận được một gói tin cần được chuyển tiếp đến một host khác cùng mạng, nó sẽ gửi thông điệp redirect để yêu cầu khách hàng chuyển các gói tin sau đó qua host kia.

Điều này có ích nếu bạn tin cậy vào mạng nội bộ và muốn phát hiện các điểm không hiệu quả trong bảng định tuyến khi cấu hình ban đầu. Tuy nhiên, trên một mạng không tin cậy, kẻ tấn công có thể lợi dụng thông điệp redirect ICMP để thao túng bảng định tuyến trên các host.

Các loại ICMP khác có thể có ích trong một số mạng nhưng gây hại trong các trường hợp khác là thông điệp quảng bá router (router advertisement – type 9) và yêu cầu tìm router (router solicitation – type 10). Các gói tin này là thành phần của IRDP (ICMP Internet Router Discovery Protocol), cho phép các host, khi khởi động hoặc tham gia mạng, tự động tìm kiếm các router khả dụng.

Trong hầu hết các trường hợp, tốt hơn hết là cấu hình các tuyến cố định cho các gateway mà host sẽ sử dụng. Những gói tin này nên được cho phép trong cùng những tình huống như thông điệp redirect ICMP. Thực tế, vì host sẽ không biết tuyến đường ưu tiên cho lưu lượng của bất kỳ tuyến nào được phát hiện, thông điệp redirect thường cần thiết ngay sau khi quá trình tìm kiếm hoàn tất. Nếu bạn không chạy dịch vụ gửi gói router solicitation hoặc điều chỉnh định tuyến dựa trên các gói quảng bá (như rdisc), bạn có thể an tâm chặn những gói này.

Các Loại ICMP An Toàn Để Cho Phép

Các loại ICMP thường an toàn để cho phép bao gồm:

  • Type 8 — Echo Request:
    Đây là các yêu cầu ping gửi đến máy chủ của bạn. Thông thường, cho phép loại này là an toàn (vì chặn chúng không làm ẩn máy chủ, do còn nhiều cách khác để xác định máy chủ có hoạt động hay không), nhưng bạn cũng có thể chặn hoặc giới hạn theo địa chỉ nguồn nếu muốn.
  • Type 13 — Timestamp Request:
    Những gói tin này có thể được sử dụng để thu thập thông tin về độ trễ. Chúng cũng có thể bị lợi dụng trong các kỹ thuật fingerprinting hệ điều hành, do đó bạn có thể chặn hoặc giới hạn phạm vi địa chỉ được phản hồi.

Các loại dưới đây thường có thể được cho phép mà không cần quy tắc cụ thể, bằng cách cấu hình tường lửa cho phép phản hồi các yêu cầu mà nó đã gửi (sử dụng module conntrack để cho phép lưu lượng ESTABLISHED và RELATED):

  • Type 0 — Echo Replies:
    Đây là phản hồi cho các yêu cầu ping (echo request).
  • Type 3 — Destination Unreachable:
    Các gói tin “đích không thể đến” hợp lệ là phản hồi cho các yêu cầu từ máy chủ của bạn báo rằng gói tin không thể được chuyển đến.
  • Type 11 — Time Exceeded:
    Đây là thông báo lỗi chẩn đoán nếu một gói tin do máy chủ bạn tạo ra đã hết thời gian (TTL) trước khi đến được đích.
  • Type 12 — Parameter Problem:
    Có nghĩa là một gói tin xuất ra từ máy chủ của bạn bị định dạng sai.
  • Type 14 — Timestamp Responses:
    Đây là phản hồi cho các truy vấn timestamp được tạo ra bởi máy chủ của bạn.

Mặc dù một số chuyên gia an ninh vẫn khuyến cáo chặn tất cả lưu lượng ICMP đến, nhiều người hiện nay lại ủng hộ các rule cho phép ICMP một cách thông minh. Hai chủ đề trên Stackexchange có thể cung cấp thêm thông tin chi tiết.

Hạn Chế Kết Nối Và Giới Hạn Tốc Độ

Đối với một số dịch vụ và kiểu lưu lượng nhất định, bạn có thể muốn cho phép truy cập chỉ khi khách hàng không lạm dụng quyền truy cập đó. Có hai cách để giới hạn việc sử dụng tài nguyên: hạn chế kết nối và giới hạn tốc độ.

Hạn Chế Kết Nối

Hạn chế kết nối có thể được triển khai bằng các extension như connlimit để kiểm tra số lượng kết nối đang hoạt động mà một khách hàng mở ra. Điều này được sử dụng để hạn chế số lượng kết nối cho phép cùng một lúc. Nếu bạn quyết định áp dụng giới hạn kết nối, một số câu hỏi cần xem xét là:

  • Bạn có nên giới hạn theo từng địa chỉ IP, theo mạng con hay theo toàn hệ thống?
  • Bạn áp dụng giới hạn cho một dịch vụ cụ thể hay cho toàn bộ máy chủ?

Các kết nối có thể được giới hạn theo từng host riêng lẻ hoặc đặt giới hạn cho một đoạn mạng bằng cách cung cấp một tiền tố mạng (ví dụ: dãy địa chỉ IP cho toàn bộ một tổ chức). Bạn cũng có thể đặt giới hạn tối đa toàn cục cho một dịch vụ hoặc cho toàn bộ máy chủ. Hãy lưu ý rằng bạn có thể kết hợp các cách trên để tạo ra các rule phức tạp hơn nhằm kiểm soát số lượng kết nối.

Giới Hạn Tốc Độ

Giới hạn tốc độ cho phép bạn xây dựng các quy tắc điều chỉnh tần suất lưu lượng được chấp nhận bởi máy chủ. Có một số extension của tường lửa có thể được dùng cho việc này, bao gồm limithashlimit và recent. Lựa chọn extension nào phụ thuộc chủ yếu vào cách bạn muốn hạn chế lưu lượng.

  • Extension limit:
    Quy tắc sẽ được khớp cho đến khi đạt giới hạn, sau đó các gói tin tiếp theo sẽ bị loại bỏ. Ví dụ, giới hạn 5/giây sẽ cho phép 5 gói tin khớp mỗi giây, sau đó quy tắc không còn khớp nữa. Điều này phù hợp với việc đặt giới hạn tốc độ toàn cục cho một dịch vụ. Bạn cũng có thể triển khai thêm dịch vụ như Fail2ban để chặn các nỗ lực kết nối liên tục.
  • Extension hashlimit:
    Linh hoạt hơn, cho phép bạn chỉ định các giá trị mà iptables sẽ hash để đánh giá sự khớp. Ví dụ, nó có thể xem địa chỉ nguồn, tham số nguồn (source port), địa chỉ đích và tham số đích (destination port) hoặc sự kết hợp của bốn giá trị đó. Nó có thể giới hạn theo số gói hoặc theo số byte nhận được, tạo điều kiện cho việc giới hạn tốc độ theo từng khách hàng hoặc từng dịch vụ.
  • Extension recent:
    Extension này tự động thêm địa chỉ IP của khách hàng vào danh sách hoặc kiểm tra danh sách có sẵn khi quy tắc khớp. Điều này cho phép bạn phân bổ logic giới hạn qua nhiều quy tắc cho các mô hình lưu lượng phức tạp. Nó có khả năng xác định số lần khớp và khoảng thời gian, cũng như đặt lại khoảng thời gian nếu lưu lượng tăng lên, buộc khách hàng dừng tất cả lưu lượng nếu bị giới hạn.

Quản Lý Theo Phong Cách Monolithic vs Dựa Trên Chuỗi (Chain-Based)

Tất cả các rule tường lửa của iptables và nftables cơ bản đều dựa trên việc mở rộng các chuỗi tích hợp sẵn. Ban đầu, điều này thường có nghĩa là thay đổi rule mặc định của các chuỗi hiện có và thêm các quy tắc. Đối với các tường lửa phức tạp, thường là ý tưởng hay khi mở rộng khung quản lý bằng cách tạo ra các chuỗi bổ sung.

Các chuỗi do người dùng tạo ra được gọi là chuỗi phụ (user-created chains) và gắn liền với chuỗi “gọi” mà chúng phát sinh ra. Các chuỗi này không có rule mặc định, vì vậy nếu một gói tin không được xử lý hết trong chuỗi do người dùng tạo ra, nó sẽ quay lại chuỗi gọi ban đầu và tiếp tục được đánh giá. Với nhận định đó, các chuỗi do người dùng tạo chủ yếu hữu ích cho mục đích tổ chức, giúp cho việc thiết lập các điều kiện khớp trở nên dễ quản lý hơn và cải thiện tính rõ ràng bằng cách phân tách các điều kiện khớp.

Nếu bạn nhận thấy mình phải lặp đi lặp lại một số tiêu chí khớp nhất định cho một số lượng lớn các quy tắc, có thể đáng để tạo một quy tắc “nhảy” (jump rule) với tiêu chí khớp chung sang một chuỗi mới. Bên trong chuỗi mới, bạn có thể thêm tập hợp các quy tắc đó mà không cần lặp lại tiêu chí khớp đã được chia sẻ.

Quyết định gộp tất cả các quy tắc vào một trong các chuỗi tích hợp sẵn hay tạo ra và sử dụng các chuỗi bổ sung phụ thuộc vào độ phức tạp của tập hợp quy tắc của bạn.

Kết Luận

Hiện nay, bạn đã có cái nhìn rõ hơn về những quyết định cần thực hiện khi thiết kế các rule tường lửa cho máy chủ của mình. Thông thường, thời gian đầu tư cho việc cấu hình tường lửa chủ yếu tập trung vào giai đoạn khởi tạo. Dù mất thời gian và cần thử nghiệm để có được một rule phù hợp nhất với nhu cầu của bạn, nhưng quá trình đó sẽ mang lại sự kiểm soát tốt hơn về an ninh cho máy chủ.

Nếu bạn muốn tìm hiểu thêm về tường lửa và đặc biệt là iptables, hãy tham khảo các bài viết sau:

Các hướng dẫn dưới đây sẽ giúp bạn triển khai rule của mình. Hãy chọn hướng dẫn phù hợp với tường lửa mà bạn đang sử dụng để bắt đầu:

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *