SIEM/Log Management Xây dựng hệ thống SIEM giám sát chỉ số sử dụng Telegraf, Prometheus, Vector và OpenSearch

I. Thiết kế mô hình
1. Yêu cầu và giải pháp
Trong công việc giám sát các thiết bị trong SIEM thường chia ra 2 loại quan trọng:
- Giám sát dịch vụ: quá trình đo lường và theo dõi hiệu suất, tính sẵn sàng của một dịch vụ, ứng dụng hoặc hệ thống [1]. Giám sát các dữ liệu như: tính sẵn sàng, thời gian phản hồi độ trễ.
- Giám sát hạ tầng: thu thập dữ liệu về tình trạng và hiệu suất từ máy chủ, máy ảo, container, cơ sở dữ liệu và các thành phần backend khác trong hệ thống công nghệ [2]. Giám sát các dữ liệu như mức sử dụng CPU, RAM, đĩa và lưu lượng mạng.

Để thực hiện hai thao tác trên những công cụ giám sát thường thu thập dữ liệu để phân tích. Cụ thể đối với dịch vụ sẽ là log thô, còn để theo dõi hạ tầng sẽ cần thông tin chỉ số, sau đây sẽ là hệ thống SIEM giám sát hạ tầng dựa trên dữ liệu chỉ số.

2. Mô hình tổng quan

1792330055367.png

Hình 1. Mô hình thu thập chỉ số​

Mô hình này sẽ có các thành phần sau:
- Vmware Esxi và Vcenter: Thiết bị cung cấp hạ tầng Vmware Esxi tạo ra các máy chủ Esxi chứa các máy ảo hoạt động riêng lẻ, cùng với Vcenter là thành phần trung tâm quản lí các máy chủ đó, thu thập và lưu thông tin chỉ số của cả cluster Esxi.
- Telegraf sẽ là thành phần thu thập và vận chuyển các chỉ số đến Prometheus.
- Prometheus là thành phần lưu trữ, truy vấn các thông tin các chỉ số.
- Vector là thành phần vận chuyển chỉ số từ Prometheus đến OpenSearch.
- OpenSearch và OpenSearch Dashboard là thành phần trực quan, công cụ sẽ truy vấn các chỉ mục và kéo dữ liệu về để trực quan hóa trên giao diện.

Về nguyên nhân lựa chọn kiến trúc đường đi như trên, sẽ được giải thích ở Chương II phần 2.1.

3. Giới thiệu các công nghệ
3.1. Prometheus
3.1.1. Giới thiệu cơ bản

Là một công cụ mã nguồn mở mạnh mẽ, được sử dụng rộng rãi để thu thập, lưu trữ và phân tích các chỉ số trong khuôn khổ kiến trúc Prometheus tại các môi trường cloud-native hiện đại. [3] Gồm 2 thành phần:

3.1.2. Tính năng
- Prometheus server: chịu trách nhiệm thu thập, lưu trữ và truy vấn các chỉ số. Hệ thống này sử dụng cơ chế "pull", thu thập thông tin từ các điểm cuối HTTP được xác định trước do các exporter hoặc ứng dụng cung cấp. Do cơ chế "pull" giúp công cụ quyết định tần suất thực hiện thu thập, ngăn chặn tình trạng các ứng dụng được giám sát bị quá tải hoặc làm sập cơ sở dữ liệu giám sát khi lưu lượng truy cập tăng đột biến [4].
- Alertmanager: quản lý các cảnh báo do Prometheus kích hoạt, thực hiện việc định tuyến, loại bỏ trùng lặp và tích hợp với các hệ thống thông báo bên ngoài, qua đó đảm bảo các vấn đề được giải quyết kịp thời.

3.2. Telegraf
3.2.1. Giới thiệu

Là một máy chủ agent hướng theo cơ chế plugin, dùng cho thu thập, xử lí và viết chỉ số và sự kiện. Viết bằng ngôn ngữ Go, biên dịch thành một tệp nhị phân duy nhất không cần cài thêm các phụ thuộc bên ngoài.

