Mục lục

Không có mục lục
Tham gia kênh Telegram của CloudFly để nhận thêm ưu đãi và không bỏ lỡ bất kỳ khuyến mãi nào từ CloudFly

Cách bảo vệ máy chủ Nginx bằng Fail2Ban trên Ubuntu 22.04

Ngày đăng: 3 tháng 5 năm 2024

Giới thiệu

Khi thiết lập một máy chủ web, thường sẽ có những phần của trang web mà bạn muốn hạn chế quyền truy cập. Các ứng dụng web thường cung cấp các phương thức xác thực và ủy quyền riêng, nhưng bản thân máy chủ web có thể được sử dụng để hạn chế quyền truy cập nếu những phương thức này không đầy đủ hoặc không khả dụng. Tuy nhiên, xác thực máy chủ web cũng thể hiện 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 giành quyền truy cập.

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 bạn xem lại nhật ký của bất kỳ trafficked web server, 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.

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 bất kỳ điểm cuối riêng tư nào, do đó không thể kết nối trực tiếp với các URL này từ internet bên ngoài mà không có cổng hoặc phần mềm trừu tượng bổ sung. 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ố quy trình 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ẽ tìm hiểu cách cài đặt fail2ban trên máy chủ Ubuntu 22.04 và định cấu hình nó để giám sát nhật ký Nginx của bạn để phát hiện các nỗ lực xâm nhập.

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

  • Truy cập vào môi trường máy chủ Ubuntu 22.04 với non-root user có đặc quyền sudo để thực hiện các tác vụ quản trị. Để tìm hiểu cách tạo người dùng như vậy, hãy làm theo hướng dẫn thiết lập máy chủ ban đầu Ubuntu 22.04.
  • Nginx được cài đặt trên hệ thống của bạn, làm theo Bước 1 và 2 của hướng dẫn cách cài đặt Nginx trên Ubuntu 22.04.
  • Nginx được cài đặt và định cấu hình xác thực mật khẩu theo Cách thiết lập xác thực mật khẩu với Nginx trên Ubuntu 22.04.

Bước 1 - Cài đặt và định cấu hình 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ó.

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 sẽ 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

Thay đổi mặc định

Bạn sẽ bắt đầu bằng cách đánh giá các giá trị mặc định được đặt trong tệp. Những thứ này sẽ được tìm thấy trong phần [DEFAULT] trong tệp. Các mục này đặt chính sách chung và có thể được ghi đè trên cơ sở mỗi ứng dụng. Nếu bạn đang sử dụng nano, bạn có thể tìm kiếm trong tệp bằng cách nhấn Ctrl+W, nhập chuỗi tìm kiếm, sau đó nhấn enter.

Một trong những mục đầu tiên cần xem xét là danh sách khách hàng không tuân theo chính sách fail2ban. Điều này được thiết lập bởi chỉ thị ignoreip. Đôi khi, bạn nên thêm địa chỉ IP hoặc mạng của riêng mình vào danh sách ngoại lệ để tránh bị khóa. Đây không phải là vấn đề xảy ra với thông tin đăng nhập máy chủ web so với SSH, vì nếu bạn có thể duy trì quyền truy cập shell, bạn luôn có thể đảo ngược lệnh cấm. Bạn có thể bỏ ghi chú dòng này và thêm các địa chỉ IP hoặc mạng bổ sung được phân cách bằng dấu cách vào danh sách hiện có:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
#ignoreip = 127.0.0.1/8 your_home_IP

Một mục khác mà bạn có thể muốn điều chỉnh là bantime, kiểm soát số giây mà thành viên vi phạm bị cấm. Lý tưởng nhất là bạn nên đặt khoảng thời gian này đủ dài để ngăn chặn các nỗ lực độc hại và tự động, đồng thời đủ ngắn để cho phép người dùng sửa lỗi. Theo mặc định, thời gian này được đặt thành 10 phút. Bạn có thể tăng hoặc giảm giá trị này:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
bantime = 10m

Hai mục tiếp theo xác định phạm vi dòng nhật ký được sử dụng để xác định khách hàng vi phạm. findtime chỉ định một khoảng thời gian tính bằng giây và chỉ thị maxretry cho biết số lần thử được chấp nhận trong thời gian đó. Nếu khách hàng thực hiện nhiều hơn maxretry lần thử trong khoảng thời gian do findtime đặt, họ sẽ bị cấm:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
findtime = 10m
maxretry = 5

Thiết lập thông báo qua thư (Tùy chọn)

Bạn có thể tùy chọn bật thông báo qua email để nhận thư bất cứ khi nào lệnh cấm diễn ra. Trước tiên, bạn sẽ phải thiết lập MTA trên máy chủ của mình để nó có thể gửi email. Để tìm hiểu cách sử dụng Postfix cho tác vụ này, hãy làm theo Cách cài đặt và định cấu hình Postfix trên Ubuntu 22.04.

