Cách chọn chính sách firewall hiệu quả để bảo vệ server của bạn
Sử dụng firewall cũng giống như việc đưa ra các quyết định policy thông minh cũng giống như việc học cú pháp. Tường lửa nhưiptables
có khả năng thực thi các policy bằng cách diễn giải các luật do administrator đặt ra. Tuy nhiên, với quyền là administrator , bạn cần biết những loại luật nào có ý nghĩa đối với cơ sở hạ tầng của bạn. Trong khi các hướng dẫn khác tập trung vào các lệnh cần thiết để cài đặt và chạy, trong hướng dẫn này, ta sẽ thảo luận về một số quyết định bạn sẽ phải thực hiện khi triển khai firewall . Những lựa chọn này sẽ ảnh hưởng đến cách firewall của bạn hoạt động, mức độ bị khóa của server và cách nó sẽ phản ứng với các điều kiện khác nhau có thể xảy ra theo thời gian. Ta sẽ sử dụng iptables
làm ví dụ để thảo luận về các chi tiết cụ thể, nhưng hầu hết các quyết định thực tế sẽ có liên quan dù công cụ được sử dụng.
Quyết định Chính sách Mặc định
Khi xây dựng firewall , một trong những quyết định cơ bản mà bạn phải thực hiện là policy mặc định. Điều này xác định điều gì sẽ xảy ra khi lưu lượng truy cập không phù hợp với bất kỳ luật nào khác. Theo mặc định, firewall có thể chấp nhận bất kỳ lưu lượng nào chưa được so sánh với các luật trước đó hoặc từ chối lưu lượng đó.
Thả mặc định so với Chấp nhận mặc định
Chính sách mặc định “chấp nhận” nghĩa là bất kỳ lưu lượng truy cập nào chưa khớp đều được phép vào server . Điều này thường không được khuyên vì nó nghĩa là , một cách hiệu quả, bạn sẽ duy trì một blacklist . Danh sách đen rất khó quản lý vì bạn phải lường trước và chặn mọi loại lưu lượng truy cập không mong muốn một cách rõ ràng. Điều này có thể dẫn đến đau đầu về bảo trì và thường dễ mắc sai lầm, cấu hình sai và các lỗ hổng không lường trước được trong policy đã cài đặt .
Lựa chọn thay thế là một policy mặc định là "thả". Điều này nghĩa là mọi lưu lượng truy cập không phù hợp với một luật rõ ràng sẽ không được phép. Đây là một ACL danh sách trắng. Mỗi và mọi dịch vụ phải được cho phép một cách rõ ràng, thoạt đầu có vẻ giống như một lượng nghiên cứu và công việc đáng kể. Tuy nhiên, điều này nghĩa là policy 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 server của bạn.
Về cơ bản, sự lựa chọn dựa trên xu hướng hướng tới bảo mật theo mặc định hoặc các dịch vụ có thể truy cập ngay lập tức. Mặc dù có thể hấp dẫn việc triển khai firewall nghiêng về tính khả dụng của dịch vụ, nhưng luôn là một ý tưởng tốt hơn để chặn lưu lượng truy cập trừ khi được phép rõ ràng.
Chính sách thả mặc định so với Luật thả cuối cùng
Việc lựa chọn policy giảm mặc định ở trên dẫn đến một quyết định tinh vi khác. Với iptables
và các firewall tương tự khác, policy mặc định có thể được đặt bằng cách sử dụng chức năng policy tích hợp của firewall hoặc được triển khai bằng cách thêm luật thả tất cả vào cuối danh sách các luật .
Sự khác biệt giữa hai phương pháp này nằm ở chỗ điều gì sẽ xảy ra nếu các luật firewall được xóa.
Nếu chức năng policy tích hợp của firewall của bạn được đặt thành “drop” và các luật firewall của bạn luôn bị xóa (đặt lại) hoặc nếu các luật phù hợp nhất định bị xóa, dịch vụ của bạn sẽ ngay lập tức không thể truy cập được từ xa.Đây thường là một ý tưởng hay khi đặt policy cho các dịch vụ không quan trọng để server của bạn không bị tiếp xúc với lưu lượng độc hại nếu các luật 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ó sẵn cho khách hàng của bạn cho đến khi bạn cài đặt lại các luật cho phép. Bạn thậm chí có thể tự khóa mình khỏi server nếu bạn không có quyền truy cập local hoặc ngoài băng tần để khắc phục sự cố ( server DigitalOcean có thể truy cập dù cài đặt mạng bằng cách sử dụng nút “Quyền truy cập console ” nằm trong “Quyền truy cập” của trang Server trong console ). Nếu việc firewall của bạn cố ý, bạn có thể tránh điều này bằng cách chỉ cần chuyển policy mặc định thành “chấp nhận” ngay trước khi đặt lại các luật .
Giải pháp thay thế cho việc đặt policy thả bằng cách sử dụng chức năng policy tích hợp là đặt policy mặc định của firewall thành “chấp nhận” và sau đó triển khai policy “thả” với các luật thông thường. Bạn có thể thêm luật firewall thông thường vào cuối chuỗi phù hợp và từ chối tất cả lưu lượng chưa khớp còn lại.
Trong trường hợp này, nếu các luật firewall của bạn bị xóa, các dịch vụ của bạn 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 cho quyền truy cập local hoặc thay thế, đây có thể là điều cần thiết đảm bảo rằng bạn có thể vào lại server của bạn nếu các luật được xóa. Nếu bạn quyết định sử dụng tùy chọn này, bạn phải đảm bảo luật nhận tất cả luôn là luật cuối cùng trong bộ luật của bạn.
Giảm so với từ chối lưu lượng truy cập
Có một số cách khác nhau để từ chối một đoạn gói tin đến đích đã định của 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 nhận thấy nỗ lực kết nối của nó và họ có thể xác định rằng yêu cầu của họ sẽ không được phục vụ nhanh như thế nào.
Cách đầu tiên mà các gói tin có thể bị từ chối là "drop". Drop được dùng làm policy mặc định hoặc làm mục tiêu cho các luật đối sánh. Khi một gói tin bị loại bỏ, iptables
về cơ bản chỉ ném nó đi. Nó không gửi phản hồi lại cho khách hàng đ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ó đã từng nhận được các gói tin được đề cập. Điều này nghĩa là các khách hàng ( hợp lệ hay không) sẽ không nhận được bất kỳ xác nhận nào về việc nhận các gói tin của họ.
Đối với các lần thử kết nối TCP, kết nối sẽ bị dừng cho đến khi đạt đến giới hạn thời gian chờ. Vì UDP là một giao thức không có kết nối, việc thiếu phản hồi cho các client thậm chí còn mơ hồ hơn. Trên thực tế, việc không nhận lại gói trong trường hợp này thường là một dấu hiệu cho thấy gói đã được chấp nhận. Nếu ứng dụng client UDP quan tâm đến việc nhận các gói tin của nó, nó sẽ phải gửi lại chúng để cố gắng xác định xem chúng đã được chấp nhận, bị thất lạc khi vận chuyển hay bị rơi. Điều này có thể làm tăng thời gian mà một tác nhân độc hại sẽ phải bỏ ra để có được thông tin thích hợp về trạng thái của các cổng server 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 lệ .
Một thay thế để giảm lưu lượng truy cập là từ chối một cách rõ ràng các gói mà bạn không cho phép. ICMP, hoặc Internet Control Message Protocol, là một siêu giao thức được sử dụng trên toàn internet để gửi thông báo trạng thái, chẩn đoán và lỗi giữa các server dưới dạng kênh ngoài băng tần không dựa vào các giao thức truyền thông thông thường như TCP hoặc UDP. Khi bạn sử dụng mục tiêu “từ chối”, lưu lượng sẽ bị từ chối và một gói ICMP được trả lại cho người gửi để thông báo cho họ rằng lưu lượng của họ đã được nhận nhưng sẽ không được chấp nhận. Thông báo trạng thái có thể gợi ý về 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 chuyển đến client , 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 lệ , điều này nghĩa là họ có thể liên hệ với administrator hoặc kiểm tra các tùy chọn kết nối của họ đảm bảo rằng họ đang tiếp cận đúng cổng. Đối với những user độc hại, điều này nghĩa là họ có thể hoàn thành quá trình quét và vạch ra các cổng mở, đóng và lọc trong một khoảng thời gian ngắn hơn.
Có rất nhiều điều cần xem xét khi quyết định bỏ hoặc từ chối lưu lượng truy cập. Một lưu ý quan trọng là hầu hết lưu lượng truy cập độc hại sẽ thực sự được tạo ra bởi các tập lệnh tự động. Vì các tập lệnh thường không nhạy cảm về thời gian, việc giảm lưu lượng truy cập bất hợp lệ sẽ không có tác dụng như mong muốn trong khi nó sẽ có tác động tiêu cực đối với user hợp lệ . Nhiều hơn về chủ đề này có thể được tìm thấy ở đây .
Bảng phản hồi Thả so với Từ chối
Bảng dưới đây cho thấy cách một server được bảo vệ bởi firewall sẽ phản ứng với các yêu cầu khác nhau tùy thuộc vào policy đang được áp dụng cho cổng đích.
Loại gói khách hàng | Lệnh NMap | Chính sách cổng | Phản ứng | Trạng thái cổng suy ra |
---|---|---|---|---|
TCP | nmap [-sT | -sS] -Pn < server > | Chấp nhận | TCP SYN / ACK | Mở |
TCP | nmap [-sT | -sS] -Pn < server > | Rơi vãi | (không ai) | Đã lọc |
TCP | nmap [-sT | -sS] -Pn < server > | Từ chối | ĐẶT LẠI TCP | Đóng cửa |
UDP | nmap -sU -Pn < server > | Chấp nhận | (không ai) | Mở hoặc lọc |
UDP | nmap -sU -Pn < server > | Rơi vãi | (không ai) | Mở hoặc lọc |
UDP | nmap -sU -Pn < server > | Từ chối | Cổng ICMP không thể tiếp cận | Đóng cửa |
Cột đầu tiên cho biết loại gói được gửi bởi client . Trong cột thứ hai, ta đã bao gồm các lệnh nmap
được dùng để kiểm tra từng tình huống. Cột thứ ba cho biết policy cổng đang được áp dụng cho cổng. Cột thứ tư là phản hồi mà server sẽ gửi lại và cột thứ năm là những gì khách hàng có thể suy luận về cổng dựa trên phản hồi mà nó đã nhận được.
Chính sách ICMP
Tương tự như câu hỏi về việc có nên giảm hoặc từ chối lưu lượng bị từ chối, có nhiều ý kiến khác nhau về việc có nên chấp nhận các gói ICMP dành cho server của bạn hay không.
ICMP là một giao thức được sử dụng cho nhiều thứ. Nó thường được gửi lại, như ta đã thấy ở trên, để 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. Có lẽ chức năng được công nhận nhất của nó để gửi và phản hồi các ping mạng để xác minh khả năng kết nối với các server từ xa. Có nhiều cách sử dụng khác cho ICMP tuy nhiên không được nhiều người biết đến, nhưng vẫn hữu ích.
Các gói ICMP được sắp xếp theo “loại” và sau đó xa hơn theo “mã”. Một kiểu chỉ định ý nghĩa chung của thông báo.Ví dụ: Loại 3 nghĩa là không thể truy cập được đích. Mã thường được sử dụng để cung cấp thêm thông tin về một loại. Ví dụ: ICMP Loại 3 Mã 3 nghĩa là cổng đích không khả dụng, trong khi ICMP Loại 3 Mã 0 nghĩa là không thể truy cập mạng đích.
Các loại luôn có thể bị chặn
Một số loại ICMP không được dùng nữa, vì vậy chúng có thể sẽ bị chặn vô điều kiện. Trong số này có nguồn ICMP dập tắt (loại 4 mã 0) và server thay thế (loại 6). Loại 1, 2, 7 và loại 15 trở lên đều không được dùng nữa, được dành để sử dụng trong tương lai hoặc thử nghiệm.
Các loại để chặn tùy thuộc vào cấu hình mạng
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 ở những loại khác.
Ví dụ, thông báo chuyển hướng ICMP (loại 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ó một tuyến tốt hơn trực tiếp cho khách hàng. Vì vậy, nếu một bộ định tuyến nhận được một gói tin sẽ phải được chuyển đến một server khác trên cùng một mạng, nó sẽ gửi một thông điệp chuyển hướng ICMP để cho client gửi các gói đó qua server khác trong tương lai.
Điều này rất hữu ích nếu bạn tin tưởng vào mạng local của bạn và muốn phát hiện sự thiếu hiệu quả trong bảng định tuyến của bạn trong quá trình cấu hình ban đầu (sửa các tuyến đường của bạn là một giải pháp lâu dài tốt hơn). Tuy nhiên, trên một mạng không tin cậy , user độc hại có thể gửi các chuyển hướng ICMP để thao túng bảng định tuyến trên server .
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 ở một số mạng khác là gói tin quảng cáo bộ định tuyến ICMP (loại 9) và gói tin chào mời bộ định tuyến (loại 10). Gói 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 (Giao thức khám phá bộ định tuyến Internet ICMP), một hệ thống cho phép các server , khi khởi động hoặc tham gia mạng, phát hiện động các bộ định tuyến khả dụng.
Trong hầu hết các trường hợp, tốt hơn là một server lưu trữ có các tuyến tĩnh được cấu hình cho các cổng mà nó sẽ sử dụng. Các gói này nên được chấp nhận trong các tình huống tương tự như các gói chuyển hướng ICMP. Trên thực tế, vì server sẽ không biết tuyến đường ưa thích cho lưu lượng truy cập của bất kỳ tuyến đường đã phát hiện nào, nên các thông báo chuyển hướng thường cần thiết ngay sau khi phát hiện. Nếu bạn không chạy một dịch vụ gửi các gói chào mời bộ định tuyến hoặc sửa đổi các tuyến của bạn dựa trên các gói 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.
Các loại Thường An toàn để Cho phép
Dưới đây là các loại ICMP thường an toàn để cho phép, nhưng bạn có thể cần tắt chúng nếu muốn cẩn thận hơn.
- Loại 8 - Yêu cầu tiếng vang: Đây là các yêu cầu ping trực tiếp đến server của bạn. Thông thường sẽ an toàn khi cho phép các gói này (từ chối các gói này không ẩn server của bạn. Có nhiều cách khác để user tìm xem server của bạn có hoạt động hay không), nhưng bạn có thể chặn chúng hoặc giới hạn địa chỉ nguồn mà bạn phản hồi nếu bạn muốn.
- Loại 13 - Yêu cầu dấu thời gian: Các gói tin này có thể được khách hàng sử dụng để thu thập thông tin về độ trễ.Chúng được dùng trong một số kỹ thuật lấy dấu fingerprint hệ điều hành, vì vậy hãy chặn chúng nếu bạn muốn hoặc giới hạn phạm vi địa chỉ mà bạn phản hồi.
Các loại bên dưới thường có thể được cho phép mà không có luật rõ ràng bằng cách cấu hình firewall của bạn để cho phép phản hồi các yêu cầu mà nó đã đưa ra (bằng cách sử dụng module conntrack
để cho phép lưu lượng ESTABLISHED
và RELATED
).
- Loại 0 - Phản hồi tiếng vọng: Đây là những phản hồi đối với yêu cầu tiếng vọng (ping).
- Loại 3 - Không thể truy cập đích: Các gói không thể truy cập đích hợp lệ là phản hồi đối với các yêu cầu do server của bạn tạo ra cho biết rằng không thể gửi gói.
- Loại 11 - Vượt quá thời gian: Đây là lỗi chẩn đoán được trả về nếu một gói do server của bạn tạo ra bị chết trước khi đến đích vì vượt quá giá trị TTL của nó.
- Loại 12 - Sự cố tham số: Điều này nghĩa là một gói tin gửi đi từ server của bạn không đúng định dạng.
- Loại 14 - Phản hồi dấu thời gian: Đây là những phản hồi cho các truy vấn dấu thời gian do server của bạn tạo.
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 nhiều người hiện khuyến khích các policy chấp nhận ICMP thông minh. Các liên kết ở đây và ở đây có thêm thông tin.
Giới hạn kết nối và giới hạn tốc độ
Đối với một số dịch vụ và mẫu lưu lượng, bạn có thể cần cho phép truy cập với điều kiện là khách hàng không lạm dụng quyền truy cập đó. Hai cách hạn chế việc 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
Giới hạn kết nối có thể được thực hiện bằng cách sử dụng các phần mở rộng như connlimit
để kiểm tra số lượng kết nối đang hoạt động mà một ứng dụng client đã mở. Điều này được 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 về cách nó được áp dụng. Phân tích chung của các quyết định là:
- Giới hạn trên cơ sở mỗi địa chỉ, mỗi mạng hoặc global ?
- Đối sánh và hạn chế lưu lượng truy cập cho một dịch vụ cụ thể hoặc cho toàn bộ server ?
Các kết nối có thể bị giới hạn trên cơ sở từng server 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. Bạn cũng có thể đặt số lượng kết nối tối đa chung cho một dịch vụ hoặc toàn bộ máy. Lưu ý có thể kết hợp và kết hợp những thứ này để tạo ra các policy phức tạp hơn để kiểm soát số kết nối của bạn.
Giới hạn tỷ lệ
Giới hạn tốc độ cho phép bạn xây dựng các luật chi phối tốc độ hoặc tần suất mà tại đó server của bạn sẽ chấp nhận lưu lượng truy cập. Có một số tiện ích mở rộng khác nhau được 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 bạn sử dụng sẽ phụ thuộc phần lớn vào cách bạn muốn giới hạn lưu lượng truy cập.
Phần mở rộng limit
sẽ làm cho luật được đề cập được khớp cho đến khi đạt đến giới hạn, sau đó các gói tiếp theo sẽ bị loại bỏ. Nếu bạn đặt giới hạn như “5 / giây” và luật sẽ cho phép 5 gói dữ liệu khớp mỗi giây, sau đó luật này không còn khớp nữa. Điều này rất tốt cho việc đặt giới hạn tỷ giá global cho một dịch vụ.
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ẽ băm để đánh giá kết quả khớp. Ví dụ: nó có thể xem xét địa chỉ nguồn, cổng nguồn, địa chỉ đích, cổng đích hoặc sự kết hợp tùy ý của bốn giá trị đó để băm từng mục nhập. Nó có thể giới hạn theo gói hoặc byte nhận được. Về cơ bản, điều này cung cấp giới hạn tỷ lệ linh hoạt cho mỗi khách hàng hoặc mỗi dịch vụ.
Tiện ích mở rộng recent
tự động thêm địa chỉ IP của ứng dụng client vào danh sách hoặc kiểm tra với danh sách hiện có khi luật khớp. Điều này cho phép bạn trải rộng logic giới hạn của bạn giữa một số luật 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 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 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.
Việc lựa chọn sử dụng trình mở rộng giới hạn tỷ lệ nào tùy thuộc vào policy chính xác mà bạn muốn thực thi.
Quản lý nguyên khối và dựa trên chuỗi
Tất cả policy firewall của iptables
đều bắt nguồn từ việc mở rộng chuỗi tích hợp. Đối với firewall đơn giản, điều này thường xảy ra dưới dạng thay đổi policy mặc định cho chuỗi và thêm luật . Đối với các firewall phức tạp hơn, bạn nên mở rộng khuôn khổ quản lý bằng cách tạo các chuỗi bổ sung.
Chuỗi do user tạo vốn được gắn với chuỗi gọi của họ. Chuỗi do user tạo không có policy mặc định, vì vậy nếu một gói tin lọt qua chuỗi do user tạo, nó sẽ quay trở lại chuỗi gọi và tiếp tục đánh giá. Với ý nghĩ đó, các chuỗi do user tạo chủ yếu hữu ích cho mục đích tổ chức, để làm cho các điều kiện khớp luật KHÔ hơn và cải thiện khả năng đọc bằng cách tách các điều kiện khớp.
Nếu bạn thấy mình đang lặp lại các tiêu chí đối sánh nhất định cho một số lượng lớn luật , thay vào đó, bạn nên tạo luật nhảy với tiêu chí đối sánh được chia sẻ cho một chuỗi mới. Bên trong chuỗi mới, bạn có thể thêm bộ luật đó với tiêu chí đối sánh được chia sẻ đã bị xóa.
Ngoài tổ chức đơn giản, điều này có thể có một số tác dụng phụ có lợi. Ví dụ: việc sử dụng thông minh các chuỗi cho các bộ luật rất giống nhau nghĩa là việc thêm các luật vào đúng vị trí có thể dễ dàng hơn và ít bị lỗi hơn. Việc hiển thị và hiểu các phần của policy mà bạn quan tâm cũng có thể dễ dàng hơn bằng cách giới hạn theo chuỗi.
Quyết định về việc có gộp tất cả các luật của bạn vào một trong các chuỗi tích hợp sẵn hay không hay tạo và sử dụng các chuỗi bổ sung phần lớn phụ thuộc vào mức độ phức tạp và dễ quản lý của bộ luật của bạn.
Kết luận
Bây giờ, bạn đã có một ý tưởng khá tốt về một số quyết định bạn sẽ phải thực hiện khi thiết kế các policy firewall cho server của bạn . Thông thường đầu tư thời gian liên quan đến firewall nghiêng nhiều về cài đặt ban đầu, khiến việc quản lý khá đơn giản. Mặc dù có thể mất một chút thời gian, suy nghĩ và thử nghiệm để đưa ra policy phục vụ tốt nhất nhu cầu của bạn, nhưng làm như vậy sẽ giúp bạn kiểm soát nhiều hơn tính bảo mật của server .
Nếu bạn muốn biết thêm về firewall và iptables
cụ thể, hãy xem các bài viết sau:
Các hướng dẫn sau có thể giúp bạn thực hiện các policy của bạn . Chọn hướng dẫn phù hợp với firewall của bạn để bắt đầu:
- Cách cài đặt firewall bằng Iptables trên Ubuntu 14.04
- Cách cài đặt firewall với UFW trên Ubuntu 14.04
- Cách cài đặt firewall bằng FirewallD trên CentOS 7
Các tin liên quan