❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.

Fail2ban là công cụ chống dò mật khẩu kinh điển trên Linux, gần như ai quản trị VPS cũng từng dùng qua. Nhưng sau hơn 15 năm, cách tấn công đã thay đổi hoàn toàn. Attacker không còn dùng một IP duy nhất để dò mật khẩu nữa, họ dùng hàng nghìn IP từ botnet phân tán khắp thế giới. Fail2ban chỉ phát hiện được khi IP đó đã tấn công chính server của bạn. CrowdSec giải quyết vấn đề này bằng cách chia sẻ thông tin mối đe dọa giữa cộng đồng, một IP tấn công server khác sẽ bị block trên server bạn trước khi nó kịp gõ cửa.

CrowdSec trên Linux VPS - IDS thế hệ mới thay thế

Trong bài này, mình sẽ hướng dẫn bạn cài đặt và cấu hình CrowdSec trên VPS Linux (Ubuntu và AlmaLinux), từ kiến trúc hoạt động đến các lệnh quản trị hàng ngày.

Tại sao CrowdSec thay thế được Fail2ban?

Fail2ban hoạt động theo mô hình đơn giản: đọc log, tìm pattern đáng ngờ, ban IP. Mỗi server tự chiến đấu riêng lẻ. CrowdSec cũng phân tích log tương tự, nhưng thêm một lớp quan trọng: crowd-sourced thông tin mối đe dọa.

Khi CrowdSec trên server A phát hiện IP xấu, thông tin đó được gửi về trung tâm và chia sẻ cho toàn bộ cộng đồng. Server B nhận được blocklist cập nhật mà không cần chờ bị tấn công trước. Kiểu như hệ miễn dịch cộng đồng, một người phát hiện virus thì cả nhóm được tiêm vaccine.

Ngoài ra, CrowdSec được viết bằng Go nên xử lý log nhanh hơn đáng kể so với Fail2ban (Python). Kiến trúc API-first cho phép tích hợp linh hoạt, bạn có thể quản lý qua REST API thay vì phải SSH vào server chỉnh config thủ công.

Kiến trúc CrowdSec

CrowdSec gồm 3 thành phần chính:

  • Agent (Security Engine): đọc log, phân tích theo scenarios đã định nghĩa, phát hiện hành vi bất thường. Đây là “bộ não” phát hiện tấn công.
  • LAPI (Local API): lưu trữ alerts và decisions. Agent gửi alert về LAPI, LAPI quyết định ban hay không và lưu lại. LAPI cũng đồng bộ với Central API của CrowdSec để nhận community blocklists.
  • Bouncer: thực thi quyết định block. Bouncer kết nối với LAPI, lấy danh sách IP bị ban rồi áp dụng vào firewall, nginx, hoặc bất kỳ điểm chặn nào. Một LAPI có thể phục vụ nhiều bouncer khác nhau.

Luồng hoạt động: Log → Agent phân tích → Alert gửi về LAPI → LAPI tạo Decision → Bouncer lấy Decision → Block IP tại firewall.

Ngoài ra, CrowdSec cung cấp community blocklists. Khi bạn enroll vào console CrowdSec, server của bạn sẽ nhận danh sách IP đã bị report bởi cộng đồng. Bạn cũng đóng góp ngược lại khi server phát hiện IP xấu mới. Toàn bộ quá trình chia sẻ này chỉ gửi IP + loại tấn công, không gửi log hay dữ liệu nhạy cảm nào.

Cài đặt CrowdSec

CrowdSec hỗ trợ cả Debian/Ubuntu và RHEL/AlmaLinux. Cách cài đặt khá đơn giản qua package manager.

Ubuntu / Debian

Thêm repository của CrowdSec rồi cài đặt:

curl -s https://install.crowdsec.net | sudo sh
sudo apt install crowdsec

AlmaLinux / Rocky Linux

curl -s https://install.crowdsec.net | sudo sh
sudo dnf install crowdsec

Sau khi cài, CrowdSec tự động chạy như systemd service:

