一、今日目標
- 了解威脅情報分享的國際標準 STIX / TAXII。
- 實作 STIX 物件生成與序列化(JSON 格式)。
- 建立 TAXII Server / Client 模擬交換資料。
- 整合內部防詐系統,使其能發佈、接收、更新跨組織威脅情報。
- 驗證分享流程安全性與一致性。
二、STIX 與 TAXII 概念
| 標準 | 全名 | 功能 | 
| STIX | Structured Threat Information eXpression | 用於結構化表示威脅情報(如攻擊指標、事件、行為、關聯)。 | 
| TAXII | Trusted Automated eXchange of Indicator Information | 用於在組織間傳輸 STIX 資料的通訊協定(通常基於 HTTPS)。 | 
STIX 資料結構範例
{
  "type": "indicator",
  "id": "indicator--b1a2c3d4-5678-90ab-cdef-1234567890ab",
  "created": "2025-10-21T10:00:00Z",
  "modified": "2025-10-21T10:00:00Z",
  "name": "Phishing Domain Detected",
  "pattern": "[domain-name:value = 'secure-login.net']",
  "valid_from": "2025-10-21T10:00:00Z",
  "labels": ["phishing"]
}
三、STIX 物件生成(Python 實作)
使用官方套件 stix2 建立 STIX 物件:
python
複製程式碼
# stix_generator.py
from stix2 import Indicator, ThreatActor, Relationship, Bundle
from datetime import datetime
import uuid, json
def create_indicator(domain, confidence):
    indicator = Indicator(
        id=f"indicator--{uuid.uuid4()}",
        name="Phishing Domain",
        pattern=f"[domain-name:value = '{domain}']",
        pattern_type="stix",
        valid_from=datetime.utcnow().isoformat(),
        confidence=int(confidence * 100),
        labels=["phishing", "threat-intel"]
    )
    return indicator
# 假設從內部模型輸出高風險 domain
domains = [("secure-login.net", 0.92), ("bit-verify.co", 0.88)]
indicators = [create_indicator(d, c) for d, c in domains]
bundle = Bundle(indicators)
open("export/stix_bundle.json", "w").write(bundle.serialize(pretty=True))
print("✅ STIX bundle exported.")
輸出結果為可共享的 STIX JSON 文件,可直接上傳或透過 TAXII 傳遞。
四、TAXII 架構與安裝
4.1 架構圖
pgsql
複製程式碼
[Organization A]                     [Organization B]
  ↓ STIX bundle  ↑ TAXII 2.1 API  ↓ STIX bundle
+----------------------+     +----------------------+
|   TAXII Server       | <-> |   TAXII Client       |
|  (收發與倉儲端)       |     |  (請求與接收端)       |
+----------------------+     +----------------------+
4.2 使用 Python 實作 TAXII Server
使用套件 taxii2-server(或 Flask 模擬簡化版本):
python
複製程式碼
# taxii_server.py
from flask import Flask, request, jsonify
app = Flask(__name__)
DATA = []
@app.route("/collections/1/objects", methods=["GET", "POST"])
def objects():
    if request.method == "POST":
        obj = request.get_json()
        DATA.append(obj)
        return jsonify({"status": "received", "count": len(DATA)}), 202
    return jsonify({"objects": DATA})
if __name__ == "__main__":
    app.run(host="0.0.0.0", port=9000)
4.3 TAXII Client 模擬
python
複製程式碼
# taxii_client.py
import requests, json
server_url = "http://127.0.0.1:9000/collections/1/objects"
data = json.load(open("export/stix_bundle.json"))
resp = requests.post(server_url, json=data)
print(resp.json())
執行結果:
arduino
複製程式碼
✅ {"status": "received", "count": 2}
五、威脅情報交換自動化
5.1 定期同步流程
每日產生內部高風險 STIX bundle。
發送至合作單位 TAXII 伺服器(HTTPs POST)。
同時從對方 TAXII collections 拉取最新資料(GET)。
合併更新本地 Threat Feed。
5.2 自動化排程
bash
複製程式碼
0 4 * * * /usr/bin/python3 /app/stix_generator.py
10 4 * * * /usr/bin/python3 /app/taxii_client.py
20 4 * * * /usr/bin/python3 /app/threat_feed_aggregator.py
六、威脅情報信任與授權設計
6.1 驗證與信任等級(Trust Level)
每份共享情報都應附上信任分數(0–1),例如:
信任來源	分數	備註
官方安全單位(政府、CERT)	1.0	高可信
企業合作夥伴	0.8	正式協議
公開開源資料	0.6	須人工審核
未驗證來源	0.3	僅觀察,不自動封鎖
6.2 安全控制
傳輸安全:僅使用 HTTPS + API Key 或 JWT 認證。
資料稽核:每次交換後紀錄操作日誌與來源。
回滾策略:若接收到惡意或誤報情報,能快速撤銷封鎖。
七、整合至防詐系統主流程
將 STIX/TAXII 流程整合進既有防詐系統:
css
複製程式碼
[Threat Intelligence Collector]
        ↓
[STIX 生成器] → [TAXII 傳送器] → [外部組織]
        ↓                              ↑
 [本地 Threat Feed 聚合器] ← [TAXII 接收器]
        ↓
 [防詐 AI 模型更新] → [黑名單更新] → [防禦決策]
透過這種架構,整個系統不僅能吸收外部情報,也能將內部偵測成果回饋至社群與合作夥伴。
八、測試驗證
測試 1:雙方交換 STIX 檔案
本地 TAXII Server 運行於 9000 端口。
另一端 Client 成功發送 STIX bundle。
GET /collections/1/objects 可見到新增的指標。
測試 2:Feed 聚合更新
新增的 STIX Domain 應被 aggregator 合併進 threat_master.csv。
最終可由黑名單服務自動更新封鎖。
九、未來延伸與應用
建立區域防詐聯盟(Anti-Phishing Consortium)
企業 / 學界 / 政府協作共建 Threat Feed。
引入 STIX 2.1 Complex Relationships
連結攻擊行為(Attack Pattern)與攻擊者(Threat Actor)。
AI 生成情報摘要
利用 NLP 模型將大批威脅資料轉換為自然語言報告(Threat Brief)。