Sau khi thiết lập MTA, bạn sẽ phải điều chỉnh một số cài đặt bổ sung trong phần [DEFAULT] của tệp /etc/fail2ban/jail.local. Bắt đầu bằng cách thiết lập chỉ thị mta. Nếu bạn thiết lập Postfix, như hướng dẫn ở trên minh họa, hãy thay đổi giá trị này thành “mail”:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
mta = mail

Cung cấp địa chỉ email sẽ nhận thư trong trường destemail. Tùy chọn sender định cấu hình địa chỉ mà thư sẽ được gửi từ đó và cần phải tương thích với cấu hình Postfix của bạn:

/etc/fail2ban/jail.local
[DEFAULT]

. . .
destemail = [email protected]
sendername = root@<fq-hostname>

Tham số action đị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.

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

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"]
…

Cả action_mwaction_mwl sẽ xử lý việc gửi email bằng cấu hình bạn cung cấp. Trong bước tiếp theo, bạn sẽ chuyển sang cấu hình dành riêng cho Nginx.

Bước 2 - Định cấu hình Fail2Ban để theo dõi nhật ký Nginx

Bây giờ bạn đã có sẵn một số cài đặt fail2ban chung, bạn có thể kích hoạt một số jail dành riêng cho Nginx để theo dõi nhật ký máy chủ web của bạn để tìm các mẫu cụ thể.

Mỗi jail trong tệp cấu hình được đánh dấu bằng tiêu đề chứa tên jail trong dấu ngoặc vuông - mọi phần trừ phần [DEFAULT] cho biết cấu hình của jail cụ thể. Theo mặc định, chỉ có [ssh] jail được bật.

Để bật giám sát nhật ký cho các lần đăng nhập Nginx, hãy bật jail [nginx-http-auth]. Thêm một lệnh enabled = true trong phần này:

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

enabled  = true
port     = http,https
logpath = %(nginx_error_log)s
. . .

Khi bạn hoàn tất việc sửa đổi, hãy lưu và đóng tệp. Nếu bạn đang sử dụng nano, hãy nhấn Ctrl+X, sau đó khi được nhắc, Y rồi Enter. Tiếp theo, bạn sẽ xem lại cấu hình bộ lọc (filter) cho nginx-http-auth.

Bước 3 – Xem lại bộ lọc cho Nginx Jails

Bạn có thể nhận thấy rằng [nginx-http-auth] block trong jail.local không chứa bất kỳ quy tắc nào dành riêng cho Nginx. Các quy tắc này không được mã hóa tự động bên trong Fail2ban - trên thực tế, tiêu đề [nginx-http-auth] tương ứng trực tiếp với tên tệp bên trong thư mục filter.d của Fail2ban chứa các bộ lọc được đóng gói sẵn. Nếu bạn liệt kê nội dung của thư mục này, bạn có thể thấy các bộ lọc đóng gói sẵn khác có sẵn, nếu bạn cần sử dụng chúng:

  1. ls /etc/fail2ban/filter.d
Output
3proxy.conf freeswitch.conf proftpd.conf apache-auth.conf froxlor-auth.conf pure-ftpd.conf apache-badbots.conf gitlab.conf qmail.conf apache-botsearch.conf grafana.conf recidive.conf apache-common.conf groupoffice.conf roundcube-auth.conf apache-fakegooglebot.conf gssftpd.conf scanlogd.conf apache-modsecurity.conf guacamole.conf screensharingd.conf apache-nohome.conf haproxy-http-auth.conf selinux-common.conf apache-noscript.conf horde.conf selinux-ssh.conf apache-overflows.conf ignorecommands sendmail-auth.conf apache-pass.conf kerio.conf sendmail-reject.conf apache-shellshock.conf lighttpd-auth.conf sieve.conf assp.conf mongodb-auth.conf slapd.conf asterisk.conf monit.conf softethervpn.conf bitwarden.conf murmur.conf sogo-auth.conf …

Hiện tại, hãy xem nginx-http-auth.conf:

  1. cat /etc/fail2ban/filter.d/nginx-http-auth.conf
Output
# fail2ban filter configuration for nginx [Definition] failregex = ^ \[error\] \d+#\d+: \*\d+ user "(?:[^"]+|.*?)":? (?:password mismatch|was not found in "[^\"]*"), client: <HOST>, server: \S*, request: "\S+ \S+ HTTP/\d+\.\d+", host: "\S+"(?:, referrer: "\S+")?\s*$ ignoreregex = datepattern = {^LN-BEG} …

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 có thể được sửa đổi trực tiếp khi cần thiết.

Trong các bước tiếp theo, bạn sẽ kích hoạt và kiểm tra Fail2ban.

