Denyhosts vs fail2ban vs iptables- cách tốt nhất để ngăn chặn đăng nhập vũ phu?


62

Tôi đang thiết lập máy chủ LAMP và cần ngăn SSH / FTP / vv. nỗ lực đăng nhập brute-force từ thành công. Tôi đã thấy nhiều đề xuất cho cả denyhost và fail2ban, nhưng một vài so sánh giữa hai đề xuất này. Tôi cũng đọc rằng một quy tắc IPTables có thể điền vào cùng một chức năng.

Tại sao tôi chọn một trong những phương pháp này hơn một phương pháp khác? Làm thế nào để mọi người trên serverfault xử lý vấn đề này?

Câu trả lời:


53

IIRC, Denyhost sẽ chỉ xem dịch vụ SSH của bạn. Nếu bạn cần nó để bảo vệ các dịch vụ khác, Fail2ban chắc chắn là một lựa chọn tốt hơn. Có thể định cấu hình để xem gần như bất kỳ dịch vụ nào nếu bạn sẵn sàng điều chỉnh cấu hình của nó, nhưng điều đó không cần thiết vì các phiên bản mới hơn của Fail2ban bao gồm các quy tắc phù hợp với nhiều trình nền máy chủ phổ biến. Sử dụng fail2ban trong giới hạn tốc độ iptables đơn giản có lợi thế là chặn hoàn toàn kẻ tấn công trong một khoảng thời gian xác định, thay vì chỉ đơn giản là giảm tốc độ anh ta có thể tấn công máy chủ của bạn. Tôi đã sử dụng fail2ban với kết quả tuyệt vời trên một số máy chủ sản xuất và chưa bao giờ thấy một trong những máy chủ đó bị vi phạm bởi một cuộc tấn công vũ phu kể từ khi tôi bắt đầu sử dụng nó.


3
Lưu ý rằng Denyhost sẽ vô hiệu hóa chặn các dịch vụ khác - điểm khác biệt chính là fail2ban sử dụng iptables trong khi Denyhosts sử dụng hosts.deny, một số dịch vụ không xem xét các tệp máy chủ như Apache.
jammypeach

Để ném một tùy chọn khác lên bàn, gần đây tôi đã phát hiện ra rằng cấu hình tường lửa ufw cũng cho phép bạn áp dụng giới hạn tốc độ (không thể định cấu hình) cho bất kỳ cổng TCP hoặc UDP nào. Nếu bạn đã sử dụng UFW, đây có thể là một lựa chọn tốt, thay vì định cấu hình và chạy một trình nền bổ sung.
spiffytech

Điều đầu tiên cần làm để ngăn chặn các vi phạm bruteforce là sử dụng mật khẩu khá mạnh (hoặc thậm chí vô hiệu hóa hoàn toàn mật khẩu auth :). Tỷ lệ giới hạn (một mình) là yếu cho điều đó. Tôi đã không thử các lựa chọn thay thế nhưng bản thân tôi sử dụng fail2ban và thấy nó khá hữu ích để chống lại các bot dò tìm mật khẩu.
Petr Gladkikh

Theo kinh nghiệm của tôi, fail2ban cần thêm một chút công việc để làm cho nó thực sự làm bất cứ điều gì. Ngược lại, bạn có thể cài đặt RPM denyhosts khá nhiều và khởi động nó để bảo vệ máy chủ của bạn trong khi bạn thực hiện các tùy chọn phức tạp hơn. Tôi chắc chắn đồng ý fail2ban là 'tốt hơn', nhưng để dễ bảo vệ, bạn không thể đánh bại denyhosts.
Ralph Bolton

21

cách tốt nhất để ngăn chặn đăng nhập vũ phu?

Đừng để họ đến máy của bạn ngay từ đầu! Có rất nhiều cách để ngăn chặn các nỗ lực vũ phu trước khi chúng đến máy chủ của bạn hoặc thậm chí ở cấp SSH.

Phải nói rằng, bảo vệ Hệ điều hành của bạn bằng một cái gì đó như fail2ban là một ý tưởng tuyệt vời. Fail2ban hơi khác so với Denyhost, mặc dù chúng chơi trong cùng một không gian. Fail2ban sử dụng iptables.

http://en.wikipedia.org/wiki/Fail2ban

Fail2ban tương tự như Denyhosts ... nhưng không giống như Denyhost tập trung vào SSH, fail2ban có thể được cấu hình để giám sát bất kỳ dịch vụ nào ghi các lần đăng nhập vào tệp nhật ký và thay vì chỉ sử dụng /etc/hosts.deny để chặn địa chỉ / máy chủ IP , fail2ban có thể sử dụng Netfilter / iptables và TCP Wrappers /etc/hosts.deny.

Có một số kỹ thuật bảo mật quan trọng bạn nên xem xét để giúp ngăn chặn đăng nhập vũ phu:

SSH:

  • Không cho phép root đăng nhập
  • Không cho phép mật khẩu ssh (sử dụng xác thực khóa riêng)
  • Đừng nghe trên mọi giao diện
  • Tạo giao diện mạng cho SSH (ví dụ: eth1), khác với giao diện bạn phục vụ các yêu cầu từ (ví dụ: eth0)
  • Không sử dụng tên người dùng phổ biến
  • Sử dụng danh sách cho phép và chỉ cho phép người dùng yêu cầu truy cập SSH
  • Nếu bạn yêu cầu truy cập Internet ... Hạn chế quyền truy cập vào một bộ IP hữu hạn. Một IP tĩnh là lý tưởng, tuy nhiên khóa nó xuống xx0.0 / 16 thì tốt hơn 0.0.0.0/0
  • Nếu có thể, hãy tìm cách kết nối mà không cần truy cập Internet, bằng cách đó bạn có thể từ chối tất cả lưu lượng truy cập Internet cho SSH (ví dụ: với AWS, bạn có thể có kết nối trực tiếp bỏ qua Internet, đó gọi là Kết nối trực tiếp)
  • Sử dụng phần mềm như fail2ban để bắt bất kỳ cuộc tấn công vũ phu nào
  • Đảm bảo HĐH luôn cập nhật, đặc biệt là các gói ssh và bảo mật

Ứng dụng:

  • Đảm bảo ứng dụng của bạn luôn được cập nhật, trong các gói bảo mật cụ thể
  • Khóa các trang 'quản trị viên' của ứng dụng của bạn. Nhiều lời khuyên ở trên cũng áp dụng cho khu vực quản trị viên của ứng dụng của bạn.
  • Mật khẩu Bảo vệ khu vực quản trị của bạn, một cái gì đó như htpasswd cho bảng điều khiển web sẽ chiếu bất kỳ lỗ hổng ứng dụng cơ bản nào và tạo thêm một rào cản để vào
  • Khóa quyền truy cập tập tin. 'Thư mục tải lên' nổi tiếng là điểm vào của tất cả các loại nội dung khó chịu.
  • Cân nhắc đặt ứng dụng của bạn phía sau một mạng riêng và chỉ hiển thị bộ cân bằng tải phía trước và hộp nhảy (đây là một thiết lập điển hình trong AWS sử dụng VPC)

1
Bạn có thể giải thích về tuyên bố "Có rất nhiều cách để ngăn chặn các nỗ lực vũ phu trước khi chúng đến máy chủ của bạn, hoặc thậm chí ở cấp SSH." Tôi đặc biệt quan tâm nếu bạn có bất kỳ đề xuất nào cho các máy được lưu trữ nơi bạn không có quyền kiểm soát mạng bên ngoài. Cảm ơn!
Kevin Keane

7

Tôi sử dụng các quy tắc iptables để xếp hạng giới hạn các kết nối mới từ cùng một địa chỉ IP (chủ yếu là SSH, nhưng nó cũng hoạt động tốt với FTP). Ưu điểm, như tôi thấy, trên "fail2ban" và các công cụ khác là tuyến iptables xảy ra hoàn toàn trong chế độ kernel và không dựa vào bất kỳ công cụ chế độ người dùng nào để theo dõi các tệp nhật ký.

Hàng trăm thông tin đăng nhập ssh không thành công

Nếu bạn có thể làm điều đó, việc giới hạn các địa chỉ nguồn có thể truy cập các biểu tượng trong câu hỏi sẽ rõ ràng sẽ giúp ích.

Với SSH, bạn thực sự nên sử dụng xác thực chứng chỉ và không chấp nhận mật khẩu.


@ mc0e - Tôi không theo dõi.
Evan Anderson

7

MỘT CÁCH TUYỆT VỜI KHÁC ĐỂ BẢO VỆ SSH (Tôi đã sử dụng điều này trong một thập kỷ hoặc tốt hơn) là sử dụng các thư viện gần đây trong iptables nguyên bản (tùy thuộc vào bản phân phối của bạn).
Về cơ bản, nó có thể được sử dụng như cổng gõ mà được tích hợp trong iptables. Điều này sẽ giúp bạn tiết kiệm rất nhiều đau đầu. Miễn là bạn có thể kết nối tcp (telnet là một cách. Tôi cũng đã sử dụng các máy khách ssh và chỉ chúng vào cổng. Mọi thứ sẽ thực hiện kết nối tcp với một số cổng được chỉ định. Tôi đang nhìn bạn Putty!) Từ khách hàng bắt đầu kết nối ssh bạn có thể sử dụng này.

