Fail2ban cho Linux Server: cách tự động chặn brute-force dựa trên log

Fail2ban cho Linux Server: cấu hình jail, filter, bantime/findtime/maxretry, kiểm tra log backend, firewall action, false positive và unban/rollback.

Fail2ban Linux Server - chặn brute-force dựa trên log

Fail2ban là công cụ đọc log, phát hiện pattern thất bại lặp lại và thực hiện action như tạm chặn IP thông qua firewall. Nó đặc biệt hữu ích với SSH và một số service có log authentication rõ ràng. Nhưng Fail2ban không thay thế SSH hardening, firewall policy, MFA, patching hay rate limiting ở application layer.

Fail2ban upstream mô tả cơ chế cốt lõi là đọc log chứa password failure, rồi ban IP tương ứng bằng firewall rules. Vì vậy chất lượng của control phụ thuộc ba thứ: log đúng, filter đúng và action đúng. Nếu log path/backend sai hoặc regex match nhầm, Fail2ban có thể không chặn gì — hoặc chặn nhầm traffic hợp lệ.

Threat model và kiến trúc Fail2ban

Fail2ban phù hợp với threat nào?

Fail2ban hiệu quả nhất với hành vi lặp lại có thể quan sát trong log, ví dụ:

  • SSH password failure lặp lại.
  • Login failure trên service có filter phù hợp.
  • Authentication abuse từ cùng source trong khoảng thời gian ngắn.
  • Một số request pattern được log rõ và có false-positive rate thấp.

Nó kém phù hợp hơn với distributed botnet, low-and-slow attack, credential stuffing qua nhiều IP hoặc exploit không tạo log pattern tương ứng. Một IP bị ban cũng không chứng minh attacker đã bị “loại bỏ”; nó chỉ giảm traffic từ source đó trong một khoảng thời gian.

Fail2ban không thay SSH Hardening

Nếu SSH đang cho password login từ toàn Internet, Fail2ban chỉ giảm một phần brute-force noise. Control mạnh hơn vẫn là key-based authentication, account định danh, root policy và giới hạn network source. Xem SSH Hardening trước khi coi Fail2ban là lớp chính.

Tương tự, nếu một service không cần public thì nên xử lý firewall/exposure trước. Fail2ban không phải lý do để giữ một admin port mở Internet.

Fail2ban hoạt động qua jail, filter và action

Thành phần Vai trò
Jail Kết hợp filter, log backend/path, threshold và action cho một service
Filter Regex/pattern xác định event thất bại trong log
Action Thực hiện ban/unban qua firewall hoặc action khác
Backend Cách đọc log: file, systemd journal hoặc cơ chế phù hợp
Database Lưu history tùy cấu hình để hỗ trợ trạng thái ban

Trước khi bật jail, cần biết distro/package đã cung cấp filter nào và log source thực tế của service nằm ở đâu.

Cấu hình và triển khai jail

Bước 1: Cài từ package source đáng tin cậy

Ưu tiên package repository của distro nếu phù hợp với support model. Sau cài đặt:

fail2ban-client --version
sudo fail2ban-client -t

fail2ban-client -t kiểm tra configuration. Đây là gate cần chạy trước reload/restart sau khi sửa jail.

Bước 2: Không sửa trực tiếp jail.conf nếu có thể

Cách vận hành phổ biến là giữ file package mặc định và đặt override trong jail.local hoặc file dưới jail.d/. Lý do là file mặc định có thể thay đổi khi package upgrade.

Ví dụ cấu trúc đơn giản:

[DEFAULT]
bantime = 10m
findtime = 10m
maxretry = 5

[sshd]
enabled = true

Đây chỉ là ví dụ, không phải giá trị “chuẩn” cho mọi server. Threshold phải phản ánh user behavior, exposure và operational tolerance.

Bước 3: Xác định đúng log backend

Trên systemd-based distro, SSH event có thể nằm trong journal; ở môi trường khác có thể dùng file như /var/log/auth.log hoặc /var/log/secure. Fail2ban có backend phù hợp cho nhiều trường hợp.

Trước khi bật jail, cần chứng minh login failure thực sự xuất hiện trong nguồn log mà Fail2ban đang đọc. Nếu log không có event, jail sẽ “hoạt động” về mặt process nhưng không tạo detection.

Bước 4: Bật SSH jail có kiểm soát

Ví dụ:

[sshd]
enabled = true
maxretry = 5
findtime = 10m
bantime = 30m

Không nên chọn bantime rất dài chỉ để “an toàn hơn”. Nếu false positive xảy ra, chính admin có thể bị khóa. Với environment nhiều NAT/proxy/shared egress, một IP có thể đại diện cho nhiều user hợp lệ.

Bước 5: Thiết kế ignoreip cực kỳ thận trọng

ignoreip có thể dùng để không ban localhost hoặc network quản trị tin cậy. Nhưng allowlist quá rộng sẽ tạo blind spot. Không thêm toàn bộ office/VPN CIDR nếu source đó vẫn có risk credential compromise mà không có compensating control.

Với IP động, đừng dùng DNS hostname trong ignore path chỉ vì tiện nếu bạn chưa hiểu cơ chế resolution và lifecycle. Cách an toàn hơn là quản lý source network rõ ràng ở firewall/bastion layer.

Bước 6: Validate filter trước production

Custom filter là nơi dễ tạo false positive. Nếu viết regex riêng, hãy test trên sample log có cả event đúng và event hợp lệ.

Tùy package, fail2ban-regex có thể dùng để kiểm tra filter:

fail2ban-regex /path/to/sample.log /etc/fail2ban/filter.d/example.conf

Không test bằng cách cố tình brute-force production account nếu không cần. Sample log hoặc controlled lab an toàn hơn.

Bước 7: Read-back trạng thái Fail2ban

Sau khi config test PASS và service được reload/start, dùng:

sudo fail2ban-client ping
sudo fail2ban-client status
sudo fail2ban-client status sshd

Upstream fail2ban-client hỗ trợ các lệnh status cho server và jail. Output cần xác nhận jail đã active, log/backend đúng và số match/ban có ý nghĩa.

Bước 8: Xác minh firewall action

Fail2ban có thể gọi action tương ứng với firewall stack. Nhưng đừng giả định tên action đang dùng chỉ từ distro. Hãy read configuration và observed firewall state.

Nếu server dùng UFW/nftables, Fail2ban action phải tương thích với source of truth hiện tại. Tránh tình huống automation firewall flush rule khiến ban mất hoặc Fail2ban thêm rule vào chain không còn được dùng.

Xem Linux Firewall cho Web Server để thiết kế inbound policy nền trước.

Vận hành, false positive và giới hạn của Fail2ban

Fail2ban có thể tự unban không?

Có. Ban thường có thời hạn theo bantime. Fail2ban client cũng có lệnh unban. Điều quan trọng là có runbook khi admin/user hợp lệ bị ban nhầm:

sudo fail2ban-client status sshd
sudo fail2ban-client unban 203.0.113.10

IP trên chỉ là ví dụ tài liệu. Trước khi unban cần xác minh đó là source hợp lệ và tìm nguyên nhân tại sao filter ban nó.

Recidive và ban tăng dần có nên dùng?

Một số cấu hình hỗ trợ ban tăng dần hoặc jail theo history. Các tính năng này có thể hữu ích với source lặp lại, nhưng làm tăng cost của false positive và complexity. Chỉ dùng khi team hiểu database/history behavior, retention và cách rollback.

Fail2ban với reverse proxy/CDN cần chú ý gì?

Với web service sau reverse proxy/CDN, application/web server log có thể thấy IP proxy thay vì client IP nếu real-IP handling chưa đúng. Nếu filter ban theo sai field, bạn có thể ban CDN edge hoặc proxy dùng chung.