Bước 4 – Kích hoạt Nginx Jails của bạn

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
Output
● fail2ban.service - Fail2Ban Service Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enabled Active: active (running) since Fri 2022-07-08 17:19:38 UTC; 7s ago Docs: man:fail2ban(1) Main PID: 5962 (fail2ban-server) Tasks: 7 (limit: 2327) Memory: 12.6M CPU: 195ms CGroup: /system.slice/fail2ban.service └─5962 /usr/bin/python3 /usr/bin/fail2ban-server -xf start

Lưu ý: Để thực hiện bất kỳ thay đổi cấu hình nào trong tương lai, bạn cần khởi động lại dịch vụ fail2ban. Bạn có thể làm điều đó bằng cách sử dụng sudo systemctl restart fail2ban.

Nhận thông tin về các jails đã kích hoạt

Bạn có thể xem tất cả các jails đã kích hoạt bằng cách sử dụng lệnh fail2ban-client:

  1. sudo fail2ban-client status

Bạn sẽ thấy danh sách các jails được kích hoạt:

Output
Status |- Number of jail: 2 `- Jail list: nginx-http-auth, sshd

Nếu bạn muốn xem chi tiết về các lệnh cấm được thực thi bởi bất kỳ jail nào, hãy sử dụng lại fail2ban-client:

  1. sudo fail2ban-client status nginx-http-auth
Output
Status for the jail: nginx-http-auth |- filter | |- File list: /var/log/nginx/error.log | |- Currently failed: 0 | `- Total failed: 0 `- action |- Currently banned: 0 | `- IP list: `- Total banned: 0

Ở bước cuối cùng của hướng dẫn này, bạn sẽ cố tình kiểm tra việc bị cấm để xác minh rằng cấu hình Fail2ban của bạn đang hoạt động.

Bước 5 – Kiểm tra chính sách Fail2Ban

Điều quan trọng là phải kiểm tra các chính sách Fail2ban của bạn để đảm bảo chúng chặn lưu lượng truy cập như mong đợi. Để thực hiện việc này, hãy điều hướng đến máy chủ của bạn trong trình duyệt web cục bộ. Tại dấu nhắc xác thực Nginx, liên tục nhập thông tin xác thực không chính xác. Sau vài lần thử, máy chủ sẽ ngừng phản hồi hoàn toàn cho bạn, như thể kết nối của bạn bị ngắt:

description image

Nếu nhìn vào trạng thái cấu hình nginx-http-auth với fail2ban-client, bạn sẽ thấy địa chỉ IP của mình bị cấm khỏi trang web:

  1. sudo fail2ban-client status nginx-http-auth
Output
Status for the jail: nginx-http-auth |- Filter | |- Currently failed: 0 | |- Total failed: 5 | `- File list: /var/log/nginx/error.log `- Actions |- Currently banned: 1 |- Total banned: 1 `- Banned IP list: 108.172.85.62

Bạn cũng 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-nginx-http-auth -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-nginx-http-auth -A INPUT -p tcp -m multiport --dports 80,443 -j f2b-nginx-http-auth -A f2b-nginx-http-auth -s 108.172.85.62/32 -j REJECT --reject-with icmp-port-unreachable -A f2b-nginx-http-auth -j RETURN

Dòng chứa REJECT --reject-with icmp-port-unreachable đã được Fail2ban thêm vào và sẽ phản ánh địa chỉ IP của máy cục bộ của bạn. Khi bạn hài lòng rằng các quy tắc của mình đang hoạt động, bạn có thể bỏ cấm địa chỉ IP của mình theo cách thủ công bằng fail2ban-client bằng cách nhập:

  1. sudo fail2ban-client set nginx-http-auth unbanip 108.172.85.62

Bây giờ bạn có thể thử xác thực lại.

Kết luận

Fail2ban cung cấp rất nhiều tính linh hoạt để xây dựng các chính sách phù hợp với nhu cầu bảo mật cụ thể của bạn. Bằng cách xem xét các biến và mẫu trong tệp /etc/fail2ban/jail.local, và các tệp mà nó phụ thuộc vào trong các thư mục /etc/fail2ban/filter.d/etc/fail2ban/action.d, bạn có thể tìm nhiều phần để điều chỉnh và thay đổi khi nhu cầu của bạn phát triển. Bảo vệ máy chủ của bạn bằng fail2ban có thể cung cấp cho bạn cơ sở bảo mật hữu ích.

Để khám phá thêm các cách sử dụng fail2ban, hãy xem Cách Fail2Ban hoạt động để bảo vệ dịch vụ trên máy chủ Linux và Cách bảo vệ SSH bằng Fail2Ban trên Ubuntu 22.04.

Tham gia kênh Telegram của CloudFly để nhận thêm ưu đãi và không bỏ lỡ bất kỳ khuyến mãi nào từ CloudFly
Chia sẻ

0 câu trả lời