Dưới đây là một ví dụ sẽ có iptables mở cổng 22 đến máy chủ của bạn khi bạn telnet từ máy chủ của bạn đến máy chủ trên cổng 4103. Sau đó, bạn có thể sử dụng telnet đến cổng 4102 hoặc 4104 để đóng mở sed. Lý do cho cả 4102 và 4104 là để giữ quét tcp đơn giản từ khi mở 22. Chỉ một kết nối tcp (telnet) đến cổng 4103 sẽ cho phép bạn vào.

Thưởng thức!

Oh và tôi ủng hộ Fail2Ban. Linh hoạt hơn và tôi thích rằng lệnh cấm xảy ra trong iptables hơn là tcpwrappers.

SSH PORTKNOCKING

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -m recent --rcheck --name SSH -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4102 -m recent --name SSH --remove -j DROP
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4103 -m recent --name SSH --set -j DROP
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 4104 -m recent --name SSH --remove -j DROP

6

Một điểm khác biệt giữa Fail2ban và Denyhosts là Denyhost có thể chia sẻ danh sách chặn với những người dùng Denyhost khác. Với Fail2ban, bạn chỉ có thể chặn IP mà máy chủ của bạn đã thấy trước đó - với Denyhosts, một nỗ lực vũ phu thậm chí có thể không bao giờ đến được máy chủ của bạn, nếu có ai đó đã nhìn thấy nó và danh sách chặn được tải xuống máy chủ của bạn trước kẻ tấn công được vào máy tính của bạn.

Tuy nhiên, một sự khác biệt nữa là Fail2ban sử dụng iptables, trong khi Denyhosts sử dụng tcpwrappers. Những người khác đã đề cập đến sự khác biệt này trước đây, nhưng có một vài lưu ý phụ đáng được đề cập.

iptables bị giới hạn ở số lượng địa chỉ IP bạn có thể chặn hiệu quả. Đó có lẽ là một trong những lý do tại sao Fail2ban không có cơ chế chia sẻ danh sách chặn.

Một hiệu ứng khác là khi iptables được thay thế bằng nftables, Fail2ban có thể sẽ ngừng hoạt động hoặc cần phải viết lại. Denyhosts có thể sẽ tiếp tục làm việc.

Vì vậy, cả hai đều có ưu điểm và nhược điểm. Tôi thích cả hai; đối với bản thân tôi, tôi đang sử dụng Denyhost vì thông thường tôi chỉ muốn bảo vệ SSH và tôi thích chia sẻ danh sách chặn.


5

Một điều cần lưu ý về Fail2Ban là dường như nó sử dụng bộ nhớ nhiều hơn khoảng 10 MB so với Denyhost. Vì vậy, nếu bạn đang sử dụng VPS 128 MB, bạn có thể muốn xem xét điều đó. Ngoài ra, fail2ban ngoài luồng chỉ được thiết lập trên SSH, điều đó có nghĩa là không có thay đổi nào đối với cấu hình - Denyhost cũng thực hiện điều tương tự trong ít bộ nhớ hơn.


2
Hãy thử thêm "ulimit -s 256" vào / etc / default / fail2ban. Giảm 10MB trên hệ thống của tôi.
pkoch

3

denyhosts là dành cho ssh. fail2ban toàn diện hơn (HTTP, FTP, v.v.). Cả hai sử dụng iptables đằng sau hậu trường.


Cả "denyhosts" và "fail2ban" đều sử dụng iptables để thực hiện hành vi "chặn" của họ, nhưng họ không sử dụng iptables để giới hạn tỷ lệ. Họ phân tích các bản ghi trong "đất người dùng" và hành động theo các mục nhật ký.
Evan Anderson

10
@Evan, denyhosts không sử dụng iptables (theo mặc định). Nó sử dụng các trình bao bọc TCP và cập nhật /etc/hosts.deny của bạn khi hệ thống bị cấm.
Zoredache

@Zoredache: Tôi đứng sửa. Trước đây, enver đã sử dụng "denyhosts", tôi đã đưa ra một giả định không chính xác về cách nó gọi chức năng "chặn" của nó. Tuy nhiên, là một công cụ phân tích cú pháp / phản ứng dữ liệu người dùng, tôi thích sử dụng một giải pháp dựa trên iptables nghiêm ngặt để "denyhosts".
Evan Anderson

1

Thay vì gây rối với iptables tẻ nhạt hoặc fail2ban config, tại sao cộng đồng mở không làm tất cả công việc cho bạn và sử dụng CSF / LFD thay thế? Tôi rất có thể đề nghị nó trên tất cả các tùy chọn được đề cập khác. Xem http://configserver.com/cp/csf.html để biết những gì nó có thể làm cho máy chủ của bạn. CSF không yêu cầu bảng điều khiển, nó cung cấp một giao diện người dùng đơn giản, cho những người không muốn làm điều đó bằng vỏ. Và đó là rất nhiều kịch bản perl-script không ổn định đáng tin cậy ổn định.


