Phạm Văn Thư
Bảo mật và danh tính · AI-assisted content

CrowdSec: phát hiện và chặn tấn công bằng sức mạnh cộng đồng cho nhà phân phối dược

Đăng ngày 12/10/2026

Mục lục bài nghiên cứu
Hình đại diện CrowdSec — bảo mật và quản lý danh tính mã nguồn mở

CrowdSec tóm lược: phát hiện ở chỗ này, xử lý ở chỗ khác

CrowdSec là bộ công cụ bảo mật mã nguồn mở đọc nhật ký và các yêu cầu HTTP để phát hiện hành vi xấu, sau đó cho phép chặn bằng các thành phần khắc phục gọi là remediation component hay bouncer. README tự giới thiệu đây là IDS/IPS (hệ thống phát hiện và ngăn chặn xâm nhập), WAF (tường lửa ứng dụng web) và công cụ nhận diện bot, đi kèm danh sách chặn cộng đồng gồm các địa chỉ IP độc hại. [1]

Nên cân nhắc CrowdSec khi doanh nghiệp có vài máy chủ công khai hoặc cổng web bị dò quét liên tục, nhưng chưa có đội giám sát an ninh làm việc cả ngày. Không nên kỳ vọng nó thay thế bộ phận bảo mật, vá lỗi hệ thống hay sao lưu. Nó là lớp phát hiện và chặn, chất lượng phụ thuộc vào việc nhật ký nào được đưa vào, kịch bản nào được bật và ai xem xét ngoại lệ.

Giấy phép của kho mã này là MIT, đơn giản hơn nhiều so với các dự án có thư mục giấy phép riêng. Tuy vậy MIT chỉ nói về mã nguồn tại commit khảo sát, không nói về danh sách chặn cộng đồng, Console hay các tính năng cao cấp, vốn là dịch vụ riêng. [1][2]

Nhật ký đầy dấu vết tấn công mà không ai đọc: nỗi lo của một nhà phân phối dược phẩm

Một công ty phân phối dược phẩm cấp vùng thường vận hành cổng đặt hàng cho nhà thuốc, phần mềm kho, hệ thống kế toán và vài máy chủ truy cập từ xa. Những hệ thống này nằm trên Internet nên ngày nào cũng bị thử mật khẩu, dò đường dẫn quản trị và quét cổng. Nhật ký của máy chủ web và SSH ghi lại tất cả, nhưng nếu không có công cụ phân tích thì chúng chỉ được mở khi đã có sự cố.

Cách phòng thủ phổ biến là một script chặn IP sau vài lần đăng nhập sai. README so sánh CrowdSec với fail2ban theo hướng này: cả hai đọc cùng loại tệp nhật ký và cấm cùng loại địa chỉ IP, nhưng CrowdSec tách việc phát hiện khỏi việc xử lý, nên có thể phân tích nhật ký ở một máy và chặn ở tường lửa, reverse proxy hay CDN ở máy khác. [1]

Bài toán thứ hai là tri thức về kẻ tấn công. Một IP quét cổng nhà thuốc A hôm nay có thể quét công ty B ngày mai. README mô tả cơ chế người dùng báo cáo mối đe dọa mình gặp để đưa vào danh sách chặn cộng đồng, giúp người khác chặn trước khi IP đó tới. Giá trị này chỉ tồn tại nếu bạn chấp nhận chia sẻ tín hiệu, một quyết định cần cân nhắc ở phần bảo mật. [1]

Security Engine, Local API và bouncer: ai làm việc gì

README mô tả Security Engine là thành phần trung tâm, phân tích nhật ký và yêu cầu HTTP, rồi để các remediation component thực hiện hành động chặn. Hub là kho công khai các tập luật phát hiện, được README nói là phát hành theo giấy phép MIT. Có thêm Console để theo dõi và quản lý, cùng danh sách chặn cộng đồng. [1]

Tài liệu Docker làm rõ cách chia vai. Agent phân tích nhật ký và tạo cảnh báo (alert); Local API, viết tắt LAPI, biến cảnh báo thành quyết định (decision). Cả hai chức năng nằm trong cùng một tệp thực thi nên có thể chạy chung một container hoặc tách ra. Với hệ thống phức tạp, nên đặt agent ở mỗi máy chạy ứng dụng, còn LAPI tập hợp tín hiệu và nói chuyện với Central API bên ngoài. [6]

