Fail2ban Docker: bảo mật tăng cường
Bảo mật luôn làm các bạn lo lắng khi tự triển khai web server. Với EasyEngine, đây là một việc nhẹ nhõm hơn nhiều vì bản thân Docker cách ly rất tốt, phần mềm luôn mới vì dễ cập nhật, nên bản thân nó đã là một hệ thống an toàn.
EasyEngine cũng đã thiết lập một số bảo mật, như thiết lập time-request-limit
với wp-login.php
để tránh tấn công brute-force.
Nhưng có nhiều trường hợp bạn muốn bảo vệ hoặc giảm tải server, bạn sẽ cần dùng Fail2Ban, phần mềm “mặc định” cho việc bảo vệ server. Và qua đây, bạn sẽ học cách tự triển khai phần mềm trên hệ thống server Docker hóa.
Hướng dẫn này mặc định là bạn chạy Debian 12, với tường lửa mặc định nftables
.
Fail2Ban là gì
Fail2Ban là một công cụ bảo mật giúp bảo vệ hệ thống Linux khỏi các cuộc tấn công brute-force hoặc truy cập trái phép thông qua việc phân tích các log file và chặn địa chỉ IP đáng ngờ. Khi được sử dụng cùng Docker, Fail2Ban có thể bảo vệ cả server (Debian) và các container Docker đang chạy trên nó.
Fail2Ban hoạt động dựa trên ba bước chính:
- Giám sát nhật ký: Công cụ quét các tệp nhật ký của hệ thống hoặc dịch vụ (ví dụ: nhật ký SSH, web server) để tìm các mẫu (patterns) (dựa theo filter) cho thấy hành vi bất thường, chẳng hạn như nhiều lần đăng nhập thất bại từ một địa chỉ IP.
- Phát hiện vi phạm: Khi số lần thất bại vượt quá ngưỡng được định nghĩa trước trong một khoảng thời gian cụ thể (ví dụ: 5 lần thất bại trong 10 phút), Fail2Ban xác định đó là hành vi đáng ngờ.
- Áp dụng quy tắc cấm: Fail2Ban sau đó thêm quy tắc vào nftables để chặn địa chỉ IP đó trong một khoảng thời gian nhất định. Đối với container Docker, quy tắc này được thêm vào chuỗi
DOCKER-USER
của nftables, đảm bảo rằng lưu lượng từ IP bị chặn không thể đến container.
Hoạt động của Fail2Ban dựa trên ba thành phần chính: Jail, Filter và Action:
- Jail: Jail trong Fail2Ban là nơi định nghĩa dịch vụ cần bảo vệ. Mỗi jail sẽ liên kết với một filter để xác định hành vi đáng ngờ và một action để quyết định cách xử lý. Ngoài ra, jail cũng chỉ định logfile mà Fail2Ban cần giám sát để phát hiện các hành vi vi phạm.
- Filter: Filter chứa các biểu thức chính quy (regex) giúp phân tích logfile và phát hiện các yêu cầu hoặc hành động bất thường. Khi một mục nhập trong logfile khớp với regex trong filter, Fail2Ban sẽ xem đó là một hành vi vi phạm và báo cho jail xử lý.
- Action: Action xác định cách Fail2Ban phản ứng khi phát hiện vi phạm. Các hành động phổ biến bao gồm chặn IP bằng iptables hoặc nftables, ghi log cảnh báo hoặc gửi email thông báo. Action giúp ngăn chặn các cuộc tấn công tiếp diễn và bảo vệ hệ thống hiệu quả.
Cài đặt Fail2Ban với Docker
Nguyên tắc Docker hóa là can thiệp cực kỳ tối thiểu vào server host, tất cả đều được chạy trong container. Và ở đây, chúng ta cũng làm như vậy khi cài đặt Fail2Ban trong container, và image được chọn là crazymax/fail2ban
.
Các bước tiến hành:
- Chuẩn bị file
docker-compose.yml
,.env
: chỉ thị cách Docker vận hành. - Thiết lập jail, action, filter.
- Chạy Fail2Ban với Docker.
Tạo thư mục và file xây dựng docker fail2ban
Lập thư mục chứa Fail2Ban Docker, tạo file docker-compose.yml
, file chỉ thị cho Docker xây dựng Fail2Ban container:
# Tạo các thư mục cura fail2ban
mkdir -p /opt/fail2ban/data/{action.d,filter.d,jail.d,db}
# Downaload docker-compose.yml, .env
curl -o /opt/fail2ban/docker-compose.yml -L https://raw.githubusercontent.com/dinhngocdung/easyengine-docker-stack/refs/heads/main/fail2ban/docker-compose.yml
curl -o /opt/fail2ban/.env -L https://raw.githubusercontent.com/dinhngocdung/easyengine-docker-stack/refs/heads/main/fail2ban/.env
Áp dụng Jail, filter, action
Triển khai bảo vệ 2 vị trí dễ tổng thương nhất của webserver: ssh và wp-login
curl -o /opt/fail2ban/data/filter.d/sshd.local -L https://raw.githubusercontent.com/dinhngocdung/easyengine-docker-stack/refs/heads/main/fail2ban/filter.d/sshd.local
curl -o /opt/fail2ban/data/filter.d/wp-login-fail.conf -L https://raw.githubusercontent.com/dinhngocdung/easyengine-docker-stack/refs/heads/main/fail2ban/filter.d/wp-login-fail.conf
curl -o /opt/fail2ban/data/jail.d/jail.local -L https://raw.githubusercontent.com/dinhngocdung/easyengine-docker-stack/refs/heads/main/fail2ban/jail.d/jail.local
Tip
Đặc biệt chú ý cài đặt chain = DOCKER-USER
, Fail2Ban sẽ chèn lệnh cấm vào chain này để có tác dụng trong hệ thống Docker hóa.
Nếu có sử dụng Cloudflare, và muốn cấm ngay tại Cloudflare WAF, cần bổ xung thêm action cloudflare:
curl -o /opt/fail2ban/data/jail.d/jail-cloudflare.local -L https://raw.githubusercontent.com/dinhngocdung/easyengine-docker-stack/refs/heads/main/fail2ban/jail.d/jail-cloudflare.local
# Hãy thay đổi chính xác cfzone và cftoken của bạn
vi /opt/fail2ban/data/jail.d/jail-cloudflare.local
Vận hành Fail2Ban Docker
Như vậy, với các file đã chuẩn bị, chúng ta đã sẵn sàng vận hành Fail2Ban Docker.
/opt/fail2ban/
├── docker-compose.yml
├── .env
└── data/
├── jail.d/
│ └── jail.local
└── filter.d/
├── sshd.local
└── wp-login-fail.conf
Chạy Fail2Ban Docker
Đảm bảo bạn đang ở trong thư mục /opt/fail2ban
để chạy các lệnh docker compose
:
cd /opt/fail2ban
Chạy Fail2Ban Docker:
# Chạy nền Fail2Ban Docker
sudo docker compose up -d
Xem nhật ký hoạt động Fail2Ban
sudo docker compose logs -f
Xem các IP đang bị chặn trên tất cả các jail
sudo docker compose exec fail2ban fail2ban-client status --all
Unban một IP
Đôi khi Fail2Ban chặn nhầm, ví dụ: unban IP 123.123.123.123
trong jail wp-login-fail
:
sudo docker compose exec fail2ban fail2ban-client set nginx-errors unbanip 123.123.123.123
Whitelist
Đôi khi, các jail khắt khe từ Fail2Ban sẽ chặn các truy xuất quan trọng từ bot của Google, ChatGPT và Facebook. Giải pháp của chúng ta là đưa các IP được công bố của Google, ChatGPT, Facebook… và tất cả các dịch vụ cần thiết cho website của bạn vào whitelist của Fail2Ban.
Whitelist Fail2Ban được tạo bằng cách đưa các IP vào ignoreip
trong phần [DEFAULT]
của file jail.local
. Đownload file sẵn có của tôi, và chỉnh sửa theo nhu cầu
curl -o ./data/jail.d/jail-whitelist.local -L https://raw.githubusercontent.com/dinhngocdung/easyengine-docker-stack/refs/heads/main/fail2ban/jail.d/jail-whitelist.local
Dưới đây là danh sách các IP mà tôi khuyến khích thêm vào whitelist:
- IP Home: 123.123.123.123
- IP Server Internal: 127.0.0.1/8 ::1
- IP Services Global-Nginx-Proxy_1: 10.1.0.3
- IP Cloudflare
- IP Google Bot
- IP Google Special-Crawlers
- IP Google User-Triggered-Fetchers
- IP Google Other
- IP Commoncrawl.org
- IP Bing Bot
- IP ChatGPT Bot