Mục lục

Không có mục lục

Cách bảo vệ SSH bằng Fail2Ban trên Ubuntu 14.04

Ngày đăng: 6 tháng 10 năm 2023

Giới thiệu

Mặc dù việc kết nối với máy chủ của bạn thông qua SSH có thể rất an toàn nhưng bản thân SSH daemon là một dịch vụ phải được kết nối với Internet để hoạt động bình thường. Điều này đi kèm với một số rủi ro cố hữu và tạo ra một phương hướng tấn công cho những kẻ có ý định tấn công.

Bất kỳ dịch vụ nào tiếp xúc với mạng đều là mục tiêu tiềm năng theo cách này. Nếu chú ý đến nhật ký ứng dụng của các dịch vụ này, bạn sẽ thường thấy các nỗ lực đăng nhập có hệ thống, lặp đi lặp lại thể hiện các cuộc tấn công bạo lực của người dùng cũng như bot.

Dịch vụ có tên Fail2ban có thể giảm thiểu vấn đề này bằng cách tạo các quy tắc có thể tự động thay đổi cấu hình tường lửa iptables của bạn dựa trên số lần đăng nhập không thành công được xác định trước. Điều này sẽ cho phép máy chủ của bạn phản hồi các nỗ lực truy cập bất hợp pháp mà không cần sự can thiệp của bạn.

Trong hướng dẫn này, chúng tôi sẽ đề cập đến cách cài đặt và sử dụng Fail2ban trên máy chủ Ubuntu 14.04.

Cài đặt Fail2Ban trên Ubuntu 14.04

Quá trình cài đặt công cụ này rất đơn giản vì nhóm Ubuntu packaging team duy trì một package trong kho mặc định.

Trước tiên, chúng ta cần cập nhật chỉ mục gói cục bộ và sau đó chúng ta có thể sử dụng apt để tải xuống và cài đặt gói:

  1. sudo apt-get update
  2. sudo apt-get install fail2ban

Như bạn có thể thấy, việc cài đặt rất đơn giản. Bây giờ chúng ta có thể bắt đầu cấu hình tiện ích để sử dụng.

Định cấu hình Fail2Ban với Cài đặt dịch vụ của bạn

Dịch vụ Fail2ban giữ các tập tin cấu hình của nó trong thư mục /etc/fail2ban. Có một tệp có tên mặc định là jail.conf.

Vì tệp này có thể được sửa đổi bằng cách nâng cấp gói, chúng ta không nên chỉnh sửa tệp này tại chỗ mà nên sao chép nó để chúng ta có thể thực hiện các thay đổi của mình một cách an toàn. Để hai tệp này hoạt động cùng nhau thành công, tốt nhất chỉ nên đưa các cài đặt bạn muốn ghi đè vào tệp jail.local. Tất cả các tùy chọn mặc định sẽ được lấy từ file jail.conf.

Mặc dù chúng ta chỉ nên đưa những sai lệch so với mặc định vào tệp jail.local, nhưng việc tạo tệp jail.local dựa trên tệp jail.conf hiện có sẽ dễ dàng hơn. Vì vậy, chúng tôi sẽ sao chép tệp đó, với nội dung được nhận xét, làm cơ sở cho tệp jail.local Bạn có thể làm điều này bằng cách gõ:

  1. awk '{ printf "# "; print; }' /etc/fail2ban/jail.conf | sudo tee /etc/fail2ban/jail.local

Sau khi sao chép tệp, chúng ta có thể mở tệp jail.conf gốc để xem mọi thứ được thiết lập theo mặc định như thế nào.

  1. sudo nano /etc/fail2ban/jail.conf

Trong tệp này, có một số cài đặt mà bạn có thể muốn điều chỉnh. Các cài đặt nằm trong phần [DEFAULT] sẽ được áp dụng cho tất cả các dịch vụ được bật cho Fail2ban không bị ghi đè trong phần riêng của dịch vụ.

/etc/fail2ban/jail.conf
[DEFAULT]
. . .
ignoreip = 127.0.0.1/8
. . .