sudo systemctl status crowdsec

CrowdSec sẽ tự phát hiện các service đang chạy trên server (SSH, nginx, Apache…) và cài sẵn các collection tương ứng. Bạn có thể kiểm tra bằng lệnh:

sudo cscli collections list

Cài Bouncer

CrowdSec Agent chỉ phát hiện, không block. Để thực sự chặn IP, bạn cần cài bouncer. Bouncer phổ biến nhất là crowdsec-firewall-bouncer-iptables, hoạt động ở tầng firewall.

Ubuntu / Debian

sudo apt install crowdsec-firewall-bouncer-iptables

AlmaLinux / Rocky Linux

sudo dnf install crowdsec-firewall-bouncer-iptables

Sau khi cài, bouncer tự đăng ký với LAPI và bắt đầu lấy decisions. Kiểm tra trạng thái:

sudo cscli bouncers list

Kết quả sẽ hiển thị bouncer đã kết nối, kèm thời gian last pull gần nhất. Nếu bạn thấy bouncer trong danh sách và trạng thái validated, mọi thứ đã hoạt động.

Nếu server dùng nftables thay vì iptables, hãy cài crowdsec-firewall-bouncer-nftables thay thế. Trên Ubuntu 22.04+ và AlmaLinux 9+, nftables là mặc định nên bạn nên kiểm tra trước bằng lệnh iptables --version để xem đang dùng backend nào.

Cấu hình acquis.yaml

File /etc/crowdsec/acquis.yaml (hoặc các file trong /etc/crowdsec/acquis.d/) là nơi bạn khai báo nguồn log cho CrowdSec đọc. Mỗi entry gồm đường dẫn log và label cho biết loại log đó.

CrowdSec tự tạo cấu hình mặc định khi cài đặt, nhưng bạn nên kiểm tra và bổ sung nếu cần. Dưới đây là các nguồn log phổ biến:

SSH log

filenames:
  - /var/log/auth.log        # Ubuntu/Debian
  - /var/log/secure           # AlmaLinux/Rocky
labels:
  type: syslog

Nginx access log

filenames:
  - /var/log/nginx/access.log
  - /var/log/nginx/error.log
labels:
  type: nginx

Syslog chung

filenames:
  - /var/log/syslog            # Ubuntu/Debian
  - /var/log/messages          # AlmaLinux/Rocky
labels:
  type: syslog

Sau khi chỉnh acquis.yaml, restart CrowdSec để áp dụng:

sudo systemctl restart crowdsec

Trên các bản CrowdSec mới, bạn có thể tách riêng từng nguồn log thành file riêng trong thư mục /etc/crowdsec/acquis.d/. Ví dụ: ssh.yaml, nginx.yaml. Cách này dễ quản lý hơn khi server chạy nhiều service.

Cài Collections từ Hub

Collections là bộ rules đóng gói sẵn cho từng service. CrowdSec Hub cung cấp hàng trăm collections do cộng đồng đóng góp. Các collections quan trọng cho VPS:

# Collection cho SSH — phát hiện brute force, password spray
sudo cscli collections install crowdsecurity/sshd

# Collection cho Nginx — phát hiện scan, exploit, bad user-agent sudo cscli collections install crowdsecurity/nginx

# Collection tổng hợp cho Linux — bao gồm nhiều parsers và scenarios cơ bản sudo cscli collections install crowdsecurity/linux

Xem danh sách collections đã cài:

sudo cscli collections list

Muốn khám phá thêm, dùng lệnh sau để xem toàn bộ hub (parsers, scenarios, collections, postoverflows):

sudo cscli hub list

Sau khi cài thêm collection, restart CrowdSec:

sudo cscli hub update
sudo systemctl restart crowdsec

Các lệnh quản trị thường dùng

Đây là những lệnh bạn sẽ dùng hàng ngày để giám sát CrowdSec:

Xem danh sách IP bị ban

sudo cscli decisions list