Trước khi áp Fail2ban cho HTTP:

  1. Xác minh client IP chain.
  2. Chỉ trust proxy source đúng.
  3. Xác minh log format.
  4. Test filter trên sample log.
  5. Đánh giá shared-IP/NAT false-positive risk.

Đây là lý do Fail2ban thường đơn giản hơn với SSH trực tiếp so với application traffic qua nhiều proxy layer.

Fail2ban không phải DDoS protection

Fail2ban phản ứng sau khi event đã được log và chủ yếu ban theo source. Với volumetric DDoS hoặc botnet phân tán, host có thể quá tải trước khi Fail2ban tạo hiệu quả. DDoS cần network/CDN/WAF/upstream controls phù hợp.

Monitoring Fail2ban nên ghi gì?

Không cần alert mọi ban. Nên tập trung vào signal có thể hành động:

  • Jail stopped hoặc Fail2ban process down.
  • Log backend/path không còn match event.
  • Ban rate tăng bất thường.
  • Admin source bị ban.
  • Firewall action failure.
  • Config test fail sau deploy.

Ban count cao có thể chỉ là Internet noise. KPI tốt hơn là control health + false-positive rate + authentication posture.

Mẫu Fail2ban Jail Review Record

Đây là template evidence, không phải trạng thái Fail2ban thực tế của SecureWebOps.

Jail Log/backend Filter Threshold Action Owner Validation
sshd Journal/file observed Package filter findtime/maxretry/bantime Firewall action Platform PASS/FAIL
Web login Web/app log Custom/vendor Based on false-positive testing Firewall/WAF action App/Security PASS/FAIL

Workflow triển khai Fail2ban an toàn

  1. Harden authentication và firewall nền trước.
  2. Inventory log source và event format.
  3. Cài package từ source phù hợp.
  4. Không sửa package defaults trực tiếp nếu override mechanism có sẵn.
  5. Bật một jail trước, ưu tiên SSH nếu relevant.
  6. Test configuration.
  7. Test filter trên sample log.
  8. Reload/start Fail2ban.
  9. Read-back server/jail status.
  10. Xác minh firewall action.
  11. Theo dõi false positive.
  12. Document unban/rollback.

Checklist Fail2ban cho Linux Server

  1. SSH/authentication baseline đã đủ mạnh.
  2. Firewall policy đã rõ.
  3. Log source thực sự có failure event.
  4. Jail override nằm ở file được quản lý.
  5. Threshold không copy máy móc.
  6. ignoreip tối thiểu và có owner.
  7. Custom regex được test.
  8. fail2ban-client -t PASS.
  9. Jail status active.
  10. Firewall action quan sát được.
  11. Unban runbook tồn tại.
  12. Reverse proxy/client IP được xử lý đúng nếu dùng HTTP jail.
  13. Monitoring phát hiện jail/process failure.
  14. Ban count không được diễn giải như compromise evidence.
  15. Config change có rollback.

Nguồn kỹ thuật tham khảo

Kết luận

Fail2ban là lớp phản ứng dựa trên log, không phải lớp bảo mật nền. Giá trị của nó cao nhất khi SSH/firewall/identity đã được harden, log đáng tin cậy và jail được test để tránh false positive.

Workflow đúng là log evidence → filter → threshold → action → read-back. Nếu không chứng minh được Fail2ban đang đọc đúng log và firewall action thực sự có hiệu lực, một service “running” chưa đủ để gọi control là PASS.

◇
Cần hỗ trợ kiểm tra và xử lý website?Đội ngũ SecureWebOps sẵn sàng hỗ trợ theo phạm vi phù hợp.
Liên hệ ngay →
Đoàn Trình Dục
Về tác giả Đoàn Trình Dục TD Digital · Website Operations & Security

Đoàn Trình Dục là tác giả nội dung trên SecureWebOps. Các bài viết tập trung vào bảo mật WordPress, giám sát an ninh website, malware/backdoor, hardening, backup/recovery và Incident Response theo hướng thực hành, có bước kiểm tra, bằng chứng, validation và rollback khi phù hợp.

Xem hồ sơ tác giả →