SIEM/Log Management Tích hợp với Threat Intelligence MISP, OpenCTI

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 nguồn Threat Intelligence từ MISP và OpenCTI vào hệ thống ELK Stack nhằm phát hiện các hành vi truy cập bất thường đến địa chỉ IP hoặc URL đã được ghi nhận là độc hại. Khi phát hiện endpoint có kết nối đến các chỉ báo xâm nhập (IOC) từ nguồn TI, hệ thống sẽ tự động ghi nhận cảnh báo và hiển thị trên Kibana.

Thiết bị sử dụng:
  • Máy ảo Ubuntu 20.04 LTS​
  • ELK Stack 7.17.15​
  • Dữ liệu mẫu từ MISP và OpenCTI​
1.2. Mô tả vấn đề cần giải quyết
Trong hoạt động bảo mật, việc phát hiện sớm các kết nối đến địa chỉ IP hoặc URL độc hại là rất quan trọng. Các nguồn Threat Intelligence như MISP và OpenCTI cung cấp danh sách các chỉ báo xâm nhập (IOC) được cập nhật liên tục từ cộng đồng. Bài lab giải quyết bài toán tích hợp các nguồn TI này vào hệ thống giám sát tập trung, tự động phát hiện và cảnh báo khi có endpoint truy cập vào các địa chỉ nguy hiểm.

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 IOC từ MISP và OpenCTI được đồng bộ qua script Python vào Elasticsearch. Log truy cập mạng được Logstash đọc và parse, sau đó script phát hiện sẽ so sánh với danh sách IOC và tạo cảnh báo khi có trùng khớp.

2.2. Cài đặt ELK Stack

Tạo 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:
- ti
logstash:
image: docker.elastic.co/logstash/logstash:7.17.15
container_name: logstash
ports:
- "5000:5000/tcp"
volumes:
- ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf:ro
- /var/log/network_access.log:/var/log/network_access.log:ro
depends_on:
- elasticsearch
networks:
- ti
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:
- ti
networks:
ti:
driver: bridge

Khởi động stack:

bash
sudo docker-compose up -d
sleep 60
1781000515130.png

Hình 1: Ba container elasticsearch, logstash, kibana đang chạy

2.3. Tạo dữ liệu IOC từ MISP và OpenCTI
Tạo script sync_ti.py để đồng bộ IOC:
python

#!/usr/bin/env python3
import requests
from datetime import datetime
ES_URL = "http://localhost:9200"

# Dữ liệu từ MISP
misp_iocs = [
{"type": "ipv4", "value": "185.130.5.253", "threat": "Cobalt Strike C2"},
{"type": "ipv4", "value": "45.155.205.233", "threat": "Emotet C2"},
{"type": "domain", "value": "malware-c2.example.com", "threat": "Known C2 Server"},
]

# Dữ liệu từ OpenCTI
opencti_iocs = [
{"type": "ipv4", "value": "103.124.105.0", "threat": "APT28 C2 Server"},
{"type": "domain", "value": "evil-domain.xyz", "threat": "Phishing Domain"},
]
def sync_iocs():
for ioc in misp_iocs + opencti_iocs:
doc = {
"@timestamp": datetime.now().isoformat(),
"indicator_value": ioc["value"],
"threat_name": ioc["threat"],
"source": "MISP" if ioc in misp_iocs else "OpenCTI",
}
index_name = f"threat-intel-{datetime.now().strftime('%Y.%m.%d')}"
requests.post(f"{ES_URL}/{index_name}/_doc", json=doc)
sync_iocs()

Chạy script:
bash

python3 sync_ti.py

Kết quả: 8 IOC đã được đồng bộ vào Elasticsearch.
2.4. Tạo log truy cập mạng

Tạo file log mô phỏng truy cập từ proxy/firewall:

bash

sudo tee /var/log/network_access.log > /dev/null << 'EOF'
2026-06-09T10:30:15Z src=192.168.1.100 dst=185.130.5.253 url=http://evil.com user=admin action=allowed
2026-06-09T10:40:33Z src=192.168.1.102 dst=45.155.205.233 url=http://malware-c2.example.com user=user02 action=allowed
2026-06-09T10:45:10Z src=192.168.1.100 dst=103.124.105.0 url=https://evil-domain.xyz user=admin action=blocked
EOF

2.5. Cấu hình Logstash
Tạo file logstash.conf:
ruby