Phần cảnh báo được tạo từ hai khái niệm. Parser biến dòng nhật ký thô thành đối tượng Event có các trường như Parsed, Meta, Line và Overflow, đi qua nhiều stage theo thứ tự bảng chữ cái của thư mục. Leaky bucket (xô rò) nhận các sự kiện đã làm giàu, và khi vượt ngưỡng sẽ phát ra sự kiện tràn, tức overflow. Hai cơ chế này nhìn bề ngoài đơn giản, nhưng chính chúng quyết định chất lượng phát hiện. [5][4]

CrowdSec Console — CrowdSec, bảo mật và quản lý danh tính mã nguồn mở
Hình 1. Minh họa trong kho mã nguồn chính thức của CrowdSec. Nguồn: crowdsecurity/crowdsec @526e717. Hình ảnh và nhãn hiệu thuộc về chủ sở hữu tương ứng.

Một dòng nhật ký đi qua bộ phân tích: từ chuỗi ký tự tới quyết định chặn

Giả sử máy chủ nginx ghi một dòng truy cập thất bại vào tệp nhật ký. Cấu hình acquisition (thu nhận) chỉ ra tệp nào được đọc và gán nhãn loại nhật ký, ví dụ nhãn type cho syslog hoặc apache2. Ví dụ trong tài liệu Docker đặt các tệp theo từng nguồn trong thư mục acquis.d, và khuyến nghị mỗi nguồn dữ liệu một tệp. [6]

Parser áp dụng mẫu grok để tách các trường, gán thêm giá trị tĩnh bằng khối statics như loại dịch vụ hay log_type, và có thể làm giàu bằng các phương thức như tra cứu GeoIP. Mỗi nút có thể kèm bộ lọc dạng biểu thức; nếu bộ lọc sai, nút bị bỏ qua. Thiết lập onsuccess quyết định dòng chuyển sang stage kế tiếp hay tiếp tục xử lý trong stage hiện tại. [5]

Sau đó sự kiện được đổ vào bucket. Mỗi cấu hình bucket sinh ra nhiều bản thể, phân biệt bằng stackkey, thường là source_ip. Ví dụ trong tài liệu: nếu cùng một IP gây năm lần xác thực SSH sai trong khoảng rò mười giây thì bucket tràn và hành động on_overflow có thể là ban trong một giờ. Sự kiện tràn trở thành cảnh báo, LAPI quyết định, rồi bouncer ở tường lửa hay reverse proxy thực thi. [4][6]

Danh mục năng lực có dẫn nguồn

Về phát hiện, tài liệu leaky bucket mô tả các loại xô. Xô tiêu chuẩn có capacity và leakspeed; trigger có capacity bằng không nên mọi sự kiện đều gây tràn; uniq chỉ chấp nhận một lần cho mỗi giá trị rút từ sự kiện; counter có sức chứa và tốc độ rò vô hạn rồi phát sự kiện sau một khoảng thời gian định sẵn. Ngoài ra còn bucket Bayesian chạy suy luận xác suất dựa trên likelihood cho trường hợp ác ý và lành tính. Biểu thức lọc dùng ngôn ngữ expr. [4]

Với ứng dụng web, README cho biết thành phần AppSec là WAF xây trên Coraza, nạp được luật SecLang và bộ OWASP Core Rule Set nguyên trạng, đồng thời thêm định dạng luật YAML riêng và dùng chung lớp danh tiếng IP cùng khắc phục với engine dựa trên nhật ký. AppSec còn có thể trả lời yêu cầu đáng ngờ bằng một thử thách proof-of-work bằng JavaScript với độ khó điều chỉnh được, cho phép trình thu thập đã xác minh như Googlebot đi qua. [1]

Về triển khai, README liệt kê Linux, Windows, Docker, OpnSense và Kubernetes. Tài liệu Docker nêu các hình ảnh container cho nhiều kiến trúc, gồm biến thể Alpine, Debian và bản slim bỏ plugin thông báo và cơ sở dữ liệu GeoIP. Plugin thông báo yêu cầu bản đầy đủ cùng tệp profiles.yaml và cấu hình thông báo. [1][6]

