Là công cụ xây dựng web server mạnh mẽ, được nhiều cá nhân và tổ chức tin dùng, bảo mật của Nginx luôn là một vấn đề quan trọng đáng được quan tâm. Qua bài viết dưới đây, hãy cùng Vietnix tham khảo cách sử dụng và cấu hình Fail2Ban để bảo mật Nginx trên Ubuntu 20.04.
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, Vietnix 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.
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ờ.
Để triển khai Fail2Ban trên Ubuntu, bạn cần phải sử dụng VPS để cài đặt và cấu hình. Để VPS vận hành ổn định, mượt mà và đạt hiệu quả tối đa thì tốc độ cũng là một yếu tố quan trọng mà bạn cần lưu tâm.
Vietnix hiện đang cung cấp nhiều gói dịch vụ VPS tốc độ cao với cấu hình đa dạng, mức phí phải chăng để phù hợp với nhu cầu của khách hàng như VPS Giá Rẻ, VPS Phổ Thông, VPS Cao Cấp và VPS NVMe.
Thuê VPS tại Vietnix, bạn sẽ được hỗ trợ từ những chuyên gia, giúp bạn tăng cường bảo mật hệ thống cũng như đảm bảo an toàn cho dữ liệu của mình.
Liên hệ ngay với Vietnix để được tư vấn chi tiết hơn.
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 là một nhà cung cấp VPS đáng tin cậy với tốc độ và chất lượng cao tại Việt Nam. Nếu bạn cần thuê VPS để triển khai cài đặt và cấu hình Fail2Ban bảo mật Nginx trên Ubuntu, hãy liên hệ với Vietnix để được tư vấn chọn gói dịch vụ phù hợp.
Không chỉ chú trọng vào chất lượng sản phẩm, Vietnix còn có dịch vụ hỗ trợ khách hàng tuyệt vời. Đến 97% khách hàng của Vietnix đều cảm thấy rất hài lòng với dịch vụ tại đây và thường giới thiệu cho người khác sử dụng.
Vietnix không ngừng cải tiến và nâng cao chất lượng để mang lại sự hài lòng cho khách hàng. Chính vì thế, Vietnix đã nhận được giải thưởng Thương hiệu Việt Nam xuất sắc năm 2022.
Liên hệ với Vietnix theo thông tin bên dưới để được hỗ trợ tư vấn và đăng ký VPS tốc độ cao ngay hôm nay.
- Đị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 – 07 088 44444
- Email: sales@vietnix.com.vn
Lời kết
Như vậy, các bạn đã biết được cách bảo mật server Nginx bằng Fail2ban trên Ubuntu 20.04. Hy vọng sau bài viết này, các bạn có thể nắm được cách cấu hình một số thiết lập bảo mật cơ bản với công cụ Fail2ban. Nếu có bất kỳ thắc mắc hay góp ý nào muốn chia sẻ, các bạn hãy để lại bình luận dưới bài viết để Vietnix phản hồi trong thời gian sớm nhất có thể.