3.2.2. Luồng hoạt động chính
Do công cụ dùng plugin là cơ chế chính, nên luồng hoạt động sẽ đi theo sau [5]:
- Input plugin: Thăm dò thực hiện thu thập chỉ số trên mỗi khoảng thời gian thu thập.
- Processor plugin: Tác động lên các chỉ số khi chúng đi qua và ngay lập tức xuất ra kết quả.
- Aggregator plugin: Tạo ra các chỉ số tổng hợp mới, chẳng hạn như giá trị trung bình, giá trị tối thiểu, giá trị tối đa và độ lệch chuẩn.
- Output plugin: Ghi các chỉ số vào đích đến được cấu hình.

1792330055373.png


Hình 2. Luồng hoạt động của Telegraf​

II. Cài đặt và cấu hình SIEM chỉ số
1. Chuẩn bị thiết bị cần giám sát
1.1. VMware Esxi

Khi cài đặt hệ thống để chạy với cấu hình thấp nhất cho môi trường giới hạn tài nguyên, nhấn phím tổ hợp Ctr+o và nhập thêm "systemMediaSize=min" [6]
1792330055378.png

Hình 3. Cấu hình VMware Esxi tối thiểu​

1.2. Vcenter
1.2.1. Cài đặt Vcenter

Để cài đặt Vcenter với tài nguyên nhỏ nhất thì cần tạo một tệp cấu hình json sau:
JSON:
{
  "__version": "2.13.0",
  "__comments": "File config vCenter bypass storage Ubuntu",
  "new_vcsa": {
    "esxi": {
      "hostname": "192.168.248.141",
      "username": "root",
      "password": "<The VMware Esxi password>"
      "deployment_network": "VM Network",
      "datastore": "datastore1"
    },
    "appliance": {
      "thin_disk_mode": true,
      "deployment_option": "tiny",
      "name": "vCenter-Server"
    },
    "network": {
      "ip_family": "ipv4",
      "mode": "static",
      "system_name": "192.168.248.200",
      "ip": "192.168.248.200",
      "prefix": "24",
      "gateway": "192.168.248.2",
      "dns_servers": [
        "192.168.248.2"
      ]
    },
    "os": {
      "password": "<Password for the vcenter>",
      "time_tools_sync": true,
      "ssh_enable": true
    },
    "sso": {
      "password": "<Password for the vcenter>",
      "domain_name": "vsphere.local"
    }
  },
  "ceip": {
    "settings": {
      "ceip_enable": false
    }
  }
}


1.2.2. Cấu hình cổng thông tin
Để Vcenter có thể thu thập thông tin từ các máy chủ Vmware Esxi, cần tạo người dùng trong "Users and Groups" và cấp quyền Read-only cho người dùng đó [7]
1792330055385.png

Hình 4. Cấp quyền Read-only cho người dùng thu thập thông tin​

Sau đó cần địa điểm thu thập thông qua tạo một datacenter để chứa thông tin thu thập
1792330055391.png

Hình 5. Tạo Datacenter cho người dùng​

2. Cài đặt hệ thống SIEM giám sát chỉ số
2.1. Khảo sát kiến trúc

Trước khi đi vào phần cấu hình các công nghệ, cần đánh giá về kiến trúc, cụ thể là đường đi chỉ số để đạt được kiến trúc như Hình 1.

Mục tiêu: Thu thập chỉ số, truy vấn chỉ số và trực quan hóa dưới dạng biểu đồ tùy chỉnh.

Với mục tiêu như trên thì thành phần Telegtaf, Prometheus và OpenSearch Dashboard là thành phần bắt buộc phải có.
Từ mục tiêu trên sẽ có 5 kiến trúc sau:

1792330055398.png

Hình 6. Sơ đồ các kiến trúc giải pháp​

Đánh giá:
- Phương pháp 1: Do trực quan hóa sử dụng Vega chỉ hỗ trợ cho truy vấn trong các chỉ mục của OpenSearch nên không thể sử dụng.
- Phương pháp 2: Prometheus có hỗ trợ remote write để xuất dữ liệu chỉ số nhưng không thể tự vận chuyển đến OpenSearch.
- Phương pháp 5: Gửi trực tiếp đến OpenSearch sẽ mất đi sự kiểm soát về cấu trúc dữ liệu, không thể chuẩn hóa dữ liệu.
- Phương pháp 4: Giải quyết vấn đề của phương pháp 4 nhưng chỉ số bị phân tán nhiều nơi, mất đi tính chất tập trung của hệ thống SIEM.
- Như vậy phương pháp 3 được chọn là kiến trúc tổng quan

