Võ Đức Chính
Intern
Mô hình triển khai:
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.
| VM | IP |
| Data01 | 10.30.194.181 |
| Data02 | 10.30.194.182 |
| Data03 | 10.30.194.183 |
| Dashboard | 10.30.194.184 |
| Manager01 | 10.30.194.185 |
| Manager02 | 10.30.194.186 |
| Pipeline01 | 10.30.194.187 |
| Pipeline02 | 10.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.
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 1 và Vector Node 2.
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.
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.
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 |
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 } } |
| 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 } } |
- 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
| sudo systemctl restart keepalived sudo systemctl enable keepalived |
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; } } |
| sudo nginx -t sudo systemctl restart nginx sudo systemctl enable nginx |
| bash -c "$(curl -L https://setup.vector.dev)" sudo apt-get install vector |
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 |
| sudo systemctl enable vector sudo systemctl start vector |
Bài viết liên quan
Được quan tâm
Bài viết mới