Ngày đăng: 3 tháng 5 năm 2024
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.
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.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:
- sudo apt update
- 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
:
- 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
:
- 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]
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
:
- 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:
- sudo nano jail.local
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ó:
[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:
[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:
[DEFAULT]
. . .
findtime = 10m
maxretry = 5
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”:
[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:
[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.
[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:
…
# 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
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â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:
…
[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ạ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:
- ls /etc/fail2ban/filter.d
Output3proxy.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
:
- 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.
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
:
- sudo systemctl enable fail2ban
Sau đó, khởi động thủ công lần đầu tiên với systemctl start
:
- sudo systemctl start fail2ban
Bạn có thể xác minh rằng nó đang chạy với systemctl status
:
- 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
.
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
:
- sudo fail2ban-client status
Bạn sẽ thấy danh sách các jails được kích hoạt:
OutputStatus
|- 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
:
- sudo fail2ban-client status nginx-http-auth
OutputStatus 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.
Đ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:
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:
- sudo fail2ban-client status nginx-http-auth
OutputStatus 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:
- 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:
- 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:
- 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.
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
và /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.