CrowdSec schema — CrowdSec, bảo mật và quản lý danh tính mã nguồn mở
Hình 2. Minh họa trong kho mã nguồn chính thức của CrowdSec. Nguồn: crowdsecurity/crowdsec @526e717. Hình ảnh và nhãn hiệu thuộc về chủ sở hữu tương ứng.

Phù hợp với ai, không phù hợp với ai

Người dùng điển hình là quản trị viên hệ thống hoặc nhóm DevOps nhỏ vận hành máy chủ Linux, reverse proxy và container, cần thứ gì đó mạnh hơn script chặn IP nhưng chưa muốn mua nền tảng giám sát doanh nghiệp. Vì cấu hình thể hiện bằng tệp YAML và có cả Docker lẫn gói cài đặt, nhóm này có thể bắt đầu từ một máy rồi mở rộng. [1][6]

Nhóm thứ hai là công ty có nhiều ứng dụng web nhưng thiếu tường lửa ứng dụng. Thành phần AppSec cho phép dùng luật OWASP CRS quen thuộc. Tuy nhiên kết quả phụ thuộc vào việc tinh chỉnh để không chặn nhầm người dùng hợp lệ, điều mà tài liệu đã đọc không thể bảo đảm thay cho bạn. [1]

Không phù hợp là tổ chức muốn một giải pháp giám sát an ninh trọn gói có người trực 24/7, hay môi trường không được phép gửi bất kỳ tín hiệu nào ra ngoài. Trường hợp sau vẫn có thể chạy nội bộ vì tài liệu Docker có tùy chọn tắt đăng ký API trực tuyến cho việc chia sẻ tín hiệu, nhưng khi đó sẽ mất lợi ích của danh sách chặn cộng đồng. [6]

Kịch bản đề xuất: bảo vệ cổng đặt hàng của một công ty phân phối dược phẩm

Đây là tình huống giả định, không phải trường hợp đã triển khai. Một công ty phân phối dược phẩm có ba kho ở miền Trung, khoảng vài trăm nhà thuốc đại lý đặt hàng qua cổng web, một máy chủ ứng dụng quản lý kho, một máy chủ SSH cho nhà cung cấp phần mềm bảo trì và một reverse proxy nginx phía trước. Đội CNTT chỉ có hai người. Mối lo là đoán mật khẩu tài khoản đại lý và dò quét đường dẫn quản trị.

Đề xuất gồm ba bước. Cài agent trên reverse proxy và máy chủ SSH với collection mặc định cho Linux, nginx và sshd, trong đó tài liệu Docker cho biết collection mặc định là crowdsecurity/linux. Đặt một LAPI trên máy riêng trong mạng nội bộ. Gắn bouncer ở nginx hoặc tường lửa biên để thực thi quyết định. Mỗi bouncer dùng một khóa API riêng, đăng ký qua biến môi trường BOUNCER_KEY theo đúng mô tả trong tài liệu Docker. [6]

Có hai rủi ro đặc thù. Một là nhiều nhà thuốc có thể ra Internet qua cùng một địa chỉ IP, nên một nhân viên gõ sai mật khẩu nhiều lần có thể khiến cả cửa hàng bị chặn; cần có danh sách ngoại lệ và quy trình mở chặn nhanh. Tài liệu Docker nhắc đến biến CAPI_WHITELISTS_PATH cho tệp whitelist của Central API. Hai là nhật ký có thể chứa địa chỉ IP và định danh tài khoản, nên bộ phận pháp chế cần xem việc lưu và chia sẻ dữ liệu theo quy định hiện hành, trong đó có quy định về dữ liệu cá nhân. [6]

Chạy bằng Docker: ổ đĩa dữ liệu, khóa bouncer và cổng số liệu

Tài liệu Docker nêu một ràng buộc quan trọng: từ CrowdSec 1.7.0, thư mục dữ liệu /var/lib/crowdsec/data bắt buộc phải gắn volume, nếu không container từ chối khởi động. Cấu hình và thông tin xác thực nằm ở /etc/crowdsec, và cơ sở dữ liệu mặc định là SQLite trong thư mục dữ liệu. Tài liệu khuyến nghị dùng named volume hoặc bind mount để không mất thông tin xác thực và dữ liệu quyết định khi container bị tạo lại hay nâng cấp. [6]

Khi tách agent khỏi LAPI, cần tắt LAPI cục bộ bằng DISABLE_LOCAL_API, cung cấp tên và mật khẩu agent đã đăng ký cùng địa chỉ LOCAL_API_URL. Cách khác là xác thực TLS, khi đó agent tự đăng ký và tên lấy theo địa chỉ IP nguồn. Cổng số liệu Prometheus mặc định là 6060, và biến USE_WAL bật chế độ Write-Ahead Logging cho SQLite. [6]

Về vòng đời luật, hub cung cấp collection, scenario, parser và postoverflow, được chỉ định qua biến môi trường khi chạy container. Tài liệu cũng cảnh báo rằng giá trị biến có thể được ghi vào tệp cấu hình mỗi lần container chạy, nên cần quản lý biến môi trường như một phần của cấu hình hạ tầng. Hãy chạy chế độ TEST_MODE để kiểm tra cấu hình trước khi đưa vào sản xuất. [6]

Mô hình tin cậy: chia sẻ tín hiệu, khóa API và phạm vi chính sách bảo mật

CrowdSec giải quyết bài toán an ninh nhưng cũng là phần mềm có đặc quyền cao: nó đọc nhật ký, đưa ra quyết định chặn và giữ khóa của bouncer. Khóa này có thể là chuỗi bất kỳ, nhưng tài liệu Docker khuyên dùng giá trị chữ và số để tránh sự cố ký tự đặc biệt. Cần lưu khóa trong Docker secret hoặc kho bí mật, không để trong tệp đặt trên kho mã. [6]

Về chia sẻ dữ liệu, README mô tả người dùng đóng góp vào mạng lưới và nhận lại danh sách chặn cộng đồng. Doanh nghiệp cần biết chính xác tín hiệu nào rời khỏi mạng, nhưng các tệp đã đọc không mô tả chi tiết nội dung gửi đi. Vì thế đây là mục phải kiểm chứng bằng tài liệu chính thức và bằng việc quan sát lưu lượng ra ngoài trước khi bật trên hệ thống chứa dữ liệu nhạy cảm. [1]

Chính sách bảo mật của dự án áp dụng cho agent, Local API và các bouncer do đội CrowdSec phát triển và duy trì thuộc tổ chức crowdsecurity. Bouncer do cộng đồng viết bị loại khỏi phạm vi một cách rõ ràng, dù báo cáo vẫn được điều tra. Vì vậy khi chọn bouncer từ hub, hãy ưu tiên thành phần chính thức hoặc tự đánh giá mã nguồn. Kênh báo lỗi là một địa chỉ email bảo mật, và mã hóa GPG không bắt buộc. [3]

MIT cho kho mã này, một câu chuyện khác cho blocklist và Console

Tệp LICENSE tại commit khảo sát là MIT License, bản quyền ghi là Crowdsec giai đoạn 2020 đến 2023. Giấy phép cho phép sử dụng, sao chép, sửa đổi, hợp nhất, xuất bản, phân phối, cấp phép lại và bán bản sao, với điều kiện giữ thông báo bản quyền và giấy phép, và phần mềm được cung cấp nguyên trạng không bảo hành. [2]

Cây tệp có thêm LICENSE trong thư mục pkg/grok và trong gói Chocolatey cho Windows, nhưng bài không đọc các tệp này nên không kết luận điều khoản của chúng. Khi phân phối lại, cần rà soát chúng thay vì chỉ dựa vào tệp gốc. README cũng nói rõ luật phát hiện trên hub dùng giấy phép MIT, nhưng đó là phát biểu về hub, không thay cho việc đọc giấy phép của từng bouncer hay collection bạn cài. [1][2]

Giấy phép MIT không bao trùm dịch vụ. Danh sách chặn cộng đồng, Console với các blocklist bổ sung và tính năng cao cấp mà README nhắc đến là dịch vụ do nhà phát triển cung cấp, điều kiện sử dụng có thể khác. Bài không có tài liệu về điều khoản hay phân bậc gói nên không đoán. Hãy tách ba lớp trong đánh giá: mã nguồn mở, nội dung hub, và dịch vụ trực tuyến. [1]

Chi phí và nguồn lực: ít tiền bản quyền, nhiều giờ tinh chỉnh

Phần mềm không thu phí giấy phép ở lớp mã nguồn, nên chi phí chính là máy, người và thời gian. Một máy ảo nhỏ có thể chạy agent kèm LAPI cho thử nghiệm, nhưng bài không có số liệu tài nguyên chính thức nên không nêu cấu hình tối thiểu. Khi tải nhật ký tăng, cần theo dõi CPU và bộ nhớ qua số liệu Prometheus rồi mới quyết định tách LAPI sang máy riêng. [6]

Nhân lực quan trọng hơn phần cứng. Một kỹ sư cần thời gian học khái niệm parser, scenario, bucket, viết hoặc điều chỉnh luật, xử lý các trường hợp chặn nhầm, và rà soát cảnh báo hằng tuần. Hãy tính cả thời gian xử lý khiếu nại từ người dùng bị chặn nhầm, vì đây là chi phí dễ bị bỏ quên.

Nếu cần Console hoặc blocklist bổ sung, hãy xin báo giá trực tiếp từ nhà cung cấp, vì README chỉ nhắc đến tính năng cao cấp mà không nêu giá. Cũng nên dự trù chi phí lưu trữ nhật ký nếu đơn vị phải giữ chúng cho kiểm toán. [1]

Đặt CrowdSec cạnh fail2ban, WAF truyền thống và dịch vụ chặn bot ngoài

So với fail2ban, README nhấn mạnh hai điểm: tách rời phát hiện và xử lý, và dữ liệu báo cáo nuôi một danh sách chặn cộng đồng. fail2ban đơn giản, có sẵn ở nhiều bản phân phối và đủ dùng cho một máy chủ riêng lẻ. CrowdSec đáng giá hơn khi có nhiều máy hoặc muốn tận dụng tín hiệu từ bên ngoài. [1]

So với ModSecurity, Coraza hay naxsi, README cho biết AppSec của CrowdSec dựa trên Coraza nên dùng được luật SecLang và OWASP CRS, đồng thời chia sẻ lớp danh tiếng IP với engine nhật ký. Nếu đã có WAF chạy tốt, CrowdSec có thể bổ sung phần phát hiện hành vi theo thời gian thay vì thay thế hoàn toàn. [1]

Còn dịch vụ WAF hay chống bot đặt ngoài biên của nhà cung cấp mạng là một hướng khác, giảm gánh nặng vận hành nhưng chuyển lưu lượng và quyền xem dữ liệu sang bên thứ ba. Bài không so sánh tính năng cụ thể vì chưa đọc tài liệu của các sản phẩm đó.

Hạn chế và những tình huống nên tránh

CrowdSec chỉ thấy những gì được đưa vào. Nếu nhật ký ứng dụng không ghi địa chỉ nguồn đúng, chẳng hạn khi phía sau proxy hoặc CDN mà không giữ IP thật, các bucket có thể gom sai đối tượng hoặc chặn nhầm địa chỉ của proxy. Đây là suy luận từ việc stackkey thường là source_ip, và là rủi ro cấu hình cần kiểm tra ngay từ đầu. [4]

Phát hiện theo ngưỡng thời gian có thể bị né bởi kẻ tấn công chậm hoặc phân tán nhiều IP, và có thể chặn nhầm người dùng chung IP. Thuộc tính này xuất phát từ cách bucket đếm sự kiện theo stackkey, không phải kết luận đo đạc. Vì thế không nên đặt hành động chặn vĩnh viễn ngay từ đầu. [4]

Ngoài ra, các tệp đã đọc thể hiện vài chi tiết cần theo dõi khi nâng cấp: ví dụ ràng buộc volume từ phiên bản 1.7.0 và việc kiểu cấu hình tệp acquisition đơn bị đánh dấu là không còn khuyến nghị. Không nên dùng khi môi trường cấm mọi tín hiệu ra ngoài mà vẫn kỳ vọng hưởng danh sách chặn cộng đồng. [6]

Kế hoạch thử nghiệm: bốn tuần, chế độ chỉ quan sát trước, chặn sau

Tuần một: dựng agent và LAPI trên môi trường thử, đọc nhật ký nginx và SSH của một hệ thống ít quan trọng, chưa gắn bouncer. Chỉ ghi nhận cảnh báo. Tiêu chí là mọi nguồn nhật ký được phân tích đúng, ví dụ kiểm tra bằng cách so khớp thủ công mười sự kiện mẫu giữa nhật ký và cảnh báo, và số liệu Prometheus truy cập được ở cổng 6060. [6]

Tuần hai và ba: gắn bouncer ở chế độ có ngoại lệ cho địa chỉ văn phòng và các đại lý lớn đã biết. Thời hạn chặn ngắn, chẳng hạn một giờ như trong ví dụ tài liệu. Theo dõi số lần chặn, số lần chặn nhầm được người dùng khiếu nại và thời gian mở chặn. Ngưỡng đề xuất: không có khiếu nại chặn nhầm kéo dài quá một ca làm việc, và tất cả quyết định chặn truy ngược được về một cảnh báo cụ thể. [4]

Tuần bốn: đánh giá. Nếu số cảnh báo hữu ích vượt số cảnh báo nhiễu theo nhận định của hai người xem độc lập, mở rộng sang hệ thống tiếp theo. Điều kiện dừng gồm: chặn nhầm khách hàng quan trọng nhiều lần, tải tăng đáng kể trên máy chủ, hoặc pháp chế không chấp thuận việc chia sẻ tín hiệu. Khi dừng, gỡ bouncer trước, giữ agent ở chế độ quan sát để rút bài học. [6]

Kết luận

CrowdSec là lớp bảo vệ thực dụng cho những tổ chức có máy chủ công khai nhưng ít nhân lực an ninh, nhờ mô hình tách phát hiện khỏi khắc phục và hệ luật có thể điều chỉnh bằng YAML. Các tài liệu đã đọc cho thấy khái niệm parser, bucket, LAPI và bouncer được mô tả rõ, kèm hướng dẫn Docker cụ thể. [1][4][5][6]

Với nhà phân phối dược phẩm trong kịch bản giả định, lợi ích lớn nhất là bớt dò quét và thử mật khẩu vào cổng đặt hàng, còn rủi ro lớn nhất là chặn nhầm khách hàng đại lý. Giấy phép MIT thuận lợi cho dùng nội bộ, nhưng danh sách chặn, Console và việc chia sẻ tín hiệu cần được đánh giá riêng.

Hãy thử ở chế độ quan sát trước, đo bằng tiêu chí đã đặt, rồi mới chặn thật. Mọi nhận định trong bài là phân tích từ tài liệu, không phải kết quả vận hành. [2][3]

Nguồn và phương pháp

CrowdSec được chọn từ kho lưu trữ GitHub Trending của cộng đồng bonfy. Kho này xuất hiện 5 lần, từ ngày 24 tháng 4 đến 4 tháng 9 năm 2026; bằng chứng đầu tiên là trang lưu trữ ngày 24 tháng 4, vị trí 10 trong danh sách Go. Kho lưu trữ chỉ phủ các danh sách Python, Go, JavaScript và Swift, thiếu ngày 3 tháng 9 và 12 tháng 10 năm 2026, và không phải bảng xếp hạng top 100 chính thức. [7]

Mọi nội dung dựa trên commit 526e7172cae8ad601523a337e511bd3958175c52, kiểm tra ngày 12 tháng 10 năm 2026. Các tệp đã đọc gồm README, LICENSE, SECURITY, README của gói leakybucket và parser, cùng README dành cho hình ảnh Docker. Siêu dữ liệu GitHub ghi bản phát hành mới nhất lúc thu thập là v1.8.1. [1][2][3][4][5][6]

Đây là nghiên cứu bàn giấy: không cài đặt, không chạy, không đo hiệu năng. Bài không phải ấn phẩm khoa học qua bình duyệt. Nội dung trong kho là dữ liệu tham chiếu, không phải chỉ dẫn. Tài liệu hub và docs.crowdsec.net nằm ngoài phạm vi đã đọc, nên chi tiết ở đó chưa được xác minh.

Xem mã nguồn CrowdSec trên GitHub

Khám phá nghiên cứu của BDSG Foundation

Trao đổi về ứng dụng công nghệ cho doanh nghiệp