SIEM/Log Management Tài liệu Kiến trúc và Cài đặt Prometheus Stack

1. Tổng quan Kiến trúc


Hệ thống giám sát được thiết kế dựa trên hệ sinh thái Prometheus, đảm bảo khả năng thu thập metics đa dạng từ máy chủ, thiết bị mạng và ứng dụng cơ sở dữ liệu. Để đảm bảo tính sẵn sàng cao (High Availability - HA) cho việc truy cập và query dữ liệu, Keepalived được sử dụng để cung cấp một Virtual IP (VIP).
Luồng hoạt động cơ bản:
  1. Các Exporter & Agent (Node, Windows, Telegraf, SNMP, Elasticsearch): Thu thập metrics từ các nguồn tương ứng và mở một cổng HTTP để expose dữ liệu.
  2. Prometheus Server: Chủ động "scrape" (pull) dữ liệu từ các endpoints này theo chu kỳ đã cấu hình.
  3. Keepalived: Gắn trước các máy chủ Prometheus để cung cấp một địa chỉ IP duy nhất (VIP) cho hệ thống Dashboard (Grafana) hoặc người dùng truy cập.

2. Mô tả Chức năng các Thành phần


  • Prometheus: Là lõi của hệ thống, đóng vai trò Time Series Database (TSDB). Nó có nhiệm vụ gọi đến các Exporter để kéo metrics về lưu trữ và đánh giá các luật cảnh báo (Alerting Rules).
  • Keepalived: Cung cấp cơ chế Failover. Nếu máy chủ Prometheus Active gặp sự cố, Keepalived sẽ tự động chuyển VIP sang máy chủ Prometheus Standby, giúp gián đoạn truy cập ở mức tối thiểu.
  • Node Exporter: Thành phần chuẩn hóa của Prometheus chuyên dụng để giám sát các chỉ số phần cứng và hệ điều hành cho các máy chủ nhân Linux/Unix (như Ubuntu, CentOS, RedHat). Nó trích xuất chi tiết các thông số về CPU, RAM, Disk I/O, Network, và trạng thái Filesystem.
  • Windows Exporter: Là tác nhân dành riêng cho hệ điều hành Windows (Windows Server & Windows Client). Nó giao tiếp với WMI và Performance Counters của Windows để lấy các số liệu về phần cứng cũng như các dịch vụ đặc thù như IIS, Active Directory, Hyper-V.
  • SNMP Exporter: Đóng vai trò cầu nối để giám sát các thiết bị mạng (Router, Switch, Firewall). Nó nhận yêu cầu từ Prometheus, chuyển đổi thành các truy vấn SNMP (v1, v2c, v3) tới thiết bị mạng, và trả về kết quả dưới định dạng Prometheus metrics.
  • Telegraf: Là agent mạnh mẽ của InfluxData nhưng hỗ trợ xuất dữ liệu ra định dạng Prometheus. Nó thường được cài đặt trực tiếp lên các OS (Linux/Windows) để thu thập metrics về CPU, RAM, Disk, Network và các services nội bộ.
  • Elasticsearch Exporter: Truy vấn các API nội bộ của cụm Elasticsearch để lấy ra các metrics về tình trạng cluster, nodes, indices, shards và hiệu suất JVM.
1782493110124.png

3. Hướng dẫn Cài đặt & Cấu hình


3.1. Cấu hình High Availability với Keepalived và cài đặt Prometheus


Bài viết tham khảo để cài đặt:

3.2. Node Exporter (Dành cho máy chủ Linux)


Node Exporter thu thập các số liệu về CPU, bộ nhớ, disk I/O, network traffic và hệ thống file của các máy chủ Linux.
Tải Node Exporter:

Giải nén:
tar xvf node_exporter-1.10.2.linux-amd64.tar.gz

Copy binary:
cd node_exporter-1.10.2.linux-amd64
sudo cp node_exporter /usr/local/bin/

Tạo user chạy service:
sudo useradd --no-create-home --shell /bin/false node_exporter

Tạo service systemd:
Tạo file:
sudo nano /etc/systemd/system/node_exporter.service