input {
file {
path => "/var/log/network_access.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
grok {
match => {
"message" => [
"%{TIMESTAMP_ISO8601:timestamp} src=%{IP:src_ip} dst=%{IP:dst_ip} url=%{URI:url} user=%{USER:user} action=%{WORD:action}"
]
}
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "network-logs-%{+YYYY.MM.dd}"
}
}

2.6. Tạo script phát hiện truy cập bất thường
python

# detect_malicious_access.py

import requests
from datetime import datetime

ES_URL = "http://localhost:9200"

def get_threat_intel():
resp = requests.get(f"{ES_URL}/threat-intel-*/_search?size=1000")
iocs = resp.json().get("hits", {}).get("hits", [])
threats = {}
for ioc in iocs:
value = ioc["_source"].get("indicator_value")
if value:
threats[value] = ioc["_source"].get("threat_name")

return threats

def detect_malicious_access():
threats = get_threat_intel()
resp = requests.get(f"{ES_URL}/network-logs-*/_search?size=1000")
logs = resp.json().get("hits", {}).get("hits", [])
for log in logs:
source = log["_source"]
dst_ip = source.get("dst_ip")
if dst_ip and dst_ip in threats:
alert_doc = {
"@timestamp": datetime.now().isoformat(),
"src_ip": source.get("src_ip"),
"dst_ip": dst_ip,
"user": source.get("user"),
"threat_name": threats[dst_ip],
"event_type": "malicious_connection_detected"
}
requests.post(f"{ES_URL}/ti-alerts/_doc", json=alert_doc)
print(f"ALERT: {source.get('src_ip')} accessed {dst_ip} ({threats[dst_ip]})")
detect_malicious_access()

Chạy script:

bash

python3 detect_malicious_access.py

Kết quả phát hiện:

text
ALERT: 192.168.1.100 accessed 185.130.5.253 (Cobalt Strike C2)
ALERT: 192.168.1.102 accessed 45.155.205.233 (Emotet C2)
ALERT: 192.168.1.100 accessed 103.124.105.0 (APT28 C2 Server)

2.7. Kiểm tra dữ liệu trong Elasticsearch

bash

curl -s "http://localhost:9200/_cat/indices"

Kết quả:

text
yellow open threat-intel-2026.06.09 1 1 8 0 15kb
yellow open network-logs-2026.06.09 1 1 3 0 8kb
yellow open ti-alerts 1 1 9 0 23kb

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": "ti-alerts",
"name": "ti-alerts",
"timeFieldName": "@timestamp"
}
}'
1781001139181.png

Hình 2: Giao diện Kibana Discover hiển thị 9 cảnh báo truy cập bất thường

2.9. Tạo Alert tự động

bash

curl -X POST "http://localhost:9200/_license/start_trial?acknowledge=true"

curl -X PUT "http://localhost:9200/_watcher/watch/ti_malicious_connection" -H 'Content-Type: application/json' -d'
{
"trigger": { "schedule": { "interval": "5m" } },
"input": {
"search": {
"request": {
"indices": ["ti-alerts"],
"body": {
"query": {
"range": { "@timestamp": { "gte": "now-5m" } }
}
}
}
}
},
"condition": {
"compare": { "ctx.payload.hits.total.value": { "gt": 0 } }
},
"actions": {
"log": {
"logging": { "text": "THREAT INTEL ALERT: Malicious connection detected" }
}
}
}'
1781001464935.png

Hình 3: Alert đã được tạo thành công với trạng thái active

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. Dữ liệu IOC từ MISP và OpenCTI đã được đồng bộ vào Elasticsearch với tổng số 8 chỉ báo. Hệ thống đã phát hiện được 9 truy cập bất thường từ các endpoint đến các địa chỉ trong danh sách đen, bao gồm Cobalt Strike C2, Emotet C2 và APT28 C2 Server. Các cảnh báo đã được ghi nhận vào index ti-alerts và hiển thị trực quan trên Kibana với đầy đủ thông tin về IP nguồn, IP đích, tên mối đe dọa và thời gian phát hiện. Watcher alert cũng được thiết lập để tự động cảnh báo khi có phát hiện mới.

3.2. Giá trị mang lại
Hệ thống tích hợp Threat Intelligence giúp doanh nghiệp chủ động phát hiện các kết nối đến địa chỉ độc hại ngay khi chúng xảy ra, thay vì phải chờ đến khi có báo cáo sự cố. Việc kết hợp dữ liệu từ nhiều nguồn TI khác nhau (MISP, OpenCTI) giúp tăng độ phủ và độ tin cậy của các cảnh báo. Hệ thống có thể mở rộng để tích hợp thêm nhiều nguồn TI khác như AlienVault OTX, IBM X-Force, hay các nguồn feed thương mại, đồng thời có thể kết nối với firewall để tự động block IP khi phát hiện truy cập độc hại.​
 
Back
Top