SIEM/Log Management [SIEM/Log Management] Tìm hiểu và triển khai thu thập log bằng vector.dev

1758014823860.png
  • Vector là một pipeline dữ liệu observability hiệu suất cao, cho phép thu thập, chuyển đổi và định tuyến log, metrics, và sắp có cả traces đến các nhà cung cấp (vendors) tùy chọn của bạn mà không bị khóa bởi nhà cung cấp nào.
  • Được phát triển bằng Rust, Vector có hiệu năng nhanh, an toàn bộ nhớ và ổn định.
Data model:
1758014913311.png

1. Nguồn dữ liệu

  • File, Syslog, Statsd … là các nguồn sinh ra raw data (logs, metrics).
  • Vector thu thập dữ liệu từ nhiều định dạng khác nhau.
  • Output của lớp này là Raw Data chưa chuẩn hóa.
Ý nghĩa: Vector hoạt động như một agent collector, gom dữ liệu từ nhiều nơi.

2. Chuẩn hóa dữ liệu

  • Sau khi nhận raw data, Vector chuẩn hóa nó thành Event — một cấu trúc thống nhất bên trong Vector.
  • Ví dụ: log từ syslog và metrics từ Statsd đều được ánh xạ vào một schema nội bộ.
Ý nghĩa: giúp Vector xử lý nhiều loại dữ liệu mà không phụ thuộc định dạng nguồn.

3. Xử lý & Biến đổi dữ liệu

  • Các transform là bước xử lý giữa event đầu vàopayload đầu ra.
  • Các transform phổ biến:
    • Parse → phân tích cú pháp log (ví dụ tách JSON, regex).
    • Sample → lấy mẫu để giảm tải.
    • Aggregate → gom nhóm, tổng hợp metrics/logs.
  • Bạn có thể dùng VRL (Vector Remap Language) để enrich, filter, normalize dữ liệu.
Ý nghĩa: Đây là nơi bạn làm sạch, enrich, tối ưu dữ liệu trước khi gửi đi.

4. Sinks (Điểm đến)

  • Vector gửi dữ liệu đã transform tới sinksnhư:
    • S3 (lưu trữ log thô hoặc backup).
    • Elasticsearch / OpenSearch (tìm kiếm & phân tích log).
    • Prometheus (metrics).
  • Mỗi sink mong đợi một payload ở định dạng riêng mà nó hiểu được.
Ý nghĩa: Vector là data router – đẩy dữ liệu đến đúng nơi, đúng định dạng.

Triển khai mô hình

Mô hình căn bản 1 server ,1 agent
Cài docker:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
newgrp docker
sudo apt install python3.12-venv -y
python3 -m ensurepip --upgrade
Tạo file docker-compose.yml:
services:
# --- OpenSearch Node 1 ---
opensearch-node1:
image: opensearchproject/opensearch:3
container_name: opensearch-node1
environment:
- cluster.name=opensearch-cluster
- node.name=opensearch-node1
- discovery.seed_hosts=opensearch-node1,opensearch-node2
- cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2
- bootstrap.memory_lock=true
- OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=Chinh123@
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- opensearch-data1:/usr/share/opensearch/data
ports:
- "9200:9200"
- "9600:9600"
networks:
- opensearch-net

# --- OpenSearch Node 2 ---
opensearch-node2:
image: opensearchproject/opensearch:3
container_name: opensearch-node2
environment:
- cluster.name=opensearch-cluster
- node.name=opensearch-node2
- discovery.seed_hosts=opensearch-node1,opensearch-node2
- cluster.initial_cluster_manager_nodes=opensearch-node1,opensearch-node2
- bootstrap.memory_lock=true
- OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m
- OPENSEARCH_INITIAL_ADMIN_PASSWORD=Chinh123@
ulimits:
memlock:
soft: -1
hard: -1
nofile:
soft: 65536
hard: 65536
volumes:
- opensearch-data2:/usr/share/opensearch/data
networks:
- opensearch-net

# --- OpenSearch Dashboards ---
opensearch-dashboards:
image: opensearchproject/opensearch-dashboards:3
container_name: opensearch-dashboards
ports:
- "5601:5601"
environment:
OPENSEARCH_HOSTS: '["https://opensearch-node1:9200","https://opensearch-node2:9200"]'
networks:
- opensearch-net

vector:
image: timberio/vector:nightly-2025-08-22-debian
container_name: vector
volumes:
- ./vector.yaml:/etc/vector/vector.yaml:ro
- vector-data:/vector-data-dir
networks:
- "opensearch-net"
ports:
- "6000:6000"
- "8686:8686"

volumes:
opensearch-data1:
opensearch-data2:
vector-data:

networks:
opensearch-net:
Tạo file vector.yaml:
data_dir: "/vector-data-dir"

api:
enabled: true
address: "0.0.0.0:8686"

sources:
from_agents:
type: vector
address: "0.0.0.0:6000"

transforms:
ensure_index_and_tags:
type: remap
inputs: ["from_agents"]
source: |
host_id = get_hostname!()
if exists(.agent_ip) && is_string(.agent_ip) && length!(.agent_ip) > 0 {
host_id = .agent_ip
}

# Tạo index theo agent_ip/ngày
date_str = format_timestamp!(now(), "%Y.%m.%d")
idx_str, err = host_id + "-" + date_str
if err != null { idx_str = host_id }

.index_name = idx_str
.received_at = now()
if !exists(.source_type) { .source_type = "agent" }

sinks:
opensearch_sink:
type: elasticsearch
inputs: ["ensure_index_and_tags"]
endpoints:
- "https://opensearch-node1:9200"
- "https://opensearch-node2:9200"
api_version: "v7"
bulk:
index: "{{ index_name }}"
request:
concurrency: 2
auth:
strategy: basic
user: admin
password: Chinh123@
tls:
verify_certificate: false
verify_hostname: false
Tạo file default.config:
server {
listen 80;
listen [::]:80;
server_name localhost;

access_log /var/log/nginx/host.access.log main;

location / {
root /usr/share/nginx/html;
index index.html index.htm;
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}

Sau khi tạo xong 3 file thực hiện: docker compose up -d
Setup Agent (Windows)
Tải vector cho windows .msi: [Vector releases](https://vector.dev/releases/?utm_source=chatgpt.com)
Vị trí của file config: C:\Program Files\Vector\config
Windows có thể xuất Event Log ra file .evtx hoặc .txt bằng lệnh PowerShell:
wevtutil epl System C:\Logs\system.evtx
wevtutil epl Application C:\Logs\application.evtx
wevtutil epl Security C:\Logs\security.evtx
Sửa file vector.yaml:
data_dir: "C:\\ProgramData\\vector"

api:
enabled: true
address: "0.0.0.0:8686"

sources:
win_eventlog:
type: windows_event_log
channels:
- Application
- System
- Security

transforms:
enrich_with_agent:
type: remap
inputs: ["win_eventlog"]
source: |
.agent_ip = get_host_ip!()
if !exists(.source_type) { .source_type = "windows_eventlog" }

sinks:
to_vector_server:
type: vector
inputs: ["enrich_with_agent"]
address: "10.30.194.200:6000"
healthcheck: true

 
Back
Top