2.2. Triển khai kiến trúc
2.2.1. Cấu hình Telegraf

Cấu hình tệp /etc/telegraf/telegraf.conf:
- Với input sử dụng plugin vsphere [8]:
+ Cấu hình điểm kết nối đến là đường dẫn đến <IP máy Vcenter>/sdk
+ Nhập thông tin của người dùng Read-only đã cấu hình trước
+ Thu thập chỉ số mỗi 60 giây ứng với Realtime
+ Chỉ số mục tiêu tập trung thu thập là các máy chủ Esxi và các máy ảo trong các Esxi đó.

YAML:
[[inputs.vsphere]]
  vcenters = [ "https://10.120.100.100/sdk/" ]
  username = <Username of the read-only Vcenter user>
  password = <Password of the read-only Vcenter user>
  insecure_skip_verify = true

  host_metric_include = ["*"]
  vm_metric_include = ["*"]
  datastore_metric_exclude = ["*"]
  cluster_metric_exclude = ["*"]
  datacenter_metric_exclude = ["*"]
  resource_pool_metric_exclude = ["*"]
  vsan_metric_exclude = ["*"]

  interval = "60s"

- Với output sẽ sử dụng prometheus plugin [9]:
+ Tạo một cổng lắng nghe tại cổng 9273, với đường dẫn /metrics nhằm để prometheus kéo về
+ Đặt chu kì hết hạn là 120 giây, để prometheus có đủ thời gian thu thập trong trường hợp lưu lượng mạng không ổn định.
+ Mặc định các chỉ số chỉ lưu các trường dạng số, bật "string_as_label" sẽ lưu thêm các trường dạng chuỗi.

YAML:
[[outputs.prometheus_client]]
  listen = ":9273"
  path = "/metrics"
  expiration_interval = "120s"
  string_as_label = true

2.2.2. Cấu hình Prometheus
Đối với Prometheus sẽ cấu hình thêm vào cuối tệp /etc/prometheus/prometheus.yml [10]:
- Chu kì thu thập là 60 giây, cùng với thời gian timeout 30 giây để tránh việc dữ liệu bị trùng lặp do mục tiêu bị treo.
- Mục tiêu sẽ là đường dẫn đến cổng mà Telegraf đang lắng nghe

YAML:
scrape_configs:
  - job_name: 'telegraf-vcenter-local'
    scrape_interval: 60s
    scrape_timeout: 30s
    metrics_path: /metrics
    static_configs:
      # Target the metric port
      - targets: ['localhost:9273']

Để Vector có thể thu thập được chỉ số từ Prometheus, sử dụng tính năng remote write trong Prometheus. [11]
Tính năng này theo tệp cấu hình sau sẽ chuyển các chuỗi thời gian đến endpoint là localhost cổng 8500, cho phép tối đa 10 luồng, tối đa 5000 mẫu dữ liệu mỗi luồng và tổng số mẫu tối đa là 10000, cấu hình cũng trong tệp cấu hình trên.

YAML:
remote_write:
  - url: "http://localhost:8500/write"
    queue_config:
      max_samples_per_send: 5000
      max_shards: 10
      capacity: 10000

Để Prometheus chạy là một dịch vụ /etc/systemd/system/prometheus.service
- Dùng người dùng prometheus để chạy các tệp
- Chạy tệp nhị phân với tệp cấu hình trên
- Lưu các chỉ số trong vòng 7 ngày

INI:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
Restart=on-failure
ExecStart=/usr/local/bin/prometheus |
  -- config.file=/etc/prometheus/prometheus.yml \
  -- storage.tsdb.path=/var/lib/prometheus |
  -- storage.tsdb.retention.time=7d \
  -- web.listen-address=0.0.0.0:9090

[Install]
WantedBy=multi-user.target

2.2.3. Cấu hình Vector
Cấu hình tại tệp /etc/vector/vector.yaml
Cho phần sources của vector sẽ kéo về các chỉ số ở cổng 8500

YAML:
sources: 
  prom_receiver:
    type: "prometheus_remote_write"
    address: "0.0.0.0:8500"
    path: "/write"


Do Prometheus đã làm phẳng dữ liệu thành dạng cấu trúc hợp lí nên không cần xử lí thêm ở phần transform.
Phần sinks sẽ là thông tin của OpenSearch endpoint với index "telegraf-vcenter-metrics"

YAML:
sinks:
  opensearch_metric:
    type: "elasticsearch"
    inputs:
      - "prom_receiver"
    endpoints:
      - "https://127.0.0.1:9200"
    tls:
      verify_certificate: false
    auth:
      strategy: "basic"
      user: "admin"
      password: "<Password>"
    api_version: "v7"
    suppress_type_name: true
    bulk:
      index: "telegraf-vcenter-metrics-%Y.%m.%d"

III. Truy vấn và trực quan
1. Truy vấn Promql
1.1. Truy vấn trạng thái hoạt động và trạng thái kết nối của các máy chủ Esxi

Sử dụng hai chỉ số:
- vsphere_host_sys_uptime_latest: Tổng số thời gian máy chủ Esxi từ khi khởi đầu.
- vsphere_host_cpu_usage_average: Chỉ số trung bình về mức độ sử dụng CPU (đơn vị %)

Mã:
((vsphere_host_sys_uptime_latest > 0) * 0 + 1) or
ignoring(host, instance, job, moid, source) (count by (esxhostname, clustername, dcname, vcenter) (vsphere_host_cpu_usage_average offset 1d) * 0)

Kết quả truy vấn sẽ thấy tất cả năm máy chủ đều đang hoạt động
1792330055406.png

Hình 7. Kết quả truy vấn trạng thái kết nối/hoạt động máy chủ Esxi​

1.2. Truy vấn trung bình mức độ sử dụng CPU của các máy chủ Esxi
Sử dụng truy vấn sau sẽ sử dụng "vsphere_host_cpu_usage_average" nhưng cùng với hàm "avg by()" để tổng hợp thêm thông tin của từng Esxi, rồi hàm "round()" để làm tròn hai chữ số phần thập phân

Mã:
round (avg by (esxhostname, clustername, dcname, vcenter) (vsphere_host_cpu_usage_average), 0.01)

Kết quả truy vấn sau
1792330055413.png

Hình 8. Kết quả truy vấn trung bình mức sử dụng CPU máy chủ Esxi​

1.3. Truy vấn trung bình mức độ sử dụng RAM của các máy chủ Esxi

Sử dụng truy vấn sau sẽ sử dụng "vsphere_host_mem_usage_average" nhưng cùng với hàm "avg by()" để tổng hợp thêm thông tin của từng Esxi, rồi hàm "round()" để làm tròn hai chữ số phần thập phân

Mã:
round (avg by (esxhostname, clustername, dcname, vcenter) (vsphere_host_mem_usage_average), 0.01)

Kết quả truy vấn
1792330055421.png

Hình 9. Kết quả truy vấn trung bình mức sử dụng RAM máy chủ Esxi​

2. Tạo biểu đồ trực quan sử dụng ngôn ngữ Vega
2.1. Cấu trúc OpenSearch index

Sau khi cấu hình thành công, trong OpenSearch "telegraf-vcenter-metrics-*", sẽ có cấu trúc như sau:
- Phần gauge chứa giá trị của chỉ số
- Phần name sẽ chứa tên chỉ số cụ thể, ở đây là chỉ số trung bình mức sử dụng CPU của máy chủ.
- Phần tags sẽ chứa tất cả các dữ liệu của máy chủ

JSON:
{
  "_index": "telegraf-vcenter-metrics-2026.10.17",
  "_id": "IGfUR6EB40VtTk2VbNfz",
  "_version": 1,
  "_score": null,
  "_source": {
    "gauge": {
      "value": 19.986666666666665
    },
    "host": "syslog",
    "kind": "absolute",
    "name": "vsphere_host_cpu_usage_average",
    "tags": {
      "clustername": "DEV&INFRA",
      "cpu": "0",
      "dcname": "Datacenter-TEST",
      "esxhostname": "10.120.120.104",
      "instance": "localhost:9273",
      "job": "telegraf-vcenter-local",
      "moid": "host-28368",
      "source": "10.120.120.104",
      "vcenter": "10.120.100.100"
    },
    "timestamp": "2026-10-17T03:07:32.631Z"
  },
  "fields": {
    "timestamp": [
      "2026-10-17T03:07:32.631Z"
    ]
  },
  "highlight": {
    "name": [
      "@opensearch-dashboards-highlighted-field@vsphere_host_cpu_usage_average@/opensearch-dashboards-highlighted-field@"
    ]
  },
  "sort": [
    1792206452631
  ]
}