Cài đặt ignoreip sẽ định cấu hình các địa chỉ nguồn mà fail2ban bỏ qua. Theo mặc định, nó được cấu hình để không cấm bất kỳ lưu lượng truy cập nào đến từ máy cục bộ. Bạn có thể thêm các địa chỉ bổ sung để bỏ qua bằng cách thêm phần [DEFAULT] với cài đặt ignoreip bên dưới vào tệp jail.local. Bạn có thể thêm các địa chỉ bổ sung bằng cách thêm chúng vào cuối lệnh, cách nhau bằng dấu cách.

/etc/fail2ban/jail.conf
[DEFAULT]
. . .
bantime = 600
. . .

Tham số bantime đặt khoảng thời gian mà khách hàng sẽ bị cấm khi họ không xác thực chính xác. Điều này được đo bằng giây. Theo mặc định, giá trị này được đặt thành 600 giây hoặc 10 phút.

/etc/fail2ban/jail.conf
[DEFAULT]
. . .
findtime = 600
maxretry = 3
. . .

Hai thông số tiếp theo mà các bạn muốn chú ý là findtimemaxretry. Những điều này phối hợp với nhau để thiết lập các điều kiện mà theo đó khách hàng bị phát hiện là người dùng bất hợp pháp cần bị cấm.

Biến maxretry đặt số lần thử mà khách hàng phải xác thực trong một khoảng thời gian được xác định bởi findtime, trước khi bị cấm. Với cài đặt mặc định, dịch vụ Fail2ban sẽ cấm khách hàng cố gắng đăng nhập 3 lần không thành công trong khoảng thời gian 10 phút.

/etc/fail2ban/jail.conf
[DEFAULT]
. . .
destemail = root@localhost
sendername = Fail2Ban
mta = sendmail
. . .

Bạn sẽ muốn đánh giá cài đặt destemail, sendernamemta nếu bạn muốn định cấu hình thông báo qua email. Tham số destemail đặt địa chỉ email sẽ nhận thông báo cấm. sendername đặt giá trị của trường “From” trong email. Tham số mta định cấu hình dịch vụ thư nào sẽ được sử dụng để gửi thư. Một lần nữa, hãy thêm chúng vào tệp jail.local, dưới tiêu đề [DEFAULT] và đặt thành các giá trị thích hợp nếu bạn muốn điều chỉnh chúng.

/etc/fail2ban/jail.conf
[DEFAULT]
. . .
action = $(action_)s
. . .

Tham số này định cấu hình hành động mà fail2ban thực hiện khi nó muốn đưa ra lệnh cấm. Giá trị action_ được xác định trong tệp ngay trước tham số này. Hành động mặc định chỉ đơn giản là định cấu hình tường lửa để từ chối lưu lượng truy cập từ máy chủ vi phạm cho đến khi hết thời gian cấm.

Nếu bạn muốn định cấu hình thông báo qua email, hãy thêm hoặc bỏ ghi chú mục action vào tệp jail.local và thay đổi giá trị của nó từ action_ thành action_mw. Nếu bạn muốn email bao gồm các dòng nhật ký có liên quan, bạn có thể thay đổi nó thành action_mwl. Đảm bảo bạn đã định cấu hình cài đặt thư thích hợp nếu bạn chọn sử dụng thông báo qua thư.

Cài đặt jail cá nhân

Cuối cùng, chúng ta đến phần tệp cấu hình liên quan đến các dịch vụ riêng lẻ. Chúng được chỉ định bởi các tiêu đề phần, như [ssh].

Mỗi phần này có thể được kích hoạt bằng cách bỏ ghi chú tiêu đề trong jail.local và thay đổi dòng enabled thành “true”:

/etc/fail2ban/jail.local
[jail_to_enable]
. . .
enabled = true
. . .

Theo mặc định, dịch vụ SSH được bật và tất cả các dịch vụ khác đều bị tắt.

Các phần này hoạt động bằng cách sử dụng các giá trị được đặt trong phần [DEFAULT] làm cơ sở và sửa đổi chúng nếu cần. Nếu muốn ghi đè bất kỳ giá trị nào, bạn có thể làm như vậy bằng cách thêm phần dịch vụ thích hợp vào jail.local và sửa đổi giá trị của nó.

Một số cài đặt khác được đặt ở đây là filter sẽ được sử dụng để quyết định xem một dòng trong nhật ký có biểu thị xác thực không thành công hay không, và logpath thông báo cho fail2ban biết vị trí của nhật ký cho dịch vụ cụ thể đó.

