Cài đặt và cấu hình CrowdSec trên Linux: Thay thế Fail2ban chặn botnet hiệu quả

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Bối cảnh & Tại sao cần

2 giờ sáng, điện thoại rung bần bật vì alert PagerDuty. CPU trên cụm SSH bastion nhảy vọt lên 96%. Tôi vội mở terminal kiểm tra log:

sudo journalctl -u ssh -f

Dòng log Failed password for invalid user cuộn liên tục như thác đổ. Khoảng 300 request mỗi giây. Một đợt brute-force phân tán đang nhắm thẳng vào cụm server. Fail2ban trên máy bắt đầu quá tải. Công cụ này dùng regex trên Python để bóc tách log, ngốn sạch một core CPU khi lưu lượng tăng đột biến.

Vấn đề lớn hơn nằm ở chiến thuật của botnet. Kẻ tấn công dùng pool hàng chục nghìn IP xoay vòng liên tục. Mỗi IP chỉ thử đúng 1 lần rồi đổi địa chỉ khác. Ngưỡng maxretry = 5 quen thuộc của Fail2ban hoàn toàn bất lực.

Đó là lý do tôi chuyển sang CrowdSec. Viết bằng Go, CrowdSec tiêu tốn rất ít RAM và CPU. Quan trọng hơn, nó hoạt động như một mạng lưới phòng thủ chung (Collaborative Threat Intelligence). Khi một node bất kỳ trên thế giới phát hiện IP quét lỗ hổng, IP đó lập tức bị đẩy lên mạng lưới. Server của bạn tự động kéo danh sách này về và chặn kết nối ngay từ tầng mạng.

Mô hình CrowdSec tách biệt rõ ràng thành hai phần:

  • Security Engine: Đọc log, phân tích hành vi theo các scenario định sẵn và ra quyết định xử phạt (ban IP, captcha).
  • Remediation Component (Bouncer): Nhận lệnh từ Engine để chặn IP trực tiếp ở tầng packet thông qua nftables, iptables, Nginx hoặc Cloudflare.

Cài đặt

Để tránh xung đột bảng rule tường lửa trên Ubuntu/Debian, hãy tắt Fail2ban trước khi thêm repo CrowdSec.

# Dừng và tắt Fail2ban
sudo systemctl stop fail2ban
sudo systemctl disable fail2ban

# Thêm repository chính thức của CrowdSec
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash

# Cài đặt Security Engine
sudo apt-get update
sudo apt-get install -y crowdsec

Khi vừa cài xong, Security Engine tự động quét các service đang chạy (như OpenSSH, Nginx) và nạp parser phù hợp. Tuy nhiên, Engine chỉ có nhiệm vụ phát hiện chứ chưa chặn packet. Bạn cần cài thêm Firewall Bouncer để biến quyết định thành hành động:

# Cài Firewall Bouncer (tự động nhận diện nftables hoặc iptables)
sudo apt-get install -y crowdsec-firewall-bouncer-iptables

Kiểm tra trạng thái hai service:

sudo systemctl status crowdsec
sudo systemctl status crowdsec-firewall-bouncer

Cấu hình chi tiết

1. Khai báo nguồn log (Acquisition)

Đường dẫn nguồn log mặc định nằm tại /etc/crowdsec/acquis.yaml. Mở file để kiểm tra cấu hình:

sudo nano /etc/crowdsec/acquis.yaml

Đảm bảo CrowdSec đang đọc đúng file log của hệ thống:

filenames:
  - /var/log/auth.log
  - /var/log/syslog
labels:
  type: syslog
---
filenames:
  - /var/log/nginx/*.log
labels:
  type: nginx

2. Cài đặt các kịch bản phát hiện (Collections)

CrowdSec đóng gói parser và kịch bản phát hiện thành các collection. Công cụ CLI cscli quản lý việc này rất nhanh. Hãy cài các tập luật phổ biến cho SSH và Nginx:

# Cập nhật danh mục luật mới nhất
sudo cscli hub update

# Cài bộ luật bảo vệ SSH và Nginx
sudo cscli collections install crowdsecurity/sshd
sudo cscli collections install crowdsecurity/nginx
sudo cscli collections install crowdsecurity/http-cve

# Tải lại cấu hình
sudo systemctl reload crowdsec

Trong lúc dọn dẹp và reset mật khẩu các tài khoản service, bạn có thể dùng công cụ tại toolcraft.app/vi/tools/security/password-generator để sinh chuỗi ngẫu nhiên có độ entropy cao. Logic xử lý 100% bằng JavaScript trong trình duyệt, không gửi dữ liệu qua mạng nên an toàn khi copy vào terminal.

3. Kết nối CrowdSec Console

CrowdSec cung cấp dashboard web miễn phí để xem trực quan các đợt tấn công trên nhiều server cùng lúc. Đăng ký tài khoản tại app.crowdsec.net, lấy enrollment key và liên kết server:

# Liên kết node với tài khoản console
sudo cscli console enroll [YOUR_ENROLL_KEY]

# Khởi động lại engine
sudo systemctl restart crowdsec

Kiểm tra & Giám sát

Chỉ cần vài phút sau khi khởi chạy, bạn có thể kiểm tra hiệu quả hoạt động bằng lệnh trực tiếp trên terminal.

1. Xem danh sách cảnh báo tấn công

Lệnh sau liệt kê các đợt dò quét vừa kích hoạt cảnh báo:

sudo cscli alerts list

Dữ liệu trả về theo bảng rất dễ đọc:

+----+------------------+-------------------------------+--------+---------+----+--------+--------------------------------+
| ID |      scope       |             value             | reason | country | as | events |           created_at           |
+----+------------------+-------------------------------+--------+---------+----+--------+--------------------------------+
|  1 | Ip:194.26.29.112 | crowdsecurity/ssh-bf          | ban    | RU      | .. |      6 | 2026-10-30 02:22:15 +0000 UTC  |
|  2 | Ip:45.154.255.89 | crowdsecurity/http-crawl-non_ | ban    | NL      | .. |     42 | 2026-10-30 02:35:40 +0000 UTC  |
+----+------------------+-------------------------------+--------+---------+----+--------+--------------------------------+

2. Quản lý danh sách IP bị chặn (Decisions)

Xem các IP đang bị cấm truy cập:

sudo cscli decisions list

Bạn cũng có thể tự ban hoặc gỡ lệnh ban thủ công:

# Chặn thủ công một IP nghi vấn trong 24 giờ
sudo cscli decisions add --ip 198.51.100.25 --duration 24h --reason "Manual ban suspicious IP"

# Gỡ chặn khi cần
sudo cscli decisions delete --ip 198.51.100.25

3. Kiểm tra tầng tường lửa của Kernel

Bouncer đồng bộ danh sách đen trực tiếp vào ipset hoặc nftables set. Để kiểm tra:

sudo nft list set inet crowdsec crowdsec-blacklists
# Hoặc với iptables:
sudo iptables -L -n -v | grep crowdsec

Hàng nghìn IP xấu nằm gọn trong RAM của kernel. Gói tin độc hại bị drop ngay tại card mạng, hoàn toàn không chạm tới Nginx hay SSH daemon.

4. Theo dõi hiệu năng thời gian thực

Muốn biết hệ thống đã xử lý bao nhiêu dòng log, hãy chạy:

sudo cscli metrics

Trên cụm máy chủ của tôi, chuyển sang CrowdSec giúp CPU giảm từ 95% xuống dưới 6%, ngay cả khi botnet quét liên tục trong đêm.

Share: