Cài đặt Fail2ban trên CentOS Stream 9: Chống Brute-force thực chiến

CentOS tutorial - IT technology blog
CentOS tutorial - IT technology blog

Vừa thuê xong một con VPS CentOS Stream 9, việc đầu tiên bạn làm là gì? Đừng vội cài Web Server hay Database. Theo thống kê, một IP public chỉ mất trung bình 3-5 phút để bị các botnet “dòm ngó”. Chúng thực hiện hàng nghìn nỗ lực đăng nhập sai (Brute-force) vào cổng 22 mỗi giờ. Fail2ban là công cụ cực kỳ nhẹ nhưng hiệu quả để tự động hóa việc xích cổ những kẻ phá rối này.

3 bước để “chặn đứng” Brute-force (Quick Start)

Fail2ban không nằm trong kho ứng dụng mặc định của RHEL/CentOS. Bạn cần cài Repo EPEL trước. Dưới đây là quy trình triển khai nhanh trong vòng 60 giây:

# 1. Cài đặt EPEL Repository
sudo dnf install epel-release -y

# 2. Cài đặt Fail2ban và gói hỗ trợ Firewalld
sudo dnf install fail2ban fail2ban-firewalld -y

# 3. Kích hoạt dịch vụ chạy cùng hệ thống
sudo systemctl enable --now fail2ban

Sau khi chạy xong, Fail2ban đã sẵn sàng. Tuy nhiên, cấu hình mặc định vẫn còn khá lỏng lẻo. Chúng ta cần tinh chỉnh thêm để nó thực sự có hiệu lực cho SSH.

Cơ chế hoạt động trên CentOS Stream 9 có gì mới?

Nhiều người lầm tưởng Fail2ban là một firewall. Thực tế, nó giống như một “thanh tra” liên tục soi các file log. Trên CentOS Stream 9, hệ thống ưu tiên sử dụng systemd-journald. Thay vì đọc file text /var/log/secure chậm chạp, Fail2ban giờ đây giao tiếp trực tiếp với journal. Cách này giúp tốc độ phản ứng gần như tức thì và tiết kiệm tài nguyên khi log phình to.

Quy tắc vàng: Đừng chạm vào jail.conf

Kinh nghiệm thực tế là bạn tuyệt đối không nên sửa file /etc/fail2ban/jail.conf. Mỗi khi cập nhật package, file này sẽ bị ghi đè và bạn sẽ mất sạch cấu hình. Hãy tạo file jail.local để ghi đè các thiết lập riêng:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo vi /etc/fail2ban/jail.local

Cấu hình thực chiến bảo vệ SSH

Hãy tìm đến phần [sshd] trong file jail.local và sửa lại như sau để tối ưu bảo mật:

[sshd]
enabled = true
port    = ssh
logpath = %(sshd_log)s
backend = systemd
maxretry = 3
findtime = 15m
bantime  = 24h
  • maxretry = 3: Chỉ cho phép sai 3 lần. Quá tam ba bận là bị xích.
  • findtime = 15m: Nếu trong 15 phút mà sai đủ 3 lần thì mới chặn.
  • bantime = 24h: Thời gian “vào tù” 1 ngày. Con số này đủ để các botnet tự động bỏ qua IP của bạn.

Sửa xong, hãy khởi động lại để áp dụng cấu hình mới: sudo systemctl restart fail2ban.

Tích hợp Firewalld và xử lý lỗi SELinux

Đây là phần quan trọng nhất. Trên CentOS Stream 9, SELinux và Firewalld hoạt động rất khắt khe.

Khi SELinux chặn Fail2ban

Mình từng migrate 5 server production sang CentOS 9 và nhận ra Fail2ban thường bị SELinux chặn không cho gọi Firewalld. Hệ quả là IP bị ghi vào danh sách cấm nhưng firewall vẫn mở cửa. Để kiểm tra, bạn hãy dùng lệnh: ausearch -m avc -ts recent. Nếu thấy các lỗi liên quan đến dbus hoặc firewalld, đó chính là thủ phạm.

Tối ưu hóa Firewalld Backend

Để Fail2ban phối hợp mượt mà nhất, hãy ép nó sử dụng rich-rules. Thêm các dòng sau vào phần [DEFAULT] trong file jail.local:

[DEFAULT]
banaction = firewallcmd-rich-rules
banaction_allports = firewallcmd-rich-rules

Sử dụng rich-rules giúp danh sách chặn được quản lý tách biệt, không làm rác bảng luật (ruleset) chính của firewall.

Cách kiểm tra và gỡ chặn (Unban) IP

Trong quá trình làm việc, đôi khi bạn hoặc khách hàng sẽ tự khóa chính mình. Lúc này, fail2ban-client là cứu cánh duy nhất.

Xem các “nhà tù” đang hoạt động: fail2ban-client status

Danh sách đen của SSH: fail2ban-client status sshd

Giải cứu IP bị khóa nhầm: fail2ban-client set sshd unbanip 1.2.3.4

Kinh nghiệm để server luôn trong vùng an toàn

  1. Luôn Whitelist IP cá nhân: Thêm IP tĩnh của bạn vào dòng ignoreip trong jail.local. Đây là bảo hiểm để bạn không bao giờ bị nhốt ngoài server.
  2. Đổi cổng SSH mặc định: Đổi từ 22 sang một số ngẫu nhiên như 2289. Chỉ riêng thao tác này đã giúp giảm 90% lượng bot quét log hàng ngày.
  3. Giám sát log thời gian thực: Hãy thử lệnh tail -f /var/log/fail2ban.log. Cảm giác nhìn các IP từ lạ mặt bị “vô hiệu hóa” liên tục rất thú vị và an tâm.

Triển khai Fail2ban trên CentOS Stream 9 không khó. Cái khó là biết cách xử lý SELinux để công cụ này thực sự có quyền thực thi. Hy vọng những chia sẻ thực chiến này giúp server của bạn trở nên bất khả xâm phạm trước các đợt tấn công dò mật khẩu.

Share: