SIEM/Log Management [Phần 4] Triển khai Pipeline Node trong hệ thống SIEM trên service, có cluster (Opensearch + Wazuh Manager + Vector)

Mô hình triển khai:

1764052235933.png

Chú thích
: Các node Management + Agent Management; Log pipeline + Load Blancing sẽ được gộp lại để giảm chi phí triển khai.

VMIP
Data0110.30.194.181
Data0210.30.194.182
Data0310.30.194.183
Dashboard10.30.194.184
Manager0110.30.194.185
Manager0210.30.194.186
Pipeline0110.30.194.187
Pipeline0210.30.194.188

Vai trò của Pipeline Node trong hệ thống:​

1. Đảm bảo tính Sẵn sàng cao (High Availability - HA)​

Đây là vai trò của cặp đôi KeepAlived + Nginx.
  • Vấn đề: Nếu gửi log thẳng từ Wazuh, các agent sang Vector 1, khi Vector 1 chết, toàn bộ log sẽ mất.
  • Giải pháp:
    • KeepAlived tạo ra một IP Ảo (VIP). IP này giống như một biển hiệu công ty không bao giờ tắt. Nếu trụ sở 1 (Node 1) cháy, biển hiệu tự động chuyển sang trụ sở 2 (Node 2).
    • Wazuh và Agent chỉ cần biết gửi đến IP Ảo này, không cần quan tâm máy nào đang sống hay chết.
=> Hệ thống không bao giờ bị gián đoạn.

2. Cân bằng tải (Load Balancing)​

Đây là vai trò của Nginx.
  • Vấn đề: Wazuh Manager và Agent đẩy lượng log khổng lồ về. Nếu dồn hết vào một máy xử lý, máy đó sẽ bị treo (Overload), trong khi máy kia ngồi chơi.
  • Giải pháp:
    • Nginx đứng ở cửa, nhận toàn bộ log.
    • Nó chia đều log cho Vector Node 1Vector Node 2.
=> Tối ưu hóa tài nguyên phần cứng, không có máy nào bị quá tải.

3. Giảm tải và Tiền xử lý (Offloading & Parsing)​

Đây là vai trò của Vector (Aggregator).
  • Vấn đề: Log thô (Raw log) từ Wazuh là dạng JSON text hoặc chuỗi string lộn xộn.
  • Giải pháp:
    • Vector tại Pipeline Node sẽ thực hiện việc này: Parse JSON, đổi tên trường, lọc bỏ field rác, thêm nhãn (tagging).
    • Nó gửi cho OpenSearch dữ liệu đã được parsing.

4. Cơ chế "Vùng đệm" (Buffering & Backpressure)​

  • Vấn đề: Giả sử hệ thống bị tấn công DDoS, Wazuh sinh ra 100.000 log/giây. OpenSearch chỉ nuốt được 50.000 log/giây. Nếu đẩy thẳng, OpenSearch sẽ sập hoặc từ chối kết nối (mất log).
  • Giải pháp:
    • Vector có cơ chế Buffer trên RAM hoặc Đĩa cứng.
    • Khi log đến quá nhanh, Vector sẽ tạm giữ log trong kho của nó.
    • Sau đó nó từ từ đẩy sang OpenSearch với tốc độ mà OpenSearch chịu đựng được.
=> Bảo vệ OpenSearch không bị quá tải

5. Gom và Nén dữ liệu (Batching & Compression)​

  • Vấn đề: Gửi từng dòng log một qua mạng sẽ làm nghẽn băng thông do mỗi gói tin đều phải có header TCP/IP.
  • Giải pháp:
    • Vector gom 1000 dòng log hoặc gom đủ 1MB dữ liệu thành một gói to (Batch).
    • Nén gói đó lại (Gzip).
    • Gửi 1 lần sang OpenSearch.
=> Tiết kiệm băng thông mạng và tăng tốc độ ghi (Indexing speed) cho OpenSearch.

Giới thiệu cơ chế HA:​

Giải pháp HA active-passive dựa trên keepalived và sử dụng giao thức VRRP (Virtual Router Redundancy Protocol). Sau khi cài đặt gói nginx-ha-keepalived và cấu hình keepalived, gói này sẽ chạy riêng biệt trên mỗi máy chủ NGINX trong cụm và quản lý một địa chỉ IP ảo dùng chung, toàn bộ server sẽ dùng chinh VIP và gia nhập vào một nhóm multicast (nhóm này dùng để gửi nhận các gói tin quảng bá VRRP).
Keepalived chỉ định một địa chỉ “chính” (MASTER) và gán địa chỉ IP ảo cho nó. Bản chính chịu trách nhiệm gửi gói tin quảng bá VRRP đến bản “sao lưu” (BACKUP) theo định kỳ, xác nhận rằng bản sao lưu vẫn hoạt động bình thường và đã xác minh rằng cả keepalived và NGINX đều đang chạy. Nếu bản sao lưu không nhận được ba quảng bá liên tiếp, nó sẽ trở thành bản chính mới và chiếm địa chỉ IP ảo.

Chi tiết triển khai:​

Cài và cấu hình nginx:
sudo apt-get update
sudo apt-get install nginx keepalived -y
Cấu hình keepalived /etc/keepalived/keepalived.conf:
Chọn node 10.30.194.187 làm MASTER:
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 55
priority 150
advert_int 1
unicast_src_ip 10.30.194.187
unicast_peer {
10.30.194.188
}
authentication {
auth_type PASS
auth_pass <custom-admin-password>
}
virtual_ipaddress {
10.30.194.200/24
}
}
Node 10.30.194.188 làm BACKUP:
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 55
priority 100
advert_int 1
unicast_src_ip 10.30.194.188
unicast_peer {
10.30.194.187
}
authentication {
auth_type PASS
auth_pass <custom-admin-password>
}
virtual_ipaddress {
10.30.194.200/24
}
}
Chú thích:
  • vrrp_instance: thông tin chi tiết về một server trong nhóm dùng chung VRRP
  • state (MASTER | BACKUP): chỉ trạng thái MASTER hoặc BACKUP được sử dụng bởi máy chủ.
  • interface: chỉ định cổng mạng sẽ sử dụng trong hoạt động VRRP
  • virtual_router_id: là số định danh cho các router trong cùng 1 nhóm VRRP (dùng đer phân biệt nhiều phiên keepalived đang chạy trên cùng 1 interface)
  • priority: chỉ định độ ưu tiên cho VRRP router (giá trị từ 0-255), priority cao nhất thì nó sẽ lad MASTER, nếu priority bằng nhau thì IP cao hơn sẽ là MASTER
  • advert_int: thời gian giữa các lần gửi gói VRRP, đơn vị là 1s
  • authentication: chỉ định phương thức xác thực (auth_type) và mật khẩu (auth_pass ) trong VRRP
Start, enable service keepalived:
sudo systemctl restart keepalived
sudo systemctl enable keepalived
Cấu hình nginx:
Tạo và chỉnh sửa file cấu hình/etc/nginx/conf.d/vector_lb.conf
upstream vector_cluster {
server 10.30.194.187:8080;
server 10.30.194.188:8080;

keepalive 64;
}

server {
listen 9000;

access_log off;
error_log /var/log/nginx/vector_error.log warn;

location / {
proxy_pass http://vector_cluster;

proxy_http_version 1.1;
proxy_set_header Connection "";

proxy_buffering off;

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
Check cấu hình và enable, start service nginx:
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl enable nginx
Cài vector:
bash -c "$(curl -L https://setup.vector.dev)"
sudo apt-get install vector
Nginx đẩy log vào port 8080, mở port 8080 trên vector để thu log:
Cấu hình file /etc/vector/vector.yaml
sources:
nginx_logs:
type: http_server
address: 0.0.0.0:8080

transforms:
parse_logs:
type: remap
inputs: ["nginx_logs"]
source: |
. = parse_json!(string!(.message))

sinks:
to_opensearch:
type: elasticsearch
inputs: ["parse_logs"]
endpoints:
- "https://10.30.194.181:9200"
- "https://10.30.194.182:9200"
- "https://10.30.194.183:9200"
api_version: "v7"
bulk:
index: "{{ index_name }}"
request:
concurrency: 2
auth:
strategy: basic
user: admin
password: "<custom-admin-password>"
tls:
verify_certificate: false
verify_hostname: false
Load config mới:
sudo systemctl enable vector
sudo systemctl start vector
 
Back
Top