8
Điều này nghe có vẻ giống như một quảng cáo và làm nổi bật câu hỏi thực tế.
Drew Khoury

À không, tôi không bóng bẩy về câu hỏi thực tế. Tôi đã đưa ra một giải pháp thay thế sẽ khiến bạn phải tự làm phiền mình với câu hỏi này. Nghiêm túc mà nói, CSF / LFD không chỉ là một hệ thống kiểm soát tường lửa khác, nó đã tăng lên từ chính xác các loại vấn đề được đưa ra ở đây. Tại sao mọi người KHÔNG muốn phát triển? Nó giúp bạn tiết kiệm rất nhiều thời gian, bởi vì những người khác đã giải quyết nó. Đó là lý do CSF ​​tồn tại.
Bến

Đối với những gì đáng giá, như một người coi trọng khả năng kiếm tiền của thời gian của tôi, nếu giá cả phù hợp, tôi muốn có một giải pháp "cắm" hơn cho loại hình này, ngay cả khi nó có giá vài đô la. Bằng cách đó, tôi không phải lãng phí thời gian để tìm hiểu về những thứ tôi thực sự không quan tâm, nhưng nhận ra tầm quan trọng của việc có sự bảo vệ.
David

1

fail2ban dường như không có cơ chế nhận biết đăng nhập ssh thành công và đặt lại số lần thất bại của nó.

Bộ lọc tiêu chuẩn cho sshd (ít nhất là trên bản cài đặt debian của tôi), sẽ hiển thị số đếm lỗi cho mỗi khóa ssh mà máy khách trình bày mà máy chủ từ chối. Một số người dùng trình bày nhiều khóa trên mỗi lần đăng nhập và thường xuyên bị khóa, mặc dù thông tin đăng nhập của họ đã thành công sau khi một vài khóa đã được thực hiện.

Kết quả của những điều trên, tôi hiện đang suy nghĩ về việc di chuyển khỏi fail2ban. Về mặt này ít nhất, denyhosts là tốt hơn. Tuy nhiên, nó dường như không còn là một lựa chọn tốt và không còn được hỗ trợ trong các phiên bản mới hơn của debian (một số thảo luận tại https://www.chrissearle.org/2015/06/16/replaces-denyhosts-with-fail2ban-for- debian / )

Tôi không có một giải pháp tốt ở đây.


Có một vấn đề tương tự nếu bạn sử dụng xác thực LDAP. Quá nhiều thông tin đăng nhập thành công sẽ khiến bạn bị khóa: bug.launchpad.net/ubfox/+source/libpam-ldap/+bug/562388
Mike

Để ngăn tất cả các khóa được trình bày, hãy chỉ cho người dùng của bạn cách chỉ định khóa được sử dụng trong tệp ~ / .ssh / config của họ.
BillThor

0

Trên thực tế, tôi nghĩ rằng denyhost có thể ngăn chặn nhiều dịch vụ khác ngoài dịch vụ sshd. Trong tệp cấu hình của nó - /etc/denyhosts.conf, có một số dòng mã cho biết:

# BLOCK_SERVICE: the service name that should be blocked in HOSTS_DENY
#
# man 5 hosts_access for details
#
# eg.   sshd: 127.0.0.1  # will block sshd logins from 127.0.0.1
#
# To block all services for the offending host:  
BLOCK_SERVICE = ALL
# To block only sshd:
# BLOCK_SERVICE  = sshd

vì vậy nếu chúng ta đặt BLOCK_SERVICEbiến là ALLnhư trên, chúng ta có thể xem dịch vụ ssh của mình.


0

Denyhosts phiên bản 3.0: Mỗi khi một địa chỉ IP xuất hiện trong tệp nhật ký, Denyhosts sẽ mở tệp hosts.deny và đọc toàn bộ nội dung để khớp với địa chỉ. Mỗi lần. Không có gì được lưu trong bộ nhớ. Nếu bạn có một tệp hosts.deny lớn và phải chịu nhiều thăm dò (nhiều mục nhập tệp nhật ký), Denyhost sẽ trở thành một CPU hog đọc và đọc lại tệp hosts.deny cho mọi địa chỉ IP xuất hiện. Không tốt.

Nếu bạn kích hoạt hỗ trợ iptables, Denyhost sẽ tạo ra danh sách lớn các địa chỉ IP bị chặn. Denyhosts không sử dụng ipset hoặc nftables để tạo bản đồ IP hiệu quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.