Lệnh này hiển thị tất cả IP đang bị block, kèm lý do (scenario nào trigger), thời gian ban, và nguồn (local hay community blocklist).

Xem alerts gần đây

sudo cscli alerts list

Alerts là các sự kiện phát hiện, có thể có hoặc không kèm decision (ban). Hữu ích khi bạn muốn xem ai đang dò server mà chưa bị ban.

Xem metrics tổng quan

sudo cscli metrics

Hiển thị số dòng log đã parse, số alerts trigger, bucket overflow, v.v. Rất hữu ích để kiểm tra CrowdSec có đang đọc đúng log file không.

Ban hoặc unban IP thủ công

# Ban 1 IP trong 24 giờ
sudo cscli decisions add --ip 1.2.3.4 --duration 24h --reason "manual ban"

# Ban cả subnet sudo cscli decisions add --range 1.2.3.0/24 --duration 24h --reason "subnet ban"

# Xoá ban cho 1 IP sudo cscli decisions delete --ip 1.2.3.4

Whitelist IP

Nếu IP của bạn bị ban nhầm (ví dụ nhập sai password SSH vài lần), bạn có thể unban nhanh bằng lệnh:

sudo cscli decisions delete --ip YOUR_IP

Tuy nhiên, lần tới vẫn có thể bị ban lại. Để whitelist vĩnh viễn, tạo file whitelist trong CrowdSec:

sudo nano /etc/crowdsec/parsers/s02-enrich/my-whitelists.yaml

Nội dung file:

name: my-whitelists
description: "Whitelist trusted IPs"
whitelist:
  reason: "trusted IP"
  ip:
    - "YOUR_IP"
    - "YOUR_OFFICE_IP"
  cidr:
    - "10.0.0.0/8"

Restart CrowdSec sau khi thêm whitelist:

sudo systemctl restart crowdsec

Luôn whitelist IP quản trị của bạn. Không gì khó chịu hơn việc tự lock mình ra khỏi server vì CrowdSec ban nhầm IP bạn đang SSH.

CrowdSec Console

CrowdSec cung cấp dashboard web miễn phí tại app.crowdsec.net. Từ đây bạn có thể xem alerts, decisions, và quản lý nhiều server cùng lúc bằng giao diện trực quan.

Để kết nối server vào console, đăng ký tài khoản tại app.crowdsec.net, sau đó lấy enrollment key và chạy trên server:

sudo cscli console enroll YOUR_ENROLLMENT_KEY

Sau khi enroll, vào console web để accept server mới. Từ đây bạn sẽ thấy:

  • Danh sách alerts theo thời gian thực
  • Bản đồ IP tấn công (geo view)
  • Quản lý blocklists bạn đang subscribe
  • Theo dõi nhiều server từ 1 dashboard

Console miễn phí cho community tier, đủ dùng cho hầu hết VPS cá nhân và doanh nghiệp nhỏ. Bản trả phí bổ sung thêm blocklists premium và tính năng quản lý nâng cao.

So sánh CrowdSec và Fail2ban

Tiêu chíFail2banCrowdSec
Ngôn ngữPythonGo
Hiệu năng parse logChậm với log lớnNhanh, xử lý tốt log hàng triệu dòng
Thông tin mối đe dọaKhông có, mỗi server tự xử lýCommunity blocklists, chia sẻ IP xấu
Kiến trúcMonolithic (1 process)Modular (Agent + LAPI + Bouncer)
APIKhông có REST APIREST API đầy đủ
DashboardKhông có (CLI only)Console web miễn phí
Cấu hìnhRegex-based filtersYAML scenarios + parsers
Hỗ trợ containerHạn chếDocker image chính thức
Multi-serverMỗi server cấu hình riêng1 LAPI quản lý nhiều agent + bouncer
Cộng đồngLâu đời, ổn địnhĐang phát triển nhanh, hub phong phú
Chi phíMiễn phí hoàn toànMiễn phí (community), trả phí cho premium blocklists

Giữ Fail2ban song song hay migrate hoàn toàn?

Câu trả lời ngắn: bạn có thể chạy cả hai song song mà không xung đột. CrowdSec và Fail2ban hoạt động độc lập, cùng đọc log nhưng thực thi ban qua chain iptables khác nhau.

Chiến lược migration mình khuyến nghị:

  1. Giai đoạn 1: Song song (1-2 tuần). Cài CrowdSec + bouncer, giữ Fail2ban chạy bình thường. Quan sát CrowdSec có phát hiện đúng không bằng cscli decisions listcscli metrics.
  2. Giai đoạn 2: Fail2ban passive. Chuyển Fail2ban action thành action = %(action_)s (chỉ log, không ban). CrowdSec đảm nhận việc block. So sánh log 2 bên xem có miss gì không.
  3. Giai đoạn 3: Tắt Fail2ban. Sau khi đã tin tưởng CrowdSec hoạt động ổn định, disable Fail2ban. Giữ package lại phòng trường hợp cần rollback nhanh.
# Khi đã sẵn sàng tắt Fail2ban
sudo systemctl stop fail2ban
sudo systemctl disable fail2ban

Nếu bạn có custom Fail2ban jails cho service đặc thù mà CrowdSec chưa có scenario, hãy giữ Fail2ban cho riêng service đó. Không nhất thiết phải all-or-nothing.

Checkpoint: Test CrowdSec hoạt động

Sau khi cài xong CrowdSec và bouncer, bạn nên kiểm tra mọi thứ hoạt động đúng trước khi yên tâm bỏ đó.

Bước 1: Kiểm tra service

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

Cả hai service phải ở trạng thái active (running).

Bước 2: Kiểm tra metrics

sudo cscli metrics

Xem phần “Acquisition Metrics”. Nếu CrowdSec đang đọc log đúng, bạn sẽ thấy số dòng đã parse tăng dần. Nếu mọi thứ là 0, kiểm tra lại acquis.yaml.

Bước 3: Test SSH dò mật khẩu

Từ một máy khác (hoặc dùng VPS thứ hai), thử SSH sai password liên tục:

# Chạy từ máy TEST, không phải server chính
for i in $(seq 1 10); do ssh fakeuser@YOUR_SERVER_IP; done

Sau vài lần thử, quay lại server chính kiểm tra:

sudo cscli decisions list

Nếu IP test xuất hiện trong danh sách decisions với reason crowdsecurity/ssh-bf, CrowdSec đang hoạt động đúng. Bouncer sẽ tự block IP đó ở tầng firewall.

Bước 4: Xem chi tiết alert

sudo cscli alerts list
sudo cscli alerts inspect -d ALERT_ID

Inspect alert sẽ cho bạn thấy chi tiết: IP nào, scenario nào trigger, log dòng nào match, thời gian ban bao lâu.

Bước 5: Dọn dẹp sau test

Unban IP test để không bị lock nhầm:

sudo cscli decisions delete --ip TEST_IP

Đừng test dò mật khẩu từ chính IP bạn đang SSH vào server. Nếu CrowdSec ban IP đó, bạn sẽ bị mất kết nối ngay lập tức. Luôn test từ IP khác hoặc whitelist IP quản trị trước khi test.


CrowdSec không phải silver bullet, nhưng nó giải quyết được điểm yếu lớn nhất của Fail2ban: mỗi server phải tự phát hiện tấn công từ đầu. Với cộng đồng đang phát triển nhanh và kiến trúc hiện đại, CrowdSec là bước tiến hợp lý cho bất kỳ ai đang quản trị VPS Linux.

Chia sẻ:
Bài viết đã được kiểm duyệt bởi AZDIGI Team

Về tác giả

Trần Thắng

Trần Thắng

Chuyên gia tại AZDIGI với nhiều năm kinh nghiệm trong lĩnh vực web hosting và quản trị hệ thống.

Hơn 10 năm phục vụ 80.000+ khách hàng

Bắt đầu dự án web của bạn với AZDIGI