Fail2Ban là một công cụ bảo mật quan trọng giúp bảo vệ máy chủ web Nginx khỏi các cuộc tấn công brute-force bằng cách theo dõi log và chặn IP của những kẻ tấn công. Việc thiết lập Fail2Ban giúp ngăn chặn tình trạng truy cập trái phép, đảm bảo an toàn và ổn định cho máy chủ. Trong bài viết này, mình sẽ hướng dẫn bạn cách bảo mật Nginx bằng Fail2Ban trên Ubuntu 20.04 chi tiết và đơn giản.
Những điểm chính
- Bảo mật máy chủ Nginx trên Ubuntu 20.04 bằng Fail2Ban giúp chống lại các cuộc tấn công brute-force, một giải pháp thay thế đơn giản hơn VPN, đặc biệt hữu ích cho các website vừa và nhỏ.
- Cần đăng nhập vào máy chủ Ubuntu 20.04 với quyền sudo và đảm bảo Nginx đã được cài đặt và cấu hình với xác thực mật khẩu.
- Hướng dẫn cách bảo mật Nginx bằng Fail2ban trên Ubuntu 20.04, bao gồm các bước cài đặt Fail2ban, cấu hình để theo dõi log Nginx, tạo filter, kích hoạt và kiểm tra hoạt động.
- Vietnix là nhà cung cấp VPS uy tín với hơn 12 năm kinh nghiệm, cung cấp dịch vụ VPS tốc độ cao, ổn định với chi phí hợp lý, hỗ trợ kỹ thuật 24/7 và đa dạng gói dịch vụ phù hợp với nhiều nhu cầu sử dụng.
Giới thiệu về bảo mật Nginx bằng Fail2Ban trên Ubuntu 20.04
Khi xây dựng web server, người dùng thường bị giới hạn truy cập đến một số khu vực của website. Việc xác thực và phân quyền hầu hết sẽ được thực hiện bởi các ứng dụng web. Tuy nhiên, nếu các phương thức này là chưa đủ hoặc không phù hợp, các bạn có thể giới hạn truy cập từ chính server.
Nếu kiểm tra log của những website có lưu lượng truy cập lớn, các bạn sẽ phát hiện rất nhiều lượt đăng nhập máy móc, lặp đi lặp lại. Đó là những đợt tấn công brute-force mà bot và người dùng gây ra. Dù là một phương pháp khá phổ biến, tất cả dịch vụ sử dụng internet đều có thể trở thành mục tiêu cho hình thức tấn công này.

Để tránh điều đó, các website lớn thường sử dụng những công cụ VPN, điển hình như WireGuard, nhằm ngăn người dùng truy cập trái phép đến các nội dung giới hạn. Tuy nhiên, áp dụng VPN không phải là vấn đề đơn giản. Ngoài ra, giải pháp này còn có thể làm ảnh hưởng đến một số chức năng như tự động hóa hoặc hook của các website có quy mô vừa và nhỏ.
Vì vậy, trước khi nghĩ đến việc cài đặt VPN, các bạn có thể sử dụng Fail2ban để giảm bớt đáng kể các cuộc tấn công brute-force. Bằng cách cấu hình cho tường lửa tự động chặn ID nếu đăng nhập thất bại nhiều hơn số lần quy định, Fail2ban sẽ giúp server của bạn được bảo vệ trước những đợt tấn công khó chịu này mà không cần can thiệp bởi bất kỳ ai.

Qua bài viết, mình sẽ hướng dẫn các bạn cách cài đặt fail2ban
, cũng như cấu hình để hỗ trợ giám sát Nginx trên Ubuntu 20.04 trước các cuộc tấn công brute-force.
Chuẩn bị
- Đăng nhập vào server Ubuntu 20.04 bằng một tài khoản non-root với đặc quyền
sudo
để thực hiện các tác vụ quản lý. - Cài đặt và cấu hình cho Nginx sử dụng mật khẩu xác minh.
Cách bảo mật Nginx bằng Fail2Ban trên Ubuntu 20.04
Bước 1: Cài đặt và cấu hình Fail2ban
Vì Fail2ban đã có sẵn trong repository
của Ubuntu, các bạn cập nhật danh sách các package ở local lên phiên bản mới nhất rồi tiến hành cài đặt.
$ sudo apt update
$ sudo apt install fail2ban
Sau khi cài đặt hoàn tất, Fail2ban sẽ tự động tạo một background service. Tuy nhiên, mặc định service này không được chạy vì một số thiết lập có thể gây ra những tác động không mong muốn. Các bạn gọi lệnh sau để kiểm tra.
$ 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)
Thay vì ngay lập tức chạy Fail2ban, hãy cùng xem qua một số đặc trưng của công cụ này.
File cấu hình của Fail2ban được lưu trữ trong thư mục /etc/fail2ban
. Để mở file jail.conf
và hiển thị 20 dòng đầu tiên, các bạn nhập lệnh:
$ cd /etc/fail2ban
$ 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]
Có thể thấy, mặc định cả 20 dòng đều được comment (bắt đầu bằng ký tự #
). Những dòng này không dùng để thiết lập cấu hình mà là tài liệu hướng dẫn. Từ nội dung, các bạn được khuyến cáo không nên trực tiếp chỉnh sửa file jail.conf
. Thay vào đó, các bạn có hai lựa chọn: một là tạo riêng lẻ các file cấu hình Fail2ban vào thư mục jail.d/
, hai là tạo một file jail.local
và tập trung toàn bộ tùy chỉnh thiết lập vào file ấy. File jail.conf
sẽ được cập nhật định kỳ theo Fail2ban và dùng làm mặc định cho các thiết lập không được thay đổi còn lại.
Trong bài hướng dẫn này, Vietnix sẽ chọn cách cấu hình bằng file jail.local
. Các bạn có thể tạo jail.local
từ jail.conf
bằng lệnh copy sau.
$ sudo cp jail.conf jail.local
Đến đây, bạn có thể mở file với nano hoặc trình biên dịch yêu thích của mình và bắt đầu tùy chỉnh cấu hình cho phù hợp.
$ sudo nano jail.local
Tùy chỉnh DEFAULT
Bắt đầu với các thiết lập trong mục [DEFAULT]
. Những tham số này quy định các thiết lập chung tùy theo ứng dụng.
Đầu tiên, các bạn cần chú ý đến những client không bị ảnh hưởng bởi Fail2ban. ignoreip
là tham số quyết định. Để thêm một IP, các bạn bỏ comment dòng lệnh và nhập địa chỉ mới vào sau danh sách cũ, cách phần tử cuối cùng một khoảng trắng.
[DEFAULT]
. . .
#ignoreip = 127.0.0.1/8 your_home_IP
Đôi khi, để tránh bản thân bị chặn, bạn có thể thêm IP chính mình vào danh sách các địa chỉ của ignoreip
. Tuy nhiên, trường hợp này nghiêng về SSH hơn là bảo mật đăng nhập của web server. Lý do là vì bạn luôn có thể truy cập vào shell để rút lại lệnh chặn.
Một tham số khác có thể tùy chỉnh là bantime
. Tham số này quy định khoảng thời gian chặn một client có dấu hiệu tấn công. Các bạn nên đặt thời gian đủ lâu để ngắt các đợt tấn công tự động, đồng thời đủ ngắn để cho phép người dùng có thể thử lại trong trường hợp nhập liệu sai. Giá trị mặc định của bantime
là mười phút. Tùy nhu cầu sử dụng, các bạn có thể tăng hoặc giảm giá trị này.
[DEFAULT]
. . .
bantime = 10m
Hai tham số tiếp theo quy định phạm vi log dùng để xác định dấu hiệu tấn công từ client. Tham số findtime
quy định thời gian và tham số maxretry
giới hạn số lần đăng nhập trong khoảng thời gian đó. Client sẽ bị chặn nếu đăng nhập thất bại nhiều lần trong khoảng thời gian đã quy định.
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
Cấu hình Mail Notification (tùy chọn)
Nếu chọn kích hoạt email notification, bạn sẽ nhận được email thông báo mỗi khi có một client bị chặn bởi server. Đầu tiên, bạn cần thiết lập một MTA (Metropolitan Transportation Authority) trên server để hỗ trợ gửi email. Sau khi cấu hình xong MTA, các bạn tiếp tục tùy chỉnh một số cài đặt trong mục [DEFAULT]
của file jail.local
.
Bắt đầu với mta
, nếu đã cấu hình Postfix, các bạn thay đổi giá trị của mta
thành “mail” như bên dưới.
[DEFAULT]
. . .
mta = mail
Tham số sendername
cấu hình địa chỉ gửi thông báo (phù hợp với Postfix). Địa chỉ email nhận thông báo sẽ được cung cấp cho tham số destemail
.
[DEFAULT]
. . .
destemail = youraccount@email.com
sendername = root@<fq-hostname>
Tham số action
quy định hành vi mà Fail2ban sẽ thực hiện khi chặn một client. Giá trị action_
sẽ được định nghĩa trước tham số này một chút. Mặc định, Fail2ban sẽ cấu hình lại tường lửa để chặn truy cập từ host tấn công đến khi kết thúc thời gian chặn.
[DEFAULT]
. . .
action = $(action_)s
. . .
Ngoài ra, bạn có thể thay thế action_
bằng một số script dưới đây được cung cấp sẵn bởi Fail2ban.
…
# 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_mw
và action_mwl
đều là các action thực hiện gửi email thông báo theo cấu hình mà bạn thiết lập. Bước tiếp theo, các bạn sẽ tiến hành cấu hình Nginx.
Để đảm bảo an toàn cho dữ liệu và tránh các cuộc tấn công độc hại khi triển khai Nginx trên Ubuntu, việc bảo mật hệ thống là rất quan trọng. Trong đó, Fail2Ban là công cụ bảo mật phổ biến giúp giám sát các file nhật ký của Nginx và chặn các cuộc tấn công từ các địa chỉ IP đáng ngờ.
Bước 2: Cấu hình Fail2ban để theo dõi Nginx logs
Sau khi hoàn tất cấu hình một số cài đặt chung của fail2ban
, các bạn sẽ kích hoạt các jail của Nginx để theo dõi server log theo vài thiết lập nhất định.
Mỗi jail trong file cấu hình được đánh dấu bởi một header chứa tên jail trong ngoặc vuông (trừ [DEFAULT]
, tất cả các mục đều tương ứng với một jail). Mặc định, chỉ có jail [ssh]
được kích hoạt.
Để bật theo dõi Nginx log cho các phiên đăng nhập, các bạn kích hoạt jail [nginx-http-auth]
bằng cách thêm tham số enable = true
vào jail này.
…
[nginx-http-auth]
enabled = true
port = http,https
logpath = %(nginx_error_log)s
. . .
Đóng và lưu file để cập nhật các thay đổi. Tiếp theo, Vietnix sẽ hướng dẫn các bạn cấu hình filter cho nginx-http-auth
.
Bước 3: Cấu hình filter cho jail Nginx
Có thể bạn đã nhận ra, block [nginx-http-auth]
trong jail.local
không chứa bất cứ cấu hình nào liên quan đến Nginx. Thực tế, các cài đặt này không được hardcode trong Fail2ban. Thay vào đó, header [nginx-http-auth]
sẽ tương ứng với một file trong thư mục filter.d
. Đây là thư mục Fail2ban chứa các filter được đóng gói sẵn. Các bạn có thể liệt kê các filter trong thư mục này bằng lệnh sau.
$ 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
…
Bài viết này sẽ chỉ sử dụng file nginx-http-auth.conf
.
$ 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 regex trong filter có thể trực tiếp tùy chỉnh khi cần thiết. Fail2ban sẽ dựa vào các regex này để nhận biết một dòng log có phải là một hành động đăng nhập thất bại hay không.
Bước tiếp theo, các bạn tiến hành chạy thử Fail2ban.
Bước 4: Kích hoạt jail Nginx
Đến đây, service Fail2ban đã có khả năng hoạt động. Các bạn nhập lệnh sau để kích hoạt.
$ sudo systemctl enable fail2ban
Với lần đầu tiên, Fail2ban cần được chạy thủ công.
$ sudo systemctl start fail2ban
Ở những lần tiếp theo, service sẽ tự chạy mà không cần khởi động. Để kiểm tra tiến trình, các bạn gọi lệnh systemctl status
bên dưới.
$ 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 ý: fail2ban
cần phải khởi động lại để thay đổi cấu hình trong tương lai. Bạn có thể sử dụng lệnh sudo systemctl restart fail2ban
để tái khởi động service.
Để xem toàn bộ jail đang bật, các bạn sử dụng lệnh fail2ban-client
.
$ sudo fail2ban-client status
Output
Status
|- Number of jail: 2
`- Jail list: nginx-http-auth, sshd
Bổ sung lệnh fail2ban-client như sau để xem chi tiết các lượt chặn của một jail.
$ 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 bài hướng dẫn, các bạn sẽ tự chặn bản thân để xác nhận Fail2ban đã hoạt động.
Bước 5: Kiểm thử Fail2ban
Nhằm đảm bảo Fail2ban đã bảo mật đúng cách, việc kiểm thử là vô cùng quan trọng. Để thực hiện, các bạn truy cập server từ một trình duyệt trong máy. Khi biểu mẫu xác thực của Nginx xuất hiện, hãy liên tục nhập thông tin xác thực sai. Sau nhiều lần thử, nếu kết nối bị ngắt và server hoàn toàn ngưng tương tác với bạn nghĩa là bạn đã thành công cấu hình bảo mật.
Nếu kiểm tra trạng thái cấu hình của nginx-http-auth
với fail2ban-client
, bạn sẽ thấy địa chỉ IP của mình đã bị chặn truy cập.
$ 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
Các bạn có thể tham khảo thêm một số thiết lập khác bằng cách kiểm tra iptables
. iptables
là lệnh tương tác với các cấu hình tường lửa và low-level port của server. Nếu sử dụng ufw
để cấu hình tường lửa khi cài đặt server, lệnh iptables -S
sẽ hiển thị toàn bộ các thiết lập của tường lửa được tạo bởi ufw
.
$ 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 sử dụng grep tìm chuỗi ký tự f2b
trong danh sách trên, bạn sẽ tìm thấy những thiết lập mới thêm bởi Fail2ban được hiển thị.
$ 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
Để tìm địa chỉ IP của mình, các bạn tìm dòng có chuỗi ký tự REJECT --reject-with icmp-port-unreachable
, sau đó gọi lệnh fail2ban-client
dưới đây để bỏ chặn IP.
$ sudo fail2ban-client set nginx-http-auth unbanip 108.172.85.62
Sau khi hoàn tất, các bạn có thể đăng nhập lại như bình thường.
Fail2ban vô cùng linh hoạt trong việc thiết lập các cấu hình phù hợp với nhu cầu bảo mật cụ thể của server. Để tìm hiểu thêm, các bạn có thể xem qua các tham số và cấu hình khác trong file /etc/fail2ban/jail.local
, các file trong thư mục /etc/fail2ban/filter.d
, hoặc thư mục /etc/fail2ban/action.d
.
Vietnix: Nhà cung cấp dịch vụ VPS tốc độ cao, uy tín
Vietnix với bề dày kinh nghiệm trên 12 năm trong ngành dịch vụ máy chủ ảo (VPS), đã xây dựng danh tiếng vững chắc như một đối tác uy tín hàng đầu cho hàng chục nghìn khách hàng, từ cá nhân đến các tổ chức doanh nghiệp. Vietnix tự hào mang đến các gói dịch vụ VPS với chi phí hợp lý, tốc độ truy xuất nhanh chóng, và khả năng vận hành ổn định vượt trội.
Hiện tại Vietnix đang cung cấp nhiều gói dịch vụ máy chủ ảo VPS SSD, VPS AMD,… tiên tiến với bảo hiệu năng mạnh mẽ phù hợp với đa dạng mục đích sử dụng. Từ việc thiết lập website cá nhân, các ứng dụng web phức tạp, cho đến những dự án đòi hỏi cấu hình máy chủ cao, Vietnix đều có thể đáp ứng. Bên cạnh đó, Vietnix còn hỗ trợ sự đa dạng về hệ điều hành, đảm bảo mang đến giải pháp tối ưu nhất cho việc vận hành hệ thống của bạn một cách hiệu quả.
Thông tin liên hệ:
- Địa chỉ: 265 Hồng Lạc, Phường 10, Quận Tân Bình, Thành Phố Hồ Chí Minh
- Hotline: 1800 1093
- Email: sales@vietnix.com.vn
- Website: https://vietnix.vn/
Việc bảo mật Nginx bằng Fail2Ban trên Ubuntu 20.04 giúp ngăn chặn hiệu quả các cuộc tấn công brute-force, đảm bảo an toàn và ổn định cho máy chủ web của bạn. Hy vọng hướng dẫn cách bảo mật Nginx bằng Fail2Ban trên Ubuntu 20.04, đã giúp bạn hiểu rõ cách cài đặt và cấu hình Fail2Ban để bảo vệ Nginx tốt hơn. Nếu bạn có bất kỳ câu hỏi hoặc góp ý nào, xin vui lòng để lại bình luận bên dưới.