Table of Contents

No table of contents
Join CloudFly's Telegram channel to receive more offers and never miss any promotions from CloudFly

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

Posted on: 22 tháng 4 năm 2024

Giới thiệu

SSH thực tế là phương thức kết nối với máy chủ đám mây. Nó bền và có thể mở rộng — khi các tiêu chuẩn mã hóa mới được phát triển, chúng có thể được sử dụng để tạo khóa SSH mới, đảm bảo rằng giao thức cốt lõi vẫn được an toàn. Tuy nhiên, không có giao thức hoặc ngăn xếp phần mềm nào là hoàn toàn an toàn, và SSH được triển khai rộng rãi trên internet có nghĩa là nó đại diện cho một attack surface hoặc attack vector có thể dự đoán được, mà qua đó mọi người có thể cố gắng truy cập.

Bất kỳ dịch vụ nào được đưa vào mạng đều là mục tiêu tiềm năng theo cách này. Nếu bạn xem lại nhật ký cho dịch vụ SSH chạy trên bất kỳ máy chủ nào được quản lý rộng rãi, 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 brute force của người dùng cũng như bot. Mặc dù bạn có thể thực hiện một số tối ưu hóa cho dịch vụ SSH của mình để giảm khả năng thành công của các cuộc tấn công này xuống gần như bằng 0, chẳng hạn như vô hiệu hóa xác thực mật khẩu thay vì SSH key, nhưng chúng vẫn có thể gây ra một số trách nhiệm pháp lý nhỏ, liên tục.

Việc triển khai sản xuất quy mô lớn mà trách nhiệm pháp lý này hoàn toàn không được chấp nhận sẽ thường triển khai VPN như WireGuard trước dịch vụ SSH của họ, do đó không thể kết nối trực tiếp với cổng SSH mặc định 22 từ internet bên ngoài mà không có sự trừu tượng hóa phần mềm bổ sung hoặc cổng. Các giải pháp VPN này được nhiều người tin cậy nhưng sẽ tăng thêm độ phức tạp và có thể phá vỡ một số hoạt động tự động hóa hoặc các mối liên kết phần mềm nhỏ khác.

Trước hoặc ngoài việc cam kết thiết lập VPN đầy đủ, bạn có thể triển khai một công cụ có tên Fail2ban. Fail2ban có thể giảm thiểu đáng kể các cuộc tấn công brute force bằng cách tạo các quy tắc tự động thay đổi cấu hình tường lửa của bạn để cấm các IP cụ thể sau một số lần đăng nhập không thành công nhất định. Điều này sẽ cho phép máy chủ của bạn tự tăng cường khả năng chống lại những nỗ lực truy cập này mà không cần sự can thiệp của bạn.

Trong hướng dẫn này, bạn sẽ biết cách cài đặt và sử dụng Fail2ban trên máy chủ Ubuntu 22.04.

Điều kiện tiên quyết

Để hoàn thành hướng dẫn này, bạn sẽ cần:

  • Máy chủ Ubuntu 22.04 và non-root user có đặc quyền sudo. Bạn có thể tìm hiểu thêm về cách thiết lập người dùng có các đặc quyền này trong hướng dẫn Thiết lập máy chủ ban đầu với Ubuntu 22.04 của chúng tôi.
  • Tùy chọn, máy chủ thứ hai mà bạn có thể kết nối với máy chủ đầu tiên của mình từ đó, bạn sẽ sử dụng máy chủ này để kiểm tra xem có bị cấm có chủ ý hay không.

Bước 1 - Cài đặt Fail2ban

Fail2ban có sẵn trong kho phần mềm của Ubuntu. Bắt đầu bằng cách chạy các lệnh sau với tư cách là non-root user để cập nhật danh sách gói của bạn và cài đặt Fail2ban:

  1. sudo apt update
  2. sudo apt install fail2ban

Fail2ban sẽ tự động thiết lập dịch vụ nền sau khi được cài đặt. Tuy nhiên, nó bị tắt theo mặc định vì một số cài đặt mặc định của nó có thể gây ra những tác dụng không mong muốn. Bạn có thể xác minh điều này bằng cách sử dụng lệnh systemctl:

  1. systemctl status fail2ban.service
Output
○ fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; disabled; vendor preset: enabled Active: inactive (dead) Docs: man:fail2ban(1)