Giá trị filter thực sự là một tham chiếu đến một tệp nằm trong thư mục /etc/fail2ban/filter.d, với phần mở rộng .conf của nó đã bị xóa. Các tệp này chứa các biểu thức chính quy xác định xem một dòng trong nhật ký có phải là lần xác thực không thành công hay không. Chúng tôi sẽ không trình bày sâu về các tệp này trong hướng dẫn này vì chúng khá phức tạp và các cài đặt được xác định trước rất phù hợp với các dòng thích hợp.

Tuy nhiên, bạn có thể xem loại filter nào có sẵn bằng cách xem thư mục đó:

  1. ls /etc/fail2ban/filter.d

Nếu bạn thấy một tệp có vẻ liên quan đến dịch vụ bạn đang sử dụng, bạn nên mở tệp đó bằng trình soạn thảo văn bản. Hầu hết các tệp đều được nhận xét khá tốt và ít nhất bạn có thể biết loại tình trạng nào mà tập lệnh được thiết kế để chống lại. Hầu hết các filter này đều có các phần đặc biệt (bị vô hiệu hóa) trong tệp jail.conf mà chúng ta có thể kích hoạt trong tệp jail.local nếu muốn.

Ví dụ: giả sử rằng chúng tôi đang phục vụ một trang web bằng Nginx và nhận ra rằng một phần được bảo vệ bằng mật khẩu trên trang web của chúng tôi đang gặp sự cố khi cố gắng đăng nhập. Chúng ta có thể yêu cầu Fail2ban sử dụng tệp nginx-http-auth.conf để kiểm tra tình trạng này trong tệp /var/log/nginx/error.log.

Điều này thực sự đã được thiết lập trong một phần có tên [nginx-http-auth] trong tệp /etc/fail2ban/jail.conf của chúng tôi. Chúng tôi chỉ cần bỏ ghi chú phần trong tệp jail.local và lật tham số đã bật để bảo vệ dịch vụ của chúng tôi:

/etc/fail2ban/jail.local
. . .
[nginx-http-auth]

enabled = true
. . .

Nếu bật tính năng này, bạn sẽ muốn khởi động lại dịch vụ Fail2ban của mình để đảm bảo các quy tắc của bạn được xây dựng chính xác.

Để tất cả chúng cùng nhau

Bây giờ bạn đã hiểu ý tưởng cơ bản đằng sau Fail2ban, hãy cùng thực hiện cài đặt cơ bản.

Chúng tôi sẽ định cấu hình chính sách tự động cấm cho SSH và Nginx, giống như chúng tôi đã mô tả ở trên. Chúng tôi muốn Fail2ban gửi email cho chúng tôi khi IP bị cấm.

Đầu tiên, hãy cài đặt tất cả các phần mềm có liên quan.

Nếu bạn chưa có nó, bạn sẽ cần nginx, vì chúng tôi sẽ theo dõi nhật ký của nó và bạn sẽ cần sendmail để gửi thông báo cho chúng tôi. Chúng tôi cũng sẽ lấy iptables-persistent để cho phép máy chủ tự động thiết lập các quy tắc tường lửa của chúng tôi khi khởi động. Chúng có thể được lấy từ kho lưu trữ mặc định của Ubuntu:

  1. sudo apt-get update
  2. sudo apt-get install nginx sendmail iptables-persistent

Dừng dịch vụ fail2ban trong giây lát để chúng tôi có thể thiết lập tường lửa cơ sở mà không cần các quy tắc mà nó thêm vào:

  1. sudo service fail2ban stop

Thiết lập tường lửa cơ sở

Khi việc đó hoàn tất, chúng ta nên triển khai tường lửa mặc định. Bạn có thể tìm hiểu cách định cấu hình tường lửa iptables trên Ubuntu 14.04 tại đây. Chúng tôi sẽ chỉ tạo một tường lửa cơ bản cho hướng dẫn này.