Nội dung file:
[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --collector.systemd

[Install]
WantedBy=multi-user.target
Chạy service:
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

Chỉnh config /etc/prometheus/prometheus.yml :
static_configs:
- targets:
- 10.120.100.9:9100

3.3. Windows Exporter (Dành cho máy chủ Windows Server / Windows Client)


Windows Exporter (trước đây là wmi_exporter) chạy như một Windows Service để thu thập các số liệu đặc thù của Windows như IIS, Hyper-V, Active Directory, CPU, RAM, Services status...
Cài đặt:
  1. Truy cập vào trang Releases của windows_exporter và tải về file cài đặt .msi mới nhất.
  2. Mở PowerShell với quyền Administrator và chạy lệnh sau để cài đặt và tự động kích hoạt các bộ thu thập dữ liệu phổ biến:
msiexec /i windows_exporter-amd64.msi ENABLED_COLLECTORS="os,cpu,memory,net,logical_disk,system,service"
Sau khi cài đặt, trình cài đặt sẽ tạo một service tên là windows_exporter tự động chạy cùng hệ thống và mở cổng 9182.
Bạn có thể mở trình duyệt trên máy bất kỳ và truy cập http://<IP_MAY_WINDOWS>:9182/metrics để đảm bảo dữ liệu đã được expose thành công.

3.4. SNMP Exporter (Dành cho các thiết bị mạng: router, switch, firewall, ...)


SNMP Exporter là công cụ chuyên dụng được khuyên dùng để trích xuất (expose) dữ liệu SNMP từ các thiết bị mạng sang định dạng mà hệ thống giám sát Prometheus có thể thu thập và xử lý được
Dưới đây là các đặc điểm chính của SNMP Exporter:
  • Chuyển đổi dữ liệu tự động: SNMP sử dụng cấu trúc dữ liệu phân cấp dạng cây (dựa trên OID và MIB), trong khi Prometheus sử dụng dữ liệu dạng ma trận đa chiều. SNMP Exporter đảm nhiệm việc ánh xạ (map) hoàn hảo giữa hai cấu trúc này, ví dụ như tự động biến các chỉ mục (index) của SNMP thành các nhãn (labels) trên Prometheus
  • Mô hình hoạt động dạng Proxy: SNMP Exporter được thiết kế để chạy trên một vài máy chủ trung tâm và hoạt động giống như một "Prometheus proxy". Nó có khả năng mở rộng rất mạnh mẽ, một bản cài đặt (instance) duy nhất có thể dùng để quét (walk) và thu thập dữ liệu cho hàng ngàn thiết bị.
  • Quản lý cấu hình qua Generator: Cấu hình cốt lõi của công cụ này nằm ở file snmp.yml. Bạn không nên chỉnh sửa file này bằng tay mà cần dùng công cụ generator (như chúng ta đã trao đổi ở trên) để đọc các file MIB và tự động biên dịch ra cấu hình chuẩn.
  • Bảo mật: SNMP Exporter hỗ trợ xác thực cơ bản và mã hóa TLS. Mặc định cấu hình sử dụng public_v2 (SNMP v1/v2c), nhưng do dữ liệu ở các phiên bản này không được mã hóa, tài liệu khuyên bạn nên cấu hình sử dụng SNMP v3 nếu môi trường yêu cầu bảo mật nghiêm ngặt
Tạo User hệ thống cho SNMP Exporter:
sudo useradd --system --no-create-home --shell /bin/false snmp_exporter
Tải và giải nén SNMP Exporter:
wget https://github.com/prometheus/snmp_....30.1/snmp_exporter-0.30.1.linux-amd64.tar.gz
tar xvf snmp_exporter-0.30.1.linux-amd64.tar.gz

cd snmp_exporter-0.30.1.linux-amd64
Phân quyền và di chuyển file:
sudo cp snmp_exporter /usr/local/bin/
sudo chown snmp_exporter:snmp_exporter /usr/local/bin/snmp_exporter
sudo mkdir /etc/snmp_exporter
sudo cp snmp.yml /etc/snmp_exporter/
sudo chown -R snmp_exporter:snmp_exporter /etc/snmp_exporter
Tạo Systemd Service:
sudo nano /etc/systemd/system/snmp_exporter.service
Nội dung file:
[Unit]
Description=Prometheus SNMP Exporter
After=network.target

[Service]
User=snmp_exporter
Group=snmp_exporter
ExecStart=/usr/local/bin/snmp_exporter \
--config.file=/etc/snmp_exporter/snmp.yml \
--web.listen-address=":9116"
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
Khởi động service:
sudo systemctl daemon-reload
sudo systemctl enable snmp_exporter
sudo systemctl start snmp_exporter
Bật SNMP v3 trên Switch và lấy authen:

Cách generate file cấu hình snmp.yml để snmp exporter có thể hoạt động:
https://securityzone.vn/t/snmp_exporter-cach-tu-tao-cau-hinh-generator-yml-cho-snmp_exporter.12875/
Cấu hình prometheus, thêm một job vào prometheus với authen sử dụng chinh_v3_profile.
Đối với các dòng Core Switch chịu tải cao, việc bắt nó trả về hàng nghìn dòng thông số port có thể làm mệt CPU của Switch. Giao thức SNMP mặc định đi hỏi từng dòng một (GetNext) rất chậm. Set thời gian quét 60s và timeout lâu hơn windows exporter và node exporter.
1782494787217.png

Thêm các host switch trong file targets_network.yml:
1782494799461.png

Kiểm tra và thấy log:
1782494938001.png

3.5. Telegraf - plugin Vsphere (Sử dụng làm exporter)


Chạy đoạn code sau để tải telegraf:
curl --silent --location -O https://repos.influxdata.com/influxdata-archive.key
gpg --show-keys --with-fingerprint --with-colons ./influxdata-archive.key 2>&1 \
| grep -q '^fpr:\+24C975CBA61A024EE1B631787C3D57159FC2F927:$' \
&& cat influxdata-archive.key \
| gpg --dearmor \
| sudo tee /etc/apt/keyrings/influxdata-archive.gpg > /dev/null \
&& echo 'deb [signed-by=/etc/apt/keyrings/influxdata-archive.gpg] https://repos.influxdata.com/debian stable main' \
| sudo tee /etc/apt/sources.list.d/influxdata.list
sudo apt-get update && sudo apt-get install telegraf
Vì cần metric của vsphere nên sẽ dùng plugin vsphere trong telegraf, ta vào file /etc/telegraf/telegraf.conf cấu hình những thông tin cần thiết như link đến vcenter, username và password của tài khoản có role read-only để get dữ liệu từ API.
Ở phần vm_metric_include điền vào các field dữ liệu cần lấy từ vmware từ vcenter đó quản lý, host_metric_include điền field dữ liệu cần lấy từ các host EXSI, datacenter_metric_include điền field dữ liệu cần lấy từ datastore, và vsan_metric_include cũng tương tự.
Ở dưới sẽ là config mẫu lấy dữ liệu cơ bản cần để monitor:
### ==============================================================================
### AGENT CONFIGURATION
### ==============================================================================
[agent]
interval = "60s"
round_interval = true
metric_batch_size = 1000
metric_buffer_limit = 10000
collection_jitter = "0s"
flush_interval = "10s"
flush_jitter = "0s"
precision = "0s"
omit_hostname = false

# -- INSTANCE 1: REALTIME METRICS (INTERVAL: 60s) --
[[inputs.vsphere]]
interval = "60s"
vcenters = [ "https://x.x.x.x/sdk/" ]
username = "test@vsphere.local"
password = "Poptech@123!"

vm_metric_include = [
"sys.uptime.latest",
"sys.osUptime.latest",
"cpu.usage.average",
"cpu.ready.summation",
"cpu.readiness.average",
"mem.usage.average",
"mem.active.average",
"virtualDisk.read.average",
"virtualDisk.write.average",
"net.bytesRx.average",
"net.bytesTx.average",
"net.droppedRx.summation",
"net.droppedTx.summation",
]
host_metric_include = [
"sys.uptime.latest",
"cpu.usage.average",
"cpu.coreUtilization.average",
"cpu.readiness.average",
"mem.usage.average",
"mem.active.average",
"disk.deviceReadLatency.average",
"disk.deviceWriteLatency.average",
"net.bytesRx.average",
"net.bytesTx.average",
"net.droppedRx.summation",
"net.droppedTx.summation",
"vmop.numPoweroff.latest",
"vmop.numVMotion.latest",
"vmop.numPoweron.latest",
"vmop.numPoweroff.latest"
]

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

max_query_objects = 64
max_query_metrics = 64
collect_concurrency = 5
discover_concurrency = 5
insecure_skip_verify = true
timeout = "60s"
disconnected_servers_behavior = "error"

# -- INSTANCE 2: HISTORICAL METRICS (INTERVAL: 300s/5m) --
[[inputs.vsphere]]
interval = "300s"
vcenters = [ "https://x.x.x.x/sdk/"" ]
username = "test@vsphere.local"
password = "Poptech@123!"

datastore_metric_include = [
"disk.capacity.latest",
"disk.used.latest",
]

cluster_metric_include = [
"vmop.numPoweroff.latest",
"vmop.numVMotion.latest",
]

vsan_metric_exclude = ["*"]
datacenter_metric_exclude = ["*"]
vm_metric_exclude = ["*"]
host_metric_exclude = ["*"]
resource_pool_metric_exclude = ["*"]

historical_interval = "5m"
max_query_objects = 64
max_query_metrics = 64
collect_concurrency = 5
discover_concurrency = 5
insecure_skip_verify = true
timeout = "60s"
disconnected_servers_behavior = "error"

[[inputs.vsphere]]
interval = "300s"
vcenters = [ "https://x.x.x.x/sdk/" ]
username = "test@vsphere.local"
password = "Poptech@123!"

vm_metric_exclude = ["*"]
datastore_metric_exclude = ["*"]
datacenter_metric_exclude = ["*"]
host_metric_exclude = ["*"]
cluster_metric_exclude = ["*"]
resource_pool_metric_exclude = ["*"]

vsan_metric_include = [
"summary.disk-usage",
"summary.health",
"summary.resync",
"performance.cluster-domclient",
"performance.cluster-domcompmgr",
"performance.host-domclient",
"performance.host-domcompmgr",
"performance.cache-disk",
"performance.disk-group",
"performance.capacity-disk",
"performance.disk-group",
"performance.virtual-machine",
"performance.vscsi",
"performance.virtual-disk",
"performance.vsan-host-net",
"performance.vsan-vnic-net",
"performance.vsan-pnic-net",
"performance.vsan-iscsi-host",
"performance.vsan-iscsi-target",
"performance.vsan-iscsi-lun",
"performance.lsom-world-cpu",
"performance.nic-world-cpu",
"performance.dom-world-cpu",
"performance.cmmds-world-cpu",
"performance.host-cpu",
"performance.host-domowner",
"performance.host-memory-slab",
"performance.host-memory-heap",
"performance.system-mem",
]

vsan_metric_skip_verify = true
vsan_metric_exclude = []

historical_interval = "5m"
max_query_objects = 64
max_query_metrics = 64
collect_concurrency = 5
discover_concurrency = 5
insecure_skip_verify = true
timeout = "60s"
disconnected_servers_behavior = "error"

### OUTPUT
[[outputs.prometheus_client]]
listen = ":9273"
expiration_interval = "360s"
Ở phần outputs mở port cho prometheus scrape lấy metric.
Thực hiện chạy service và enable cho service chạy khi boot server:
systemctl start telegraf
systemctl enable telegraf
Sau đó cấu hình tạo job scrape metric trên prometheus:
- job_name: 'telegraf_vsphere'
scrape_interval: 60s
scrape_timeout: 45s
static_configs:
- targets: ['telegraf_ip:9273']
Kiểm tra trên prometheus:
1782495652572.png

Trên opensearch metric cũng đã được gửi lên:
1782495664560.png

3.6. Elasticsearch exporter (áp dụng cho monitor Opensearch)


Sử dụng elastic exporter để thu thập metric từ cụm Opensearch/Elasticsearch.
Kiến trúc thu thập dữ liệu: Khác với các exporter truyền thống, Elasticsearch Exporter phiên bản mới khuyến nghị sử dụng mô hình Multi-Target.
  • Exporter chạy độc lập như một proxy.
  • Prometheus sẽ gọi vào endpoint /probe của Exporter, truyền tham số target (IP OpenSearch) và module xác thực.
  • Exporter đứng ra kết nối với OpenSearch, lấy dữ liệu và trả ngược lại cho Prometheus.
Cài đặt và Cấu hình Elasticsearch Exporter:
Bước 1: Tải và cài đặt Binary
Trên máy chủ dự kiến chạy Exporter, thực hiện tải phiên bản mới nhất từ kho lưu trữ chính thức của Prometheus Community:
wget https://github.com/prometheus-commu...sticsearch_exporter-1.10.0.linux-amd64.tar.gz
tar -xvf elasticsearch_exporter-1.10.0.linux-amd64.tar.gz
sudo cp elasticsearch_exporter-1.10.0.linux-amd64/elasticsearch_exporter /usr/local/bin/
sudo chmod +x /usr/local/bin/elasticsearch_exporter
Bước 2: Tạo cấu hình xác thực (YAML)
Tạo thư mục chứa cấu hình:
sudo mkdir -p /etc/elasticsearch_exporter
sudo nano /etc/elasticsearch_exporter/exporter-config.yml
Cấu hình thông tin xác thực (auth_modules):
auth_modules:
opensearch_auth:
type: userpass
userpass:
username: admin
password: mat_khau_cua_ban
Phân quyền bảo mật cho file:
sudo chmod 600 /etc/elasticsearch_exporter/exporter-config.yml
Bước 3: Cấu hình Systemd Service
Tạo file service:
sudo nano /etc/systemd/system/elasticsearch_exporter.service
Định nghĩa cấu hình service. Tại đây, chúng ta bổ sung các cờ (flags) quan trọng:
  • --es.ssl-skip-verify: Bỏ qua lỗi chứng chỉ SSL tự cấp.
  • --es.all: Thu thập toàn bộ metric hệ thống.
  • --es.indices: Thu thập metric chi tiết ở cấp độ từng index.
[Unit]
Description=Elasticsearch Exporter
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/elasticsearch_exporter --config.file=/etc/elasticsearch_exporter/exporter-config.yml --es.ssl-skip-verify --es.all --es.indices
Restart=always
RestartSec=10s

[Install]
WantedBy=multi-user.target
Nạp lại systemd và khởi chạy:
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch_exporter
sudo systemctl start elasticsearch_exporter
Tích hợp vào Prometheus:
Mở file cấu hình của Prometheus (thường nằm ở /etc/prometheus/prometheus.yml) để thêm Job thu thập dữ liệu mới.
scrape_configs:
- job_name: 'opensearch_cluster'
scrape_interval: 1m # Chu kỳ thu thập: 1 phút
scrape_timeout: 30s # Thời gian chờ tối đa
metrics_path: /probe # Trỏ vào endpoint probe của exporter
params:
auth_module: [opensearch_auth] # Trùng với tên module trong file exporter-config.yml
static_configs:
- targets:
- 'https://<IP_OPENSEARCH_CỦA_BẠN>:9200' # Thay IP thực tế của node OpenSearch
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 127.0.0.1:9114 # Địa chỉ của Elasticsearch Exporter
1782496361198.png

3.7. Ping exporter


Ping exporter, một công cụ mã nguồn mở được thiết kế để thu thập dữ liệu ICMP echo requests cho hệ thống giám sát Prometheus. Phần mềm này đo lường các chỉ số mạng quan trọng như độ trễ (RTT) và tỷ lệ mất gói tin, giúp người dùng theo dõi hiệu suất kết nối của các mục tiêu được chỉ định. Tổng quan, đây là giải pháp kỹ thuật hiệu quả để tích hợp dữ liệu kiểm tra mạng vào các biểu đồ và hệ thống cảnh báo của Prometheus.
Cài đặt:
Giải nén:
tar -xvf ping_exporter_1.2.0_linux_amd64.tar.gz
Di chuyển file thực thi vào thư mục bin:
sudo mv ping_exporter /usr/local/bin/
Cấp quyền thực thi:
sudo chmod +x /usr/local/bin/ping_exporter
Để ping_exporter có thể gửi các gói tin ICMP (ping) mà không cần chạy dưới quyền root thì cấp quyền cap_net_raw:
sudo setcap cap_net_raw+ep /usr/local/bin/ping_exporter
Tạo file config cho ping exporter:
mkdir /etc/ping_exporter/
sudo nano /etc/ping_exporter/ping_exporter.yml
Nội dung:
targets:
- 8.8.8.8
- 1.1.1.1
- 10.120.100.31
- host: google.com

dns:
refresh: 2m
nameserver: 8.8.8.8

ping:
interval: 5s
timeout: 3s
history-size: 10
payload-size: 56

options:
disableIPv6: true
Tạo service systemd để chạy ngầm:
sudo nano /etc/systemd/system/ping_exporter.service
Nội dung file:
[Unit]
Description=Ping Exporter
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/bin/ping_exporter --config.path=/etc/ping_exporter/ping_exporter.yml
Restart=on-failure

[Install]
WantedBy=multi-user.target
Khởi động và cho phép service chạy cùng hệ thống:
sudo systemctl daemon-reload
sudo systemctl enable ping_exporter
sudo systemctl start ping_exporter
sudo systemctl status ping_exporter
Trên prometheus thêm job vào:
- job_name: 'ping'
scrape_interval: 60s
static_configs:
- targets: ['10.120.100.9:9427']
1782496766640.png
 

Đính kèm

  • 1782496229221.png
    1782496229221.png
    19.4 KB · Lượt xem: 0
  • 1782496335528.png
    1782496335528.png
    19.4 KB · Lượt xem: 0
Back
Top