Ngày đăng: October 13, 2023
Tường lửa như iptables
được thiết kế để thực thi các chính sách bằng cách diễn giải các quy tắc do quản trị viên đặt ra. Tuy nhiên, với tư cách là quản trị viên, bạn cần biết loại quy tắc nào có ý nghĩa đối với cơ sở 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 để thiết lập và chạy, thì trong hướng dẫn này, chúng tôi sẽ thảo luận về một số quyết định 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 hoạt động của tường lửa, mức độ khóa máy chủ của bạn và cách nó phản ứng với các điều kiện khác nhau xảy ra. Chúng tôi sẽ sử dụng iptables
làm ví dụ cụ thể, nhưng hầu hết các khái niệm sẽ được áp dụng rộng rãi.
Khi xây dựng tường lửa, một trong những quyết định quan trọng nhất cần đưa ra là chính sách mặc định. Nó xác định điều gì sẽ xảy ra 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ể ACCEPT
bất kỳ lưu lượng truy cập nào chưa phù hợp với các quy tắc trước đó hoặc DROP
lưu lượng truy cập đó.
Chính sách mặc định ACCEPT
có nghĩa là mọi lưu lượng truy cập chưa được so sánh đều được phép vào máy chủ. Điều này thường không được khuyến khích vì nó có nghĩa là bạn sẽ phải làm việc ngược lại, chặn tất cả lưu lượng truy cập không mong muốn. Các phương pháp tiếp cận kiểu danh sách chặn rất khó quản lý, vì bạn cần dự đoán và chặn mọi loại lưu lượng truy cập không mong muốn. Nó có thể dẫn đến việc phải đau đầu về bảo trì và thường dễ mắc lỗi, cấu hình sai và các lỗ hổng không lường trước được trong chính sách đã thiết lập.
Giải pháp thay thế là chính sách mặc định DROP
. Có nghĩa là mọi lưu lượng truy cập không khớp với quy tắc rõ ràng sẽ không được phép. Mỗi và mọi dịch vụ đều phải được cho phép rõ ràng, giống như một lượng cấu hình ban đầu đáng kể. Tuy nhiên, việc đó cũng có nghĩa là chính sách của bạn có xu hướng 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 truy cập trên máy chủ của mình. Ngoài ra, gần như tất cả các chính sách được cấu hình sẵn sẽ tuân theo phương pháp này, nghĩa là bạn có thể xây dựng dựa trên các giá trị mặc định hiện có.
Việc lựa chọn chính sách drop mặc định sẽ dẫn đến một quyết định tinh tế khác. Với iptables
và các tường lửa tương tự, chính sách mặc định có thể được đặt bằng cách sử dụng chức năng chính sách built-in của tường lửa, hoặc được triển khai bằng cách thêm quy tắc catch-all drop vào cuối danh sách quy tắc.
Sự khác biệt giữa hai phương pháp này phụ thuộc vào điều sẽ xảy ra nếu các quy tắc tường lửa bị xóa.
Nếu chức năng chính sách built-in trong tường lửa của bạn được đặt thành DROP
và các quy tắc tường lửa của bạn luôn bị xóa (reset), hoặc nếu một số quy tắc phù hợp nhất định bị xóa, các dịch vụ của bạn sẽ ngay lập tức không thể truy cập được từ xa. Đây là một ý tưởng hay khi đặt chính sách cho các dịch vụ không quan trọng để máy chủ của bạn không gặp phải lưu lượng truy cập độ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 được cung cấp cho khách hàng cho đến khi bạn thiết lập lại các quy tắc cho phép. Bạn thậm chí có thể tự khóa mình khỏi máy chủ nếu bạn không có quyền truy cập từ xa cục bộ hoặc dựa trên web để thay thế.
Cách thay thế cho việc đặt chính sách drop bằng chức năng chính sách built-in là đặt chính sách mặc định của tường lửa thành ACCEPT
và sau đó triển khai chính sách DROP
bằng các quy tắc thông thường. Bạn có thể thêm quy tắc tường lửa thông thường vào cuối chuỗi của mình để khớp và từ chối tất cả lưu lượng truy cập chưa khớp còn lại.
Trong trường hợp này, nếu các quy tắc tường lửa của bạn bị xóa, các dịch vụ của bạn sẽ có thể truy cập được nhưng không được bảo vệ. Tùy thuộc vào các tùy chọn của bạn để truy cập cục bộ hoặc thay thế, đây có thể là một điều cần thiết để đảm bảo rằng bạn có thể nhập lại máy chủ của mình nếu các quy tắc bị xóa. Nếu bạn quyết định sử dụng tùy chọn này, hãy đảm bảo rằng quy tắc catch-all luôn là quy tắc cuối cùng trong bộ quy tắc của bạn.
Có một số cách khác nhau để ngăn chặn packet đến đích dự kiến. Sự lựa chọn giữa những điều này có tác động đến cách khách hàng cảm nhận nỗ lực kết nối của mình và tốc độ mà họ có thể xác định rằng yêu cầu của họ sẽ không được phục vụ.
Cách đầu tiên mà các packet có thể bị từ chối là DROP
. Việc drop có thể được sử dụng làm chính sách mặc định hoặc làm mục tiêu cho quy tắc so khớp (match). Khi một packet bị drop, iptables
sẽ vứt nó đi. Nó không gửi phản hồi lại cho máy khách đang cố gắng kết nối và không đưa ra bất kỳ dấu hiệu nào cho thấy nó đã nhận được các gói được đề cập. Điều này có nghĩa là khách hàng (hợp pháp hay không) sẽ không nhận được bất kỳ xác nhận nào về việc nhận packet của họ.
Đối với các nỗ lực kết nối TCP (chẳng hạn như các kết nối được thực hiện bởi trình duyệt web), kết nối sẽ bị đình trệ cho đến khi đạt đến giới hạn thời gian chờ. Việc thiếu phản hồi cho máy khách UDP thậm chí còn mơ hồ hơn. Trong thực tế, việc không nhận lại gói UDP thường là dấu hiệu cho thấy gói đó đã được chấp nhận. Nếu máy khách UDP quan tâm đến việc nhận các packet của nó, nó sẽ phải gửi lại chúng để xác định xem chúng có được chấp nhận, bị mất trong quá trình vận chuyển hay bị rớt hay không. Điều này có thể làm tăng lượng thời gian mà tác nhân độc hại sẽ phải bỏ ra để lấy thông tin về trạng thái cổng máy chủ của bạn, nhưng nó cũng có thể gây ra sự cố với lưu lượng truy cập hợp pháp.
Một cách khác để giảm lưu lượng truy cập là từ chối rõ ràng các packet mà bạn không cho phép. ICMP (hay Internet Control Message Protocol) là một siêu giao thức được sử dụng trên internet để gửi thông báo trạng thái, chẩn đoán và lỗi giữa các máy chủ dưới dạng kênh out-of-band, không dựa vào các giao thức liên lạc thông thường như TCP hoặc UDP. Khi bạn sử dụng mục tiêu REJECT
thay vì mục tiêu DROP
, lưu lượng truy cập sẽ bị từ chối và gói ICMP được trả lại cho người gửi để thông báo rằng lưu lượng truy cập của họ đã được nhận nhưng sẽ không được chấp nhận. Một thông báo trạng thái cũng có thể được đưa vào để cung cấp lý do.
Điều này có một số hậu quả. Giả sử rằng lưu lượng ICMP được phép tiếp cận máy khách, họ sẽ ngay lập tức được thông báo rằng lưu lượng truy cập của họ bị chặn. Đối với khách hàng hợp pháp, đ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 truy cập đúng cổng. Đối với những người dùng có ý đồ xấu, điều này có nghĩa là họ có thể hoàn tất quá trình quét và vạch ra các cổng mở, đóng và lọc trong khoảng thời gian ngắn hơn.
Có rất nhiều điều cần cân nhắc khi quyết định giảm hay từ chối lưu lượng truy cập. Một điều quan trọng cần cân nhắc là hầu hết lưu lượng truy cập độc hại thực sự sẽ được thực hiện bởi các tập lệnh tự động. Vì các tập lệnh này thường không được giám sát nên việc giảm lưu lượng truy cập bất hợp pháp sẽ không làm chúng nản lòng một cách có ý nghĩa và sẽ có tác động tiêu cực đối với người dùng hợp pháp. Bạn có thể tìm thêm thông tin về chủ đề này trên trang web của Peter Benie.
Bảng bên dưới cho thấy cách máy chủ được bảo vệ bởi tường lửa sẽ phản ứng với các yêu cầu khác nhau tùy thuộc vào chính sách được áp dụng cho cổng đích.
Loại Client Packet | Lệnh NMap | Chính sách cổng | Phản hồi | Trạng thái Inferred Port |
---|---|---|---|---|
TCP | nmap [-sT | -sS] -Pn <server> | Accept | TCP SYN/ACK |
TCP | nmap [-sT | -sS] -Pn <server> | Drop | (none) |
TCP | nmap [-sT | -sS] -Pn <server> | Reject | TCP RESET |
UDP | nmap -sU -Pn <server> | Accept | (none) | Open or Filtered |
UDP | nmap -sU -Pn <server> | Drop | (none) | Open or Filtered |
UDP | nmap -sU -Pn <server> | Reject | ICMP Port Unreachable | Closed |
Cột đầu tiên cho biết loại packet được gửi bởi máy khách (client). Cột thứ hai chứa các lệnh nmap
có thể được sử dụng để kiểm tra từng kịch bản. Cột thứ ba cho biết chính sách cổng đang được áp dụng cho cổng. Cột thứ tư là phản hồi mà máy chủ sẽ gửi lại và cột thứ năm là những gì khách hàng có thể suy ra về cổng dựa trên phản hồi mà nó đã nhận được.
Giống như việc quyết định loại bỏ hay từ chối lưu lượng truy cập bị từ chối, bạn có tùy chọn chấp nhận hoặc từ chối các gói ICMP dành cho máy chủ của mình.
ICMP là một giao thức được sử dụng cho nhiều thứ. Như đã đề cập, nó thường được gửi lại để cung cấp thông tin trạng thái về 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 nó là gửi và phản hồi các lệnh ping mạng để xác minh khả năng kết nối với các máy chủ từ xa. Có nhiều cách sử dụng khác của ICMP chưa được biết đến rộng rãi nhưng vẫn hữu ích.
Các gói ICMP được sắp xếp theo “type” và sau đó theo “code”. Type xác định ý nghĩa chung của tin nhắn. Ví dụ: Type 3 có nghĩa là đích không thể truy cập được. Code thường được sử dụng để cung cấp thêm thông tin về một type. Ví dụ: ICMP Type 3 Code 3 có nghĩa là cổng đích không khả dụng, trong khi ICMP Type 3 Code 0 có nghĩa là không thể truy cập được mạng đích.
Một số ICMP type không được dùng nữa nên chúng có thể bị chặn vô điều kiện. Trong số này có ICMP source quench (type 4 code 0) và máy chủ thay thế (type 6). Các type 1, 2, 7 và type 15 trở lên đều không được dùng nữa, được dành riêng để sử dụng trong tương lai hoặc thử nghiệm. Nhiều mẫu tường lửa ngược dòng sẽ xử lý việc này theo mặc định.
Một số loại ICMP hữu ích trong một số cấu hình mạng nhất định nhưng sẽ bị chặn ở các cấu hình mạng khác.
Ví dụ: Tin nhắn chuyển hướng ICMP (ICMP redirect messages) (type 5) có thể hữu ích để làm sáng tỏ thiết kế mạng xấu. Chuyển hướng ICMP được gửi khi có sẵn tuyến đường tốt hơn cho khách hàng. Vì vậy, nếu bộ định tuyến nhận được một packet sẽ phải được định tuyến đến một máy chủ khác trên cùng mạng, nó sẽ gửi một thông báo chuyển hướng ICMP để yêu cầu khách hàng gửi các packet qua máy chủ khác trong tương lai.
Điều này hữu ích nếu bạn tin cậy mạng cục bộ của mình và muốn phát hiện sự thiếu hiệu quả trong bảng định tuyến trong quá trình cấu hình ban đầu. Trên mạng không đáng tin cậy, người dùng độc hại có thể gửi chuyển hướng ICMP để thao túng bảng định tuyến trên máy chủ.
Các loại ICMP khác hữu ích trong một số mạng và có khả năng gây hại ở các mạng khác là các packet quảng cáo bộ định tuyến ICMP (type 9) và các packet chào mời bộ định tuyến (type 10). Các packet quảng cáo và chào mời bộ định tuyến được sử dụng như một phần của IRDP (ICMP Internet Router Discovery Protocol), một hệ thống cho phép các máy chủ, khi khởi động hoặc tham gia mạng, tự động khám phá các bộ định tuyến có sẵn.
Trong hầu hết các trường hợp, máy chủ nên cấu hình các tuyến tĩnh cho các cổng mà nó sẽ sử dụng. Các packet này phải được chấp nhận trong các tình huống tương tự như các packet chuyển hướng ICMP. Trên thực tế, vì máy chủ sẽ không biết tuyến đường ưu tiên cho lưu lượng truy cập của bất kỳ tuyến đường nào được phát hiện nên các tin nhắn chuyển hướng thường được cần ngay sau khi khám phá. Nếu bạn không chạy dịch vụ gửi các packet yêu cầu bộ định tuyến hoặc sửa đổi tuyến đường của mình dựa trên các packet quảng cáo (như rdisc
), bạn có thể chặn các gói này một cách an toàn.
Dưới đây là các loại ICMP thường an toàn để cho phép, nhưng bạn có thể tắt chúng nếu muốn hết sức cẩn thận.
Các type bên dưới thường có thể được cho phép mà không cần quy tắc rõ ràng bằng cách định cấu hình tường lửa của bạn để cho phép phản hồi các yêu cầu mà nó đã thực hiện (bằng cách sử dụng mô-đun conntrack
để cho phép lưu lượng truy cập ESTABLISHED
và RELATED
).
Việc chặn tất cả lưu lượng ICMP đến vẫn được một số chuyên gia bảo mật khuyến nghị, tuy nhiên hiện nay nhiều người khuyến khích các chính sách chấp nhận ICMP thông minh. Hai chủ đề Stackexchange này có nhiều thông tin hơn.
Đối với một số dịch vụ và mẫu lưu lượng truy cập, bạn có thể chỉ muốn cho phép truy cập miễn là máy khách không lạm dụng quyền truy cập đó. Hai cách hạn chế sử dụng tài nguyên là giới hạn kết nối và giới hạn tốc độ.
Giới hạn kết nối có thể được triển khai bằng cách sử dụng các tiện ích mở rộng như connlimit
để kiểm tra xem máy khách đã mở bao nhiêu kết nối đang hoạt động. Điều này có thể được sử dụng để hạn chế số lượng kết nối được phép cùng một lúc. Nếu bạn quyết định áp đặt giới hạn kết nối, bạn sẽ phải đưa ra một số quyết định:
Các kết nối có thể bị giới hạn trên cơ sở từng máy chủ hoặc có thể đặt giới hạn cho một phân đoạn mạng bằng cách cung cấp tiền tố mạng (chẳng hạn như dải địa chỉ IP cho toàn bộ tổ chức). Bạn cũng có thể đặt số lượng kết nối tối đa toàn cầu cho một dịch vụ hoặc toàn bộ máy. Hãy nhớ rằng bạn có thể kết hợp các chính sách này để tạo ra các chính sách phức tạp hơn nhằm kiểm soát số kết nối của mình.
Giới hạn tốc độ cho phép bạn xây dựng các quy tắc chi phối tốc độ hoặc tần suất lưu lượng truy cập sẽ được máy chủ của bạn chấp nhận. Có một số tiện ích mở rộng tường lửa khác nhau có thể được sử dụng để giới hạn tốc độ bao gồm limit
, hashlimit
, và recent
. Việc lựa chọn tiện ích mở rộng mà bạn sử dụng sẽ phụ thuộc phần lớn vào cách bạn muốn hạn chế lưu lượng truy cập.
Phần mở rộng limit
sẽ khiến quy tắc được đề cập phải khớp cho đến khi đạt đến giới hạn, sau đó các gói tiếp theo sẽ bị loại bỏ. Giới hạn như 5/sec
sẽ cho phép 5 gói khớp mỗi giây, sau đó quy tắc không còn khớp nữa. Điều này tốt cho việc đặt giới hạn tốc độ toàn cầu cho một dịch vụ. Bạn cũng có thể triển khai một dịch vụ bổ sung như Fail2ban để chặn các nỗ lực kết nối lặp lại.
Phần mở rộng hashlimit
linh hoạt hơn, cho phép bạn chỉ định một số giá trị mà iptables
sẽ hash để đánh giá kết quả khớp. Chẳng hạn, nó có thể xem địa chỉ nguồn, cổng nguồn, địa chỉ đích, cổng đích hoặc kết hợp bốn giá trị đó để đánh giá từng mục nhập. Nó có thể giới hạn theo gói hoặc theo byte nhận được. Điều này cung cấp giới hạn tốc độ linh hoạt cho mỗi khách hàng hoặc mỗi dịch vụ.
Phần mở rộng recent
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 hiện có khi quy tắc phù hợp. Điều này cho phép bạn trải rộng logic giới hạn của mình qua một số quy tắc khác nhau cho các mẫu phức tạp. Nó có khả năng chỉ định số lần truy cập và phạm vi thời gian giống như các bộ giới hạn khác, nhưng cũng có thể đặt lại phạm vi thời gian nếu thấy lưu lượng truy cập bổ sung, buộc khách hàng phải dừng tất cả lưu lượng truy cập nếu chúng bị giới hạn.
Tất cả chính sách tường lửa của iptables
và nftables
về cơ bản đều bắt nguồn từ việc mở rộng các chuỗi tích hợp. Đầu tiên, điều này thường có nghĩa là thay đổi chính sách mặc định cho 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 hơn, việc mở rộng management framework bằng cách tạo các chuỗi bổ sung thường là một ý tưởng hay.
Các chuỗi do người dùng tạo được gọi là thứ hai và vốn được gắn với “calling chain” mà chúng bắt nguồn từ đó. Chuỗi do người dùng tạo không có chính sách mặc định, vì vậy nếu một packet rơi vào chuỗi do người dùng tạo, nó sẽ quay trở lại calling chain và tiếp tục đánh giá. Với ý nghĩ đó, chuỗi do người dùng tạo chủ yếu hữu ích cho mục đích tổ chức, giúp các điều kiện khớp quy tắc dễ bảo trì hơn và cải thiện khả năng đọc bằng cách phân tách các điều kiện khớp.
Nếu bạn thấy mình lặp lại các tiêu chí so khớp nhất định cho một số lượng đáng kể các quy tắc, thì có thể đáng để tạo quy tắc jump với tiêu chí so khớp được chia sẻ cho một chuỗi mới. Bên trong chuỗi mới, bạn có thể thêm bộ quy tắc đó và loại bỏ các tiêu chí so khớp dư thừa.
Quyết định về việc có nên gộp tất cả các quy tắc của bạn vào một trong các chuỗi tích hợp hay tạo và sử dụng các chuỗi bổ sung sẽ tùy thuộc vào mức độ phức tạp của bộ quy tắc của bạn.
Bây giờ bạn sẽ hiểu rõ hơn về các quyết định mà bạn sẽ phải đưa ra khi thiết kế chính sách tường lửa cho máy chủ của mình. Thông thường, thời gian đầu tư liên quan đến tường lửa sẽ nghiêng nhiều về thiết lập ban đầu. Mặc dù có thể mất một chút thời gian và thử nghiệm để đưa ra chính sách phục vụ tốt nhất cho nhu cầu của bạn, nhưng làm như vậy sẽ giúp bạn có nhiều quyền kiểm soát hơn đối với tính bảo mật của máy chủ.
Các hướng dẫn sau đây có thể giúp bạn triển khai chính sách của mình. Chọn hướng dẫn phù hợp với tường lửa của bạn để bắt đầu: