Trong CrowdSec, Datasource là cách bạn cấu hình để thu thập và xử lý các loại dữ liệu như log từ các nguồn khác nhau như file, dịch vụ journald, AWS CloudWatch, syslog, Docker, và nhiều nguồn khác. Datasource giúp CrowdSec hiểu và phân tích dữ liệu từ các nguồn khác nhau để phát hiện và ứng phó với các hành vi đe dọa.
Mỗi Datasource có cấu hình riêng, bao gồm các thông số như:
source
: Loại Datasource, ví dụ:file
(đối với file log),journald
(đối với dịch vụ journald),syslog
(đối với logs nhận thông qua giao thức syslog), và nhiều loại khác.log_level
: Cấp độ ghi log sử dụng trong Datasource, ví dụ:info
,warning
,error
,…transform
: Biểu thức cho phép bạn biến đổi hoặc tạo ra sự kiện từ dữ liệu log đầu vào.labels
: Các nhãn (labels) tùy chỉnh được gắn vào sự kiện để phân loại chúng hoặc thực hiện các tác vụ khác.
CrowdSec sử dụng Datasources để đảm bảo rằng nó có thể thu thập và xử lý dữ liệu từ nhiều nguồn khác nhau và áp dụng các phân tích, như parser và scenario, để phát hiện các hành vi đe dọa. Cấu hình Datasource đúng cách rất quan trọng để CrowdSec hoạt động hiệu quả trong việc bảo vệ hệ thống của bạn khỏi các mối đe dọa mạng.
Dưới đây là một số Datasource mà CrowdSec đang hỗ trợ:
- file
- Loại: Đọc từ các file riêng lẻ, biểu thức glob (glob expressions), và file nén
.gz
. - Stream: Có thể theo dõi liên tục dữ liệu log từ file.
- One-shot: Có thể đọc toàn bộ dữ liệu từ file chỉ một lần.
- Loại: Đọc từ các file riêng lẻ, biểu thức glob (glob expressions), và file nén
- journald
- Loại: Đọc từ dịch vụ journald thông qua bộ lọc (filter).
- Stream: Có thể theo dõi liên tục dữ liệu log từ journald.
- One-shot: Có thể đọc toàn bộ dữ liệu từ journald chỉ một lần.
- AWS cloudwatch
- Loại: Đọc từ một luồng dữ liệu (stream) hoặc nhóm log (log group) trong AWS CloudWatch.
- Stream: Có thể theo dõi liên tục dữ liệu log từ AWS CloudWatch.
- One-shot: Có thể đọc toàn bộ dữ liệu từ AWS CloudWatch chỉ một lần.
- syslog service
- Loại: Đọc các logs được nhận thông qua giao thức syslog.
- Stream: Có thể theo dõi liên tục dữ liệu log thông qua syslog protocol.
- One-shot: Không thể đọc toàn bộ dữ liệu từ syslog service một lần.
- docker
- Loại: Đọc logs từ các container Docker.
- Stream: Có thể theo dõi liên tục dữ liệu log từ các container Docker.
- One-shot: Có thể đọc toàn bộ dữ liệu log từ các container Docker chỉ một lần.
- AWS kinesis
- Loại: Đọc logs từ một luồng Kinesis.
- Stream: Có thể theo dõi liên tục dữ liệu log từ luồng Kinesis.
- One-shot: Không thể đọc toàn bộ dữ liệu từ luồng Kinesis một lần.
- Kafka
- Loại: Đọc logs từ một topic Kafka.
- Stream: Có thể theo dõi liên tục dữ liệu log từ topic Kafka.
- One-shot: Không thể đọc toàn bộ dữ liệu từ topic Kafka một lần.
- Windows Event
- Loại: Đọc logs từ Windows Event Log.
- Stream: Có thể theo dõi liên tục dữ liệu log từ Windows Event Log.
- One-shot: Không thể đọc toàn bộ dữ liệu từ Windows Event Log một lần.
- Kubernetes Audit
- Loại: Tiếp nhận dữ liệu audit logs từ một cluster Kubernetes thông qua một webhook.
- Stream: Có thể theo dõi liên tục dữ liệu audit log từ cluster Kubernetes thông qua webhook.
- One-shot: Không thể đọc toàn bộ dữ liệu từ cluster Kubernetes một lần.
- S3
- Loại: Đọc logs từ một bucket S3.
- Stream: Có thể theo dõi liên tục dữ liệu log từ bucket S3.
- One-shot: Có thể đọc toàn bộ dữ liệu log từ bucket S3 chỉ một lần.
Mỗi loại Datasource này cung cấp khả năng đọc và theo dõi dữ liệu log từ các nguồn khác nhau, cho phép CrowdSec phát hiện và phản ứng đối với các hoạt động đáng ngờ hoặc không bình thường trong hệ thống của bạn. Tùy thuộc vào môi trường của bạn, bạn có thể chọn loại Datasource phù hợp nhất với nhu cầu của mình.
Dưới đây là bảng mô tả tóm tắt khả năng của mỗi loại Datasource trong việc theo dõi liên tục dữ liệu log (Stream) và đọc toàn bộ dữ liệu từ log (One-shot). Bạn có thể chọn loại Datasource phù hợp với nhu cầu của bạn, tùy thuộc vào nguồn dữ liệu log bạn muốn theo dõi và cách bạn muốn quản lý nó.
Loại | Stream | One-shot |
---|---|---|
file | Có thể | Có thể |
journald | Có thể | Có thể |
AWS cloudwatch | Có thể | Có thể |
syslog service | Có thể | Không |
docker | Có thể | Có thể |
AWS kinesis | Có thể | Không |
Kafka | Có thể | Không |
Windows Event | Có thể | Không |
Kubernetes Audit | Có thể | Không |
S3 | Có thể | Có thể |
Tiếp theo là chi tiết về các tham số cấu hình phổ biến mà bạn có thể sử dụng trong tất cả các loại Datasource:
- log_level (mức log)
- Đây là mức độ của các thông điệp log được ghi bởi Datasource. Mức mặc định là “info” (thông tin).
- source (nguồn)
- Tham số này chỉ định loại Datasource bạn đang sử dụng. Thông tin này là bắt buộc, trừ khi bạn đang sử dụng Datasource loại “file acquisition” (đọc từ file).
- transform (biến đổi)
- Tham số này cho phép bạn chỉ định một biểu thức sẽ được thực thi sau khi Datasource đã đọc một dòng log và trước khi dòng log đó được gửi đến các parsers (bộ phân tích).
- Biểu thức này cho phép bạn chỉnh sửa sự kiện (event) hoặc tạo ra nhiều sự kiện từ một dòng log trước khi chúng được phân tích.
- Ví dụ, nếu bạn đang thu thập các logs từ một file chứa các đối tượng JSON trên mỗi dòng, và mỗi đối tượng có một mảng “Records” chứa nhiều sự kiện, bạn có thể sử dụng biểu thức sau để tạo ra một sự kiện cho mỗi phần tử trong mảng:
map(JsonExtractSlice(evt.Line.Raw, "Records"), ToJsonString(#))
- Biểu thức này phải trả về:
- Một chuỗi: nó sẽ thay thế evt.Line.Raw trong sự kiện.
- Một danh sách các chuỗi: Mỗi sự kiện mới sẽ được tạo ra dựa trên sự kiện nguồn cho từng phần tử trong danh sách. Mỗi phần tử sẽ thay thế evt.Line.Raw từ sự kiện nguồn.
- Nếu biểu thức trả về một lỗi hoặc kiểu dữ liệu không hợp lệ, sự kiện sẽ không được sửa đổi trước khi gửi đến các parsers.
labels (nhãn)
- Tham số này cho phép bạn chỉ định một bản đồ (map) các nhãn mà bạn muốn thêm vào sự kiện. Nhãn “type” là bắt buộc và được sử dụng bởi Security Engine để xác định parser nào sẽ được sử dụng để phân tích sự kiện.
Ví dụ về một cấu hình trong file /etc/crowdsec/acquis.yaml
.
filenames:
- /var/log/nginx/*.log
labels:
type: nginx
---
filenames:
- /var/log/auth.log
- /var/log/syslog
labels:
type: syslog
---
source: docker
container_name_regexp:
- .*caddy*
labels:
type: caddy
---
...
Cảnh báo về sự quan trọng của trường “labels” và trường “type” cũng như sự cần thiết của ký tự “—” giữa các Datasource.
Mình giải thích như sau:
- Trường “labels” và “type”
- Trường “labels” và “type” là hai trường quan trọng trong cấu hình của mỗi Datasource.
- Trường “labels” cho phép bạn gắn các nhãn (labels) tùy chỉnh vào sự kiện (event) được thu thập. Nhãn này có thể được sử dụng cho mục đích xác định hoặc phân loại sự kiện.
- Trường “type” là một nhãn bắt buộc và quan trọng. Nó được sử dụng bởi Security Engine để xác định parser nào sẽ được áp dụng để phân tích sự kiện. Mặc dù các trường khác trong cấu hình Datasource có thể được tùy chỉnh, nhưng “type” phải được đặt đúng để đảm bảo sự kiện được xử lý đúng cách.
- Ký tự “—“
- Ký tự “—” được sử dụng để phân tách các Datasource riêng lẻ trong cùng một file cấu hình.
- Điều này là cần thiết vì một Datasource có thể chứa nhiều loại logs khác nhau. Khi csconfig đọc file này, nó phải biết khi nào kết thúc một Datasource và bắt đầu Datasource tiếp theo, vì vậy chúng ta sử dụng ký tự “—” để chỉ định điểm phân chia giữa chúng.