Bạn có thể kích hoạt Fail2ban ngay lập tức, nhưng trước tiên, bạn sẽ xem lại một số tính năng của nó.

Bước 2 – Định cấu hình Fail2ban

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. Đi tới thư mục đó và in 20 dòng đầu tiên của tệp đó bằng head -20:

  1. cd /etc/fail2ban
  2. head -20 jail.conf
Output
# # WARNING: heavily refactored in 0.9.0 release. Please review and # customize settings for your setup. # # Changes: in most of the cases you should not modify this # file, but provide customizations in jail.local file, # or separate .conf files under jail.d/ directory, e.g.: # # HOW TO ACTIVATE JAILS: # # YOU SHOULD NOT MODIFY THIS FILE. # # It will probably be overwritten or improved in a distribution update. # # Provide customizations in a jail.local file or a jail.d/customisation.local. # For example to change the default bantime for all jails and to enable the # ssh-iptables jail the following (uncommented) would appear in the .local file. # See man 5 jail.conf for details. # # [DEFAULT]

Như bạn sẽ thấy, một số dòng đầu tiên của tệp này được nhận xét – chúng bắt đầu bằng ký tự # cho biết rằng chúng sẽ được đọc dưới dạng tài liệu thay vì dưới dạng cài đặt. Như bạn cũng thấy, những nhận xét này hướng dẫn bạn không được sửa đổi trực tiếp tệp này. Thay vào đó, bạn có hai tùy chọn: tạo hồ sơ riêng lẻ cho Fail2ban trong nhiều tệp trong thư mục jail.d/, hoặc tạo và thu thập tất cả cài đặt cục bộ của bạn trong tệp jail.local. Tệp jail.conf sẽ được cập nhật định kỳ khi Fail2ban được cập nhật và sẽ được sử dụng làm nguồn cài đặt mặc định mà bạn chưa tạo bất kỳ phần ghi đè nào.

Trong hướng dẫn này, bạn sẽ tạo jail.local. Bạn có thể làm điều đó bằng cách sao chép jail.conf:

  1. sudo cp jail.conf jail.local

Bây giờ bạn có thể bắt đầu thực hiện thay đổi cấu hình. Mở tệp bằng nano hoặc trình soạn thảo văn bản yêu thích của bạn:

  1. sudo nano jail.local

Trong khi bạn cuộn qua tệp, hướng dẫn này sẽ xem xét một số tùy chọn mà bạn có thể muốn cập nhật. Các cài đặt nằm trong phần [DEFAULT] gần đầu tệp sẽ được áp dụng cho tất cả các dịch vụ được Fail2ban hỗ trợ. Ở những nơi khác trong tệp, có các tiêu đề cho [sshd] và cho các dịch vụ khác, chứa các cài đặt dành riêng cho dịch vụ sẽ áp dụng thay vì các giá trị mặc định.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
bantime = 10m
. . .

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, thời gian này được đặt thành 10 phút.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

Hai tham số tiếp theo 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 5 lần không thành công trong khoảng thời gian 10 phút.

/etc/fail2ban/jail.local
[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

Nếu bạn cần nhận thông báo qua email khi Fail2ban thực hiện hành động, bạn nên đánh giá cài đặt destemail, sendernamemta. Tham số destemail đặt địa chỉ email sẽ nhận thông báo cấm. Tham số sendername đặt giá trị của trường “From” trong email. Tham số mta định cấu hình dịch vụ mail nào sẽ được sử dụng để gửi thư. Theo mặc định, đây là sendmail nhưng bạn có thể muốn sử dụng Postfix hoặc giải pháp thư khác.

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

Tham số này định cấu hình hành động mà Fail2ban thực hiện khi 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 là cập nhật cấu hình tường lửa của bạn để 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.

Có các tập lệnh action_ khác được cung cấp theo mặc định mà bạn có thể thay thế $(action_) bằng ở trên:

/etc/fail2ban/jail.local
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s
            %(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]

# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s
             %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]

# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
#
# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
# to the destemail.
action_xarf = %(action_)s
             xarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]

# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
# to the destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]
                %(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

Ví dụ: action_mw thực hiện hành động và gửi email, action_mwl thực hiện hành động, gửi email và bao gồm ghi nhật ký, và action_cf_mwl thực hiện tất cả những điều trên ngoài việc gửi bản cập nhật tới Cloudflare API được liên kết với tài khoản của bạn để cấm người vi phạm ở đó.

Cài đặt individual jail

Tiếp theo là 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 đề section, như [sshd].

Mỗi phần này cần được bật riêng lẻ bằng cách thêm dòng enabled = true bên dưới tiêu đề, cùng với các cài đặt khác của chúng.

/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. 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 thông thường (một cách viết tắt phổ biến để phân tích cú pháp văn bản) 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 filters 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 filters này đều có các phần thích hợp (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ụ: hãy tưởng tượng rằng bạn đ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 bạn đang gặp sự cố khi cố gắng đăng nhập. Bạn 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 phần có tên [nginx-http-auth] trong tệp /etc/fail2ban/jail.conf của bạn. Bạn chỉ cần thêm tham số enabled:

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

enabled = true
. . .

Khi bạn chỉnh sửa xong, hãy lưu và đóng tệp. Tại thời điểm này, bạn có thể kích hoạt dịch vụ Fail2ban của mình để dịch vụ này sẽ tự động chạy kể từ bây giờ. Đầu tiên, chạy systemctl enable:

  1. sudo systemctl enable fail2ban

Sau đó, khởi động thủ công lần đầu tiên với systemctl start:

  1. sudo systemctl start fail2ban

Bạn có thể xác minh rằng nó đang chạy với systemctl status:

  1. sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban Service
     Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>
     Active: active (running) since Mon 2022-06-27 19:25:15 UTC; 3s ago
       Docs: man:fail2ban(1)
   Main PID: 39396 (fail2ban-server)
      Tasks: 5 (limit: 1119)
     Memory: 12.9M
        CPU: 278ms
     CGroup: /system.slice/fail2ban.service
             └─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Jun 27 19:25:15 fail2ban22 systemd[1]: Started Fail2Ban Service.
Jun 27 19:25:15 fail2ban22 fail2ban-server[39396]: Server ready

Trong bước tiếp theo, bạn sẽ minh họa cách hoạt động của Fail2ban.

Bước 3 - Kiểm tra chính sách cấm (Tùy chọn)

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 trong tương lai, bạn có thể kiểm tra các quy tắc bằng cách cấm máy chủ thứ hai đó. 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. Bạn có thể thử kết nối bằng tên không tồn tại:

  1. ssh blah@your_server

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 số thời điểm, lỗi bạn nhận được sẽ thay đổi từ Permission denied thành Connection refused. Đ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, bạn có thể xem quy tắc mới bằng cách kiểm tra đầu ra iptables của mình. iptables là một lệnh để tương tác với các quy tắc tường lửa và cổng cấp thấp trên máy chủ của bạn. Nếu bạn làm theo hướng dẫn của CloudFly để thiết lập máy chủ ban đầu, bạn sẽ sử dụng ufw để quản lý các quy tắc tường lửa ở cấp cao hơn. Chạy iptables -S sẽ hiển thị cho bạn tất cả các quy tắc tường lửa mà ufw đã tạo:

  1. sudo iptables -S
Output
-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N f2b-sshd -N ufw-after-forward -N ufw-after-input -N ufw-after-logging-forward -N ufw-after-logging-input -N ufw-after-logging-output -N ufw-after-output -N ufw-before-forward -N ufw-before-input -N ufw-before-logging-forward -N ufw-before-logging-input -N ufw-before-logging-output …

Nếu bạn chuyển đầu ra của iptables -S sang grep để tìm kiếm trong các quy tắc đó cho chuỗi f2b, bạn có thể thấy các quy tắc đã được thêm vào bởi Fail2ban:

  1. sudo iptables -S | grep f2b
Output
-N f2b-sshd -A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd -A f2b-sshd -s 134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable -A f2b-sshd -j RETURN

Dòng chứa REJECT --reject-with icmp-port-unreachable sẽ được Fail2ban thêm vào và sẽ phản ánh địa chỉ IP của máy chủ thứ hai của bạn.

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 cho dịch vụ của mình. Fail2ban là một cách hữu ích để 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, bạn có thể đọc về Cách bảo vệ máy chủ Nginx bằng Fail2Ban trên Ubuntu 14.04 và Cách bảo vệ máy chủ Apache bằng Fail2Ban trên Ubuntu 14.04.

Join CloudFly's Telegram channel to receive more offers and never miss any promotions from CloudFly
Share

0 replies