Chúng tôi sẽ yêu cầu nó cho phép các kết nối được thiết lập, lưu lượng truy cập do chính máy chủ tạo ra, lưu lượng truy cập dành cho các cổng máy chủ web và SSH của chúng tôi. Chúng tôi sẽ loại bỏ tất cả lưu lượng truy cập khác. Chúng ta có thể thiết lập tường lửa cơ bản này bằng cách gõ:

  1. sudo iptables -A INPUT -i lo -j ACCEPT
  2. sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  3. sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  4. sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
  5. sudo iptables -A INPUT -j DROP

Các lệnh này sẽ thực hiện chính sách trên. Chúng ta có thể xem các quy tắc tường lửa hiện tại của mình bằng cách gõ:

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP

Bạn có thể lưu tường lửa để chúng tồn tại khi khởi động lại bằng cách gõ:

  1. sudo dpkg-reconfigure iptables-persistent

Sau đó, bạn có thể khởi động lại fail2ban để triển khai các quy tắc gói:

  1. sudo service fail2ban start

Chúng ta có thể xem các quy tắc tường lửa hiện tại của mình bằng cách gõ:

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-ssh -j RETURN

Chúng tôi có chính sách mặc định cho từng chuỗi của mình và sau đó là năm quy tắc cơ bản mà chúng tôi đã thiết lập. Trong màu đỏ, chúng tôi cũng có cấu trúc mặc định được thiết lập bởi Fail2ban vì nó đã triển khai các chính sách cấm SSH theo mặc định. Lúc đầu, những thứ này có thể hiển thị hoặc không, vì đôi khi fail2ban không thêm cấu trúc cho đến khi lệnh cấm đầu tiên được thực hiện.

Điều chỉnh cấu hình Fail2ban

Bây giờ, chúng ta cần định cấu hình Fail2ban bằng các cài đặt mà chúng ta muốn. Mở tệp jail.local:

  1. sudo nano /etc/fail2ban/jail.local

Chúng ta có thể đặt thời gian cấm nghiêm khắc hơn tại đây. Tìm và bỏ ghi chú tiêu đề [DEFAULT]. Trong tiêu đề mặc định, hãy thay đổi cài đặt bantime để dịch vụ của chúng tôi cấm khách hàng trong nửa giờ:

/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 1800
. . .

Chúng tôi cũng cần định cấu hình thông tin email cảnh báo của mình. Đầu tiên, hãy tìm tham số destemail, tham số này cũng nằm trong tiêu đề [DEFAULT]. Nhập địa chỉ email mà bạn muốn sử dụng để thu thập những tin nhắn này:

/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = admin@example.com
. . .

Bạn có thể đặt sendername thành tên khác nếu muốn. Tuy nhiên, sẽ rất hữu ích khi có một giá trị có thể dễ dàng lọc bằng dịch vụ thư của bạn, nếu không hộp thư đến thông thường của bạn có thể tràn ngập cảnh báo nếu có nhiều lần thử bị gián đoạn từ nhiều nơi khác nhau.

Di chuyển xuống dưới, chúng ta cần điều chỉnh tham số action thành một trong những hành động gửi email cho chúng ta. Các lựa chọn là giữa action_mw để đưa ra lệnh cấm và sau đó gửi email cho chúng tôi báo cáo "whois" về máy chủ vi phạm, hoặc action_mwl để thực hiện hành động trên nhưng cũng gửi email cho các dòng nhật ký có liên quan.

Chúng tôi sẽ chọn action_mwl vì dòng nhật ký sẽ giúp chúng tôi khắc phục sự cố và thu thập thêm thông tin nếu có vấn đề:

/etc/fail2ban/jail.local
[DEFAULT]
. . .
action = %(action_mwl)s
. . .

Chuyển sang phần SSH của chúng tôi, nếu chúng tôi muốn điều chỉnh số lần thử không thành công được phép trước khi lệnh cấm được thiết lập, bạn có thể chỉnh sửa mục nhập maxretry. Nếu bạn đang sử dụng cổng khác “22”, bạn sẽ muốn điều chỉnh thông số port một cách thích hợp. Như chúng tôi đã nói trước đây, dịch vụ này đã được bật nên chúng tôi không cần sửa đổi dịch vụ đó.

Tiếp theo tìm kiếm phần nginx-http-auth. Bỏ ghi chú tiêu đề và thay đổi tham số enabled thành “true”.

/etc/fail2ban/jail.local
. . .
[nginx-http-auth]

enabled = true
. . .

