---
title: "Cách bảo vệ máy chủ Nginx bằng Fail2Ban trên Ubuntu 22.04"
description: "Cách bảo vệ máy chủ Nginx bằng Fail2Ban trên Ubuntu 22.04"
url: https://cloudfly.vn/techblog/cach-bao-ve-may-chu-nginx-bang-fail2ban-tren-ubuntu-2204
image: https://media.cloudfly.vn/posts/techblog_PCtnC5w.jpg
---

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

## 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:
```command
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`:
```command
systemctl status fail2ban.service
```

```
[secondary_label 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`:
```command
cd /etc/fail2ban
head -20 jail.conf
```

```
[secondary_label 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`:
```command
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:
```command
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ó:
```nginx
[label /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:
```nginx
[label /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:
```nginx
[label /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”:
```nginx
[label /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:
```nginx
[label /etc/fail2ban/jail.local]
[DEFAULT]

. . .
destemail = <^>youraccount@email.com<^>
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.
```nginx
[label /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:
```nginx
[label /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_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ướ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:
```nginx
[label /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:
```command
ls /etc/fail2ban/filter.d
```

```
[secondary_label 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`:
```command
cat /etc/fail2ban/filter.d/nginx-http-auth.conf
```

```
[secondary_label 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`:
```command
sudo systemctl enable fail2ban
```

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

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

```
[secondary_label 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
```

<$>[note]
**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`:
```command
sudo fail2ban-client status
```

Bạn sẽ thấy danh sách các jails được kích hoạt:
```
[secondary_label 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`:
```command
sudo fail2ban-client status <^>nginx-http-auth<^>
```

```
[secondary_label 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](https://media.cloudfly.vn/posts/browser-timed-out.png)

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:
```command
sudo fail2ban-client status nginx-http-auth
```

```
[secondary_label 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:
```command
sudo iptables -S
```

```
[secondary_label 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:
```command
sudo iptables -S | grep f2b
```

```
[secondary_label 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:
```command
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` 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.
