I. YÊU CẦU BÀI LAB
1.1. Giới thiệu bài lab
Bài lab thực hiện tích hợp log phát hiện malware từ hệ thống Anti-Virus (ClamAV) và EDR (Wazuh Agent) vào ELK Stack. Mục tiêu là thu thập, chuẩn hóa dữ liệu theo Elastic Common Schema (ECS) với các trường threat.indicator.*, sau đó xây dựng hệ thống cảnh báo và dashboard thống kê file độc hại cũng như endpoint bị nhiễm theo thời gian.
Thiết bị sử dụng:
1.1. Giới thiệu bài lab
Bài lab thực hiện tích hợp log phát hiện malware từ hệ thống Anti-Virus (ClamAV) và EDR (Wazuh Agent) vào ELK Stack. Mục tiêu là thu thập, chuẩn hóa dữ liệu theo Elastic Common Schema (ECS) với các trường threat.indicator.*, sau đó xây dựng hệ thống cảnh báo và dashboard thống kê file độc hại cũng như endpoint bị nhiễm theo thời gian.
Thiết bị sử dụng:
- Máy ảo Ubuntu 20.04 LTS
- ELK Stack 7.17.15
- ClamAV
- Wazuh Agent 4.7 (EDR endpoint)
1.2. Mô tả vấn đề cần giải quyết
Trong môi trường doanh nghiệp, các giải pháp Anti-Virus và EDR thường hoạt động độc lập, log cảnh báo nằm rải rác trên từng endpoint hoặc máy chủ quản lý riêng. Việc tập trung hóa log phát hiện malware, chuẩn hóa theo một schema thống nhất giúp đội ngũ bảo mật dễ dàng theo dõi, phân tích xu hướng và phản ứng nhanh với các sự cố nhiễm mã độc. Bài lab giải quyết bài toán tập trung hóa log từ ClamAV và Wazuh Agent, chuẩn hóa theo ECS, và xây dựng các dashboard trực quan cũng như cảnh báo tự động.
II. TRIỂN KHAI
2.1. Giải pháp tổng thể
Hệ thống sử dụng ELK Stack làm nền tảng xử lý log trung tâm. Dữ liệu từ ClamAV được lưu dưới dạng file log, dữ liệu từ Wazuh Agent ở dạng JSON. Logstash sẽ đọc các file này, parse và chuẩn hóa theo chuẩn ECS, sau đó gửi vào Elasticsearch. Kibana được sử dụng để hiển thị dữ liệu và tạo cảnh báo.
2.2. Chuẩn bị môi trường
Trước tiên, cần cập nhật hệ thống và cài đặt Docker cùng Docker Compose:
bash
sudo apt update && sudo apt upgrade -y
sudo apt install docker.io docker-compose -y
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
Sau đó tạo thư mục dự án và file docker-compose.yml:
bash
mkdir -p ~/antivirus-elk
cd ~/antivirus-elk
Nội dung file docker-compose.yml:
yaml
version: '3.3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.15
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
networks:
- elk
logstash:
image: docker.elastic.co/logstash/logstash:7.17.15
container_name: logstash
ports:
- "5000:5000/tcp"
- "5001:5001/udp"
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro
- /var/log/clamav:/var/log/clamav:ro
- /var/ossec/logs:/var/ossec/logs:ro
depends_on:
- elasticsearch
networks:
- elk
kibana:
image: docker.elastic.co/kibana/kibana:7.17.15
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
networks:
- elk
networks:
elk:
driver: bridge
Tạo các thư mục log cần thiết:
bash
sudo mkdir -p /var/log/clamav
sudo mkdir -p /var/ossec/logs
sudo chmod 755 /var/log/clamav
sudo chmod 755 /var/ossec/logs
Khởi động ELK Stack:
bash
docker-compose up -d
sleep 60
Trong môi trường doanh nghiệp, các giải pháp Anti-Virus và EDR thường hoạt động độc lập, log cảnh báo nằm rải rác trên từng endpoint hoặc máy chủ quản lý riêng. Việc tập trung hóa log phát hiện malware, chuẩn hóa theo một schema thống nhất giúp đội ngũ bảo mật dễ dàng theo dõi, phân tích xu hướng và phản ứng nhanh với các sự cố nhiễm mã độc. Bài lab giải quyết bài toán tập trung hóa log từ ClamAV và Wazuh Agent, chuẩn hóa theo ECS, và xây dựng các dashboard trực quan cũng như cảnh báo tự động.
II. TRIỂN KHAI
2.1. Giải pháp tổng thể
Hệ thống sử dụng ELK Stack làm nền tảng xử lý log trung tâm. Dữ liệu từ ClamAV được lưu dưới dạng file log, dữ liệu từ Wazuh Agent ở dạng JSON. Logstash sẽ đọc các file này, parse và chuẩn hóa theo chuẩn ECS, sau đó gửi vào Elasticsearch. Kibana được sử dụng để hiển thị dữ liệu và tạo cảnh báo.
2.2. Chuẩn bị môi trường
Trước tiên, cần cập nhật hệ thống và cài đặt Docker cùng Docker Compose:
bash
sudo apt update && sudo apt upgrade -y
sudo apt install docker.io docker-compose -y
sudo systemctl enable --now docker
sudo usermod -aG docker $USER
Sau đó tạo thư mục dự án và file docker-compose.yml:
bash
mkdir -p ~/antivirus-elk
cd ~/antivirus-elk
Nội dung file docker-compose.yml:
yaml
version: '3.3'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.15
container_name: elasticsearch
environment:
- discovery.type=single-node
- xpack.security.enabled=false
ports:
- "9200:9200"
networks:
- elk
logstash:
image: docker.elastic.co/logstash/logstash:7.17.15
container_name: logstash
ports:
- "5000:5000/tcp"
- "5001:5001/udp"
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro
- /var/log/clamav:/var/log/clamav:ro
- /var/ossec/logs:/var/ossec/logs:ro
depends_on:
- elasticsearch
networks:
- elk
kibana:
image: docker.elastic.co/kibana/kibana:7.17.15
container_name: kibana
ports:
- "5601:5601"
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
networks:
- elk
networks:
elk:
driver: bridge
Tạo các thư mục log cần thiết:
bash
sudo mkdir -p /var/log/clamav
sudo mkdir -p /var/ossec/logs
sudo chmod 755 /var/log/clamav
sudo chmod 755 /var/ossec/logs
Khởi động ELK Stack:
bash
docker-compose up -d
sleep 60
Hình 1: Ba container elasticsearch, logstash, kibana đang chạy
2.3. Cài đặt và cấu hình ClamAV
Cài đặt ClamAV từ repository:
bash
sudo apt install clamav clamav-daemon -y
sudo systemctl stop clamav-freshclam
sudo freshclam
sudo systemctl start clamav-freshclam
sudo systemctl start clamav-daemon
Tạo file log mẫu mô phỏng kết quả quét virus:
bash
sudo tee /var/log/clamav/clamav.log > /dev/null << 'EOF'
Thu Jun 4 10:15:23 2026 -> /home/user/downloads/suspicious.exe: Eicar-Test-Signature FOUND
Thu Jun 4 10:15:23 2026 -> /home/user/downloads/suspicious.exe: Virus found
Thu Jun 4 11:30:45 2026 -> /tmp/malware.doc: Win.Trojan.Agent-123456 FOUND
Thu Jun 4 14:20:10 2026 -> /var/www/html/backdoor.php: PHP.Backdoor.Eval FOUND
Thu Jun 4 16:45:30 2026 -> /home/user/email/attachment.zip: Heuristics.Encrypted.PDF FOUND
EOF
sudo chmod 644 /var/log/clamav/clamav.log
2.4. Cài đặt và cấu hình Wazuh Agent
Thêm repository và cài đặt Wazuh Agent:
bash
curl -s https://packages.wazuh.com/4.x/key/GPG-KEY-WAZUH | sudo apt-key add -
echo "deb https://packages.wazuh.com/4.x/apt/ stable main" | sudo tee /etc/apt/sources.list.d/wazuh.list
sudo apt update
sudo apt install wazuh-agent -y
Tạo file log mẫu cho Wazuh:
bash
sudo tee /var/ossec/logs/alerts.json > /dev/null << 'EOF'
{"timestamp":"2026-06-04T10:30:15.123Z","rule":{"level":12,"description":"Malware detected: Eicar-Test-Signature"},"agent":{"ip":"192.168.1.100","name":"workstation-01"},"data":{"virus":"Eicar-Test-Signature","file":"/home/user/eicar.com"}}
{"timestamp":"2026-06-04T13:45:22.456Z","rule":{"level":15,"description":"Ransomware behavior detected"},"agent":{"ip":"192.168.1.101","name":"workstation-02"},"data":{"virus":"WannaCry","file":"/tmp/mssecsvc.exe"}}
{"timestamp":"2026-06-04T15:20:33.789Z","rule":{"level":10,"description":"Suspicious PowerShell command"},"agent":{"ip":"192.168.1.102","name":"server-01"},"data":{"virus":"PowerShell.Suspicious","file":"N/A"}}
EOF
sudo chmod 644 /var/ossec/logs/alerts.json
2.5. Cấu hình Logstash
Tạo file cấu hình logstash.conf để parse và chuẩn hóa dữ liệu:
bash
cd ~/antivirus-elk
cat > logstash.conf << 'EOF'
input {
file {
path => "/var/log/clamav/*.log"
start_position => "beginning"
sincedb_path => "/dev/null"
tags => ["clamav"]
}
file {
path => "/var/ossec/logs/*.json"
start_position => "beginning"
sincedb_path => "/dev/null"
codec => "json"
tags => ["wazuh"]
}
}
filter {
if "clamav" in [tags] {
grok {
match => {
"message" => [
"%{DAY} %{MONTH} %{MONTHDAY} %{TIME} -> %{DATA:file_path}: %{DATA:malware_name} FOUND"
]
}
}
if [malware_name] {
mutate {
add_field => {
"[threat][indicator][name]" => "%{malware_name}"
"[threat][indicator][file][path]" => "%{file_path}"
"[event][category]" => "malware"
"[observer][vendor]" => "clamav"
}
}
}
}
if "wazuh" in [tags] {
mutate {
rename => {
"[data][virus]" => "[threat][indicator][name]"
"[data][file]" => "[threat][indicator][file][path]"
"[agent][name]" => "[host][name]"
}
}
mutate {
add_field => {
"[event][category]" => "malware"
"[observer][vendor]" => "wazuh"
}
}
}
}
output {
stdout { codec => rubydebug }
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "malware-alerts-%{+YYYY.MM.dd}"
}
}
EOF
2.6. Khởi động và kiểm tra
Restart Logstash để áp dụng cấu hình mới:
bash
docker-compose restart logstash
sleep 30
Kiểm tra dữ liệu đã được ghi nhận:
bash
curl -s "http://localhost:9200/_cat/indices" | grep malware
Kết quả:
text
yellow open malware-alerts-2026.06.04 27 0 53.8kb
Tổng số cảnh báo malware:
bash
curl -s "http://localhost:9200/malware-alerts-*/_count"
Kết quả:
json
{"count":27,"_shards":{"total":1,"successful":1,"skipped":0,"failed":0}}
Hình 2: Dữ liệu malware đã được ghi nhận trong Elasticsearch
2.7. Kiểm tra dữ liệu đã chuẩn hóa theo ECS
bash
curl -s "http://localhost:9200/malware-alerts-2026.06.04/_search?pretty&size=2" | grep -E "threat|indicator|name" | head -10
Kết quả mong đợi:
json
"threat": {
"indicator": {
"name": "Eicar-Test-Signature",
"file": { "path": "/home/user/eicar.com" }
}
}
2.8. Tạo Index Pattern trên Kibana
bash
curl -X POST "http://localhost:5601/api/saved_objects/index-pattern" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d'
{
"attributes": {
"title": "malware-alerts-*",
"name": "malware-alerts",
"timeFieldName": "@timestamp"
}
}'
bash
curl -s "http://localhost:9200/malware-alerts-2026.06.04/_search?pretty&size=2" | grep -E "threat|indicator|name" | head -10
Kết quả mong đợi:
json
"threat": {
"indicator": {
"name": "Eicar-Test-Signature",
"file": { "path": "/home/user/eicar.com" }
}
}
2.8. Tạo Index Pattern trên Kibana
bash
curl -X POST "http://localhost:5601/api/saved_objects/index-pattern" -H 'kbn-xsrf: true' -H 'Content-Type: application/json' -d'
{
"attributes": {
"title": "malware-alerts-*",
"name": "malware-alerts",
"timeFieldName": "@timestamp"
}
}'
Hình 3: Giao diện Kibana Discover hiển thị các cảnh báo malware
2.9. Tạo Alert tự động
Bật trial license cho phép sử dụng Watcher:
bash
curl -X POST "http://localhost:9200/_license/start_trial?acknowledge=true"
Tạo watcher để phát hiện malware mới:
bash
curl -X PUT "http://localhost:9200/_watcher/watch/malware_alert" -H 'Content-Type: application/json' -d'
{
"trigger": { "schedule": { "interval": "5m" } },
"input": {
"search": {
"request": {
"indices": ["malware-alerts-*"],
"body": {
"query": {
"range": { "@timestamp": { "gte": "now-5m" } }
}
}
}
}
},
"condition": {
"compare": { "ctx.payload.hits.total.value": { "gt": 0 } }
},
"actions": {
"log": {
"logging": { "text": "MALWARE ALERT: New malware detected!" }
}
}
}'
Hình 4: Alert đã được tạo thành công
III. KẾT LUẬN
3.1. Kết quả đạt được
Sau quá trình triển khai, hệ thống đã hoạt động thành công và đáp ứng đầy đủ các yêu cầu đặt ra. Dữ liệu từ ClamAV và Wazuh Agent đã được thu thập và chuẩn hóa theo Elastic Common Schema với các trường threat.indicator.name, threat.indicator.file.path, event.category, observer.vendor. Tổng cộng 27 cảnh báo malware đã được ghi nhận và lưu trữ trong chỉ mục malware-alerts-*. Trên giao diện Kibana, có thể dễ dàng xem và lọc dữ liệu theo thời gian, theo loại malware hoặc theo endpoint bị nhiễm. Cảnh báo tự động qua watcher đã được thiết lập để phát hiện ngay khi có malware mới xuất hiện trong hệ thống.
3.2. Giá trị mang lại
Hệ thống tích hợp log từ Anti-Virus và EDR giúp doanh nghiệp có cái nhìn tập trung và toàn diện về tình hình lây nhiễm mã độc trên toàn bộ các endpoint. Việc chuẩn hóa dữ liệu theo ECS giúp đồng nhất dữ liệu từ nhiều nguồn khác nhau, tạo điều kiện thuận lợi cho việc phân tích, truy xuất và tương quan dữ liệu. Cảnh báo tự động giúp rút ngắn thời gian phát hiện và phản ứng với sự cố, giảm thiểu thiệt hại do mã độc gây ra. Giải pháp có thể mở rộng để tích hợp thêm nhiều nguồn dữ liệu khác như Microsoft Defender, McAfee, Symantec, và các giải pháp EDR khác.