Đây là tất cả những gì bạn phải làm trong phần này trừ khi máy chủ web của bạn đang hoạt động trên các cổng không chuẩn hoặc nếu bạn đã di chuyển đường dẫn nhật ký (log path) lỗi mặc định.

Khởi động lại dịch vụ Fail2ban

Khi bạn hoàn tất, hãy lưu và đóng tệp.

Bây giờ, hãy bắt đầu hoặc khởi động lại dịch vụ Fail2ban của bạn. Đôi khi, tốt hơn hết là bạn nên tắt hoàn toàn dịch vụ rồi khởi động lại:

  1. sudo service fail2ban stop

Bây giờ chúng ta có thể khởi động lại nó bằng cách gõ:

  1. sudo service fail2ban start

Có thể mất vài phút để tất cả các quy tắc tường lửa của bạn được áp dụng. Đôi khi, các quy tắc không được thêm vào cho đến khi lệnh cấm đầu tiên thuộc loại đó được ban hành. Tuy nhiên, sau một thời gian, bạn có thể kiểm tra các quy tắc mới bằng cách gõ:

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-http-auth -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh -j RETURN

Các dòng màu đỏ là những dòng mà chính sách Fail2ban của chúng tôi đã tạo. Hiện tại, họ chỉ hướng lưu lượng truy cập đến các chuỗi mới, gần như trống và sau đó cho phép lưu lượng truy cập quay trở lại chuỗi INPUT.

Tuy nhiên, những chuỗi mới này sẽ là nơi bổ sung các quy định cấm.

Kiểm tra chính sách cấm

Từ một máy chủ khác, một máy chủ không cần đăng nhập vào máy chủ Fail2ban của bạn, chúng tôi có thể kiểm tra các quy tắc bằng cách cấm máy chủ thứ hai của chúng tôi.

Sau khi đăng nhập vào máy chủ thứ hai của bạn, hãy thử SSH vào máy chủ Fail2ban. Ví dụ: bạn có thể thử kết nối bằng tên không tồn tại:

  1. ssh blah@fail2ban_server_IP

Nhập các ký tự ngẫu nhiên vào dấu nhắc mật khẩu. Lặp lại điều này một vài lần. Tại một thời điểm nào đó, máy chủ Fail2ban sẽ ngừng phản hồi với thông báo Permission denied. Điều này báo hiệu rằng máy chủ thứ hai của bạn đã bị cấm sử dụng máy chủ Fail2ban.

Trên máy chủ Fail2ban của bạn, bạn có thể xem quy tắc mới bằng cách kiểm tra lại iptables của chúng tôi:

  1. sudo iptables -S
Output
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N fail2ban-nginx-http-auth -N fail2ban-ssh -A INPUT -p tcp -m multiport --dports 80,443 -j fail2ban-nginx-http-auth -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -j DROP -A fail2ban-nginx-http-auth -j RETURN -A fail2ban-ssh -s 203.0.113.14/32 -j REJECT --reject-with icmp-port-unreachable -A fail2ban-ssh -j RETURN

Như bạn có thể thấy trong dòng được đánh dấu, chúng tôi có một quy tắc mới trong cấu hình từ chối lưu lượng truy cập đến cổng SSH đến từ địa chỉ IP của máy chủ thứ hai của chúng tôi. Bạn cũng sẽ nhận được email về lệnh cấm đối với tài khoản bạn đã định cấu hình.

Kết luận

Bây giờ bạn có thể định cấu hình một số chính sách cấm cơ bản cho dịch vụ của mình. Fail2ban rất dễ cài đặt và là cách tuyệt vời để bảo vệ bất kỳ loại dịch vụ nào sử dụng xác thực.

Nếu bạn muốn tìm hiểu thêm về cách hoạt động của Fail2ban, bạn có thể xem hướng dẫn của chúng tôi về cách hoạt động của các quy tắc và tệp Fail2ban.

Để biết thông tin về cách sử dụng Fail2ban để bảo vệ các dịch vụ khác, hãy thử các liên kết sau:

  • Cách bảo vệ máy chủ Nginx bằng Fail2Ban trên Ubuntu 14.04
  • Cách bảo vệ máy chủ Apache bằng Fail2Ban trên Ubuntu 14.04
Chia sẻ

0 câu trả lời