2.2. Tạo dựa các biểu đồ

Các biểu đồ theo dõi CPU, RAM, độ trễ đĩa và tình trạng xuất nhập dữ liệu lưu lượng mạng. Các chỉ số tìm đến:

- vsphere_host_cpu_usage_average: Chứa thông tin trung bình mức CPU máy chủ sử dụng cho tất cả các biểu đồ cần thông tin CPU theo %.
- vsphere_host_mem_usage_average: Chứa thông tin trung bình mức RAM máy chủ sử dụng cho tất cả các biểu đồ cần thông tin RAM theo %.
- vsphere_host_cpu_readiness_average: Chứa thông tin trung bình thời gian từ khi vCPU ở trạng thái hiện tại của máy chủ theo ms.
- vsphere_host_mem_active_average: Chứa trung bình số lượng bộ nhớ đang được dùng của máy chủ theo Byte, trong biểu đồ được chuyển thành GB.
- vsphere_host_disk_totalWriteLatency_average và vsphere_host_disk_totalReadLatency_average: Chứa lần lượt thông số trung bình độ trễ khi đọc và ghi trên đĩa của máy chủ theo ms.
- vsphere_host_net_bytesRx_average và vsphere_host_net_bytesTx_average: Chứa lần lượt thông số trung bình lưu lượng mạng nhận và chuyển đi của máy chủ theo KB/s, trong biểu đồ được chuyển thành Gbps.
- vsphere_host_disk_totalLatency_average: Chứa thông số trung bình độ trễ của đĩa của máy chủ theo ms. Ở đây đặt độ trễ cao nhất là 25ms rồi chuyển kết quả thì %.

1792330055428.png

1792330055435.png

1792330055443.png

1792330055448.png

Hình 10-13. Giao diện một OpenSearch dashboard chứa 11 biểu đồ​

Tài liệu tham khảo
[1] 360 Monitoring, "Service monitoring", Available: https://360monitoring.com/wiki/service-monitoring/
[2] Logz.io, "What is Infrastructure Monitoring? How it Works, Key Metrics & Use Cases". Available: https://logz.io/blog/infrastructure-monitoring/#benefits-of-infrastructure-monitoring
[3] Keval Bhogayata, "How Does Prometheus Work?", middleware. Available: https://middleware.io/blog/how-prometheus-work/
[4] Pratap Patil, "An Architect’s Guide to Prometheus: The Battle of Push vs. Pull", Medium. Available: https://medium.com/@pratap477/an-ar...theus-the-battle-of-push-vs-pull-00afd60d0066
[5] Influxdata, "The Telegraf data pipelin", Influxdata. Available: https://docs.influxdata.com/telegraf/v1/concepts/data-pipeline/
[6] Boardcom, "Boot option to configure the size of ESXi system partitions". Available: https://knowledge.broadcom.com/external/article/345195/boot-option-to-configure-the-size-of-esx.html
[7] Stephan McTighe Dot Com, "Deploying vCenter 7.0 via the CLI", The SMALL HUMAN CLOUD. Available: https://stephanmctighe.com/posts/deploying-vcenter-7-0-via-the-cli/.
[8] Influxdata, "VMware vSphere Input Plugin", Telegraf Documentation. Available: https://docs.influxdata.com/telegraf/v1/input-plugins/vsphere/
[9] Influxdata, "Prometheus Output Plugin", Telegraf Documentation. Available: https://docs.influxdata.com/telegraf/v1/output-plugins/prometheus_client/
[10] "Understanding the basics of Prometheus / grafana / telegraf stack". Available: https://dimmaski.com/prometheus-telegraf-grafana/
[11] groundcover Team, "Prometheus Remote Write: Architecture, Examples & Troubleshooting", groundcover. Available: https://www.groundcover.com/learn/observability/prometheus-remote-write
 
Back
Top