內部異常行為偵測
GitHub
CERT r4.2 ・ 內部威脅行為分析

內部異常行為偵測
× 機器學習事前預警

用 SQL+Power BI 建立每位員工的行為基準線,再用機器學習在犯案前把高風險員工排進每日 Top 10,最後整合成一個主管每天早上打開就能用的儀表板。

SQL ServerPower BI ・ DAXPython ・ DuckDBRandom Forest ・ XGBoostSHAP統計檢定Git ・ GitHub
一句話結論

只用行為特徵 × Random Forest 就夠了:45 名內鬼全數進入每日 Top 10,38 人在第一次犯案之前就被列出,中位數提早 5 天;加入人格與組織資訊沒有更早。

1,000
模擬員工 ・ 17 個月 log
45 / 45
內鬼全數預警(逐月滾動測試)
5 天
比第一次犯案提早(中位數)
53×
排序能力優於亂猜(PR-AUC)
01 ・ 背景

只看行為異常,永遠慢一步

內部人員擁有合法權限,傳統資安設備認不出來;等異常真的出現,事情往往已經發生了。

痛點
1

合法權限下的惡意操作,規則式監控抓不到Kamatchi & Uma (2025), Int. J. Inf. Secur. DOI

2

行為異常出現時,風險已經發生,也看不出原因Papatsaroucha et al. (2026), arXiv:2605.22119 PDF

3

前人多用週/月彙總、比準確率,惡意行為容易被「平均掉」Le & Zincir-Heywood (2019), IEEE DISSECT

目標 1

看見異常:每人行為基準線

用登入、USB、上網、Email、檔案 log,把每個人「今天」和「自己過去」比,做成可鑽研的儀表板。

目標 2

事前預警:比「提早幾天」

用機器學習每天排出風險 Top 10,評估標準不是準確率,而是比第一次犯案早幾天。

資料 CERT r4.2(CMU SEI 合成資料) 登入USB上網Email檔案OCEAN 人格LDAP 名冊 ・ 3 種內鬼情境:洩密 30跳槽 30報復 10 Kaggle
02 ・ 方法

兩條管線,匯流到同一個儀表板

SQL/Power BI 負責「看見異常」,Python/ML 負責「排出風險順序」,最後寫回同一個 Power BI。核心概念只有一個:不跟別人比,跟自己過去比。

看見異常
SQL SERVER

清理成事實表/維度表

5 類行為 View;比對每月 LDAP,員工消失=預計離職

原始 log 14 GB,先在資料庫收斂
POWER BI ・ DAX

每人行為基準線

星狀模型;量值=當日 vs 自己歷史平均

業務不同,跟自己比才公平
預測風險
PYTHON ・ DUCKDB

人 × 天 特徵

66 個特徵:今日行為、自身偏離、組織、人格

週/月彙總會把異常平均掉
RF ・ XGB ・ LR

逐月滾動訓練

每月只用過去資料訓練,考下個月

模擬真的上線,不偷看未來
SAMPLE WEIGHT

訓練權重

內鬼權重加高、犯案天數少的每天拉高

小A 5天
小B 50天
每人總權重相同
內鬼僅 0.55%,不加權只會猜正常
WILCOXON ・ MCNEMAR

比「提早幾天」

每天只查 Top 10,在此限制下比天數

全判正常準確率就有 99.3%
整合
CSVSHAP → POWER BI

分數+原因寫回儀表板

Python 產出 risk_daily.csv(每日分數+前三原因),Power BI 讀取顯示

Python 負責算,Power BI 只負責看
03 ・ 結果

只用行為 × Random Forest,中位數提早 5 天

驗證三個假設,再用兩位真實內鬼示範主管怎麼從警報查到證據。

H1成立

「人 × 天」+跟自己過去比,能在犯案前預警

38 / 45 人犯案前就進入 Top 10(p < 0.001)
H2不成立

加入人格+組織變動,能比只用行為更早

5 → 3~4 天加了沒有更早(p ≥ 0.05)
H3部分成立

換不同模型、或改變「犯案前幾天算高風險」,預警效果會不同

Random Forest 最佳比較 RF/XGBoost/LR:RF 顯著勝 LR、與 XGBoost 相當;犯案前 7/14/30 天標為高風險,結果沒有差異
完整實驗數據與過程36 組實驗、5 張比較表、資料處理畫面
量尺

提早天數 = 第一次犯案日 − 第一次進入 Top 10

提早天數
犯案前 30 天
第一次預警
第一次犯案
嚴謹度
  • 逐月滾動:模型沒看過要考的月份
  • 不洩漏:拿掉「距離職天數」(要知道未來)
  • 不造假:用 class weight,不用 SMOTE
  • 檢定:Wilcoxon、McNemar,p < 0.05

提早天數(中位數)RF × 犯案前 14 天標為高風險

G1 只用行為
5 天
G2 +人格
4 天
G3 +組織
4 天
G4 全部
3 天

表 1 特徵組比較RF;p 為與 G1 比

特徵組抓到犯案前P@10p(14 天)p(30 天)
G1 只用行為45380.453——
G2 +人格45360.4260.1580.151
G3 +組織45360.4270.2470.212
G4 全部45350.4210.0500.102

表 2 模型比較G1 × 犯案前 14 天

模型抓到提早P@10p(抓到)
Random Forest455 天0.453—
XGBoost454 天0.402—
Logistic Reg.282.5 天0.174< 0.001

RF vs XGBoost 提早天數 p=0.383,無顯著差異

表 3 犯案前幾天標為高風險G1 × RF

標記期間抓到提早犯案前P@10
犯案前 7 天454 天380.419
犯案前 14 天455 天380.453
犯案前 30 天456 天380.457

兩兩比較 p ≥ 0.18,選哪個都可以

表 4 分類指標G1 × 犯案前 14 天

模型AccuracyPrecisionRecallPR-AUC
Random Forest98.2%0.1820.3910.391
XGBoost98.2%0.1730.3710.363
Logistic Reg.97.8%0.0410.0890.079
全判正常99.3%00—
隨機亂猜———0.007

全判正常準確率最高 → 不看 Accuracy;RF 排序能力是亂猜的 53 倍

表 5 人格洗牌測試G4 × XGBoost × 犯案前 14 天

人格抓到提早犯案前p
真實452 天33—
打亂451 天270.077

打亂後變差但不顯著:人格有訊號,但和行為重疊

過程畫面
SQL Server
SQL Server:整理後的事實表與維度表 View
Demo:主管每天早上打開的那一頁

兩位真實內鬼,從警報一路查到證據。點右側章節可以直接跳到該段,影片下方會同步說明「現在在看什麼」。

現在畫面
按下播放,或點選右側章節影片無聲,說明會隨畫面切換。
    驗證案例 1 ・ 情境 2 跳槽
    8/20 的 Top 10 第 1 名 EGD0132,正是真實內鬼
    • 8/2開始犯案:上班時間瀏覽求職網站(job-hunt、monster、LinkedIn),並寫信給競爭對手
    • 8/2當天就被列為 Top 10 第 1 名(風險 0.98),原因:瀏覽網頁數比自己過去 30 天高
    • 8/31 起用 USB 大量帶走資料,9/28 離職

    → 比他開始用 USB 偷資料早了 4 週,期間幾乎天天在名單上

    ▶ 跳到 0:09 看這一段
    驗證案例 2 ・ 情境 1 洩密
    CAH0936 在犯案前 2 天就進入名單
    • 8/9進入 Top 10,原因:下班後插 USB 2 次,比自己過去高
    • 8/11第一次犯案:凌晨 4 點登入(影片 1:36 登入頁可見)、插 USB、把資料上傳到 wikileaks
    • 8/12深夜再做一次,之後離職(儀表板狀態顯示「30 天內離職」)

    → 比第一次犯案早 2 天發出警報

    ▶ 跳到 1:06 看這一段
    各頁怎麼讀
    主儀表板
    回答什麼問題

    背後方法

    怎麼讀

    04 ・ 未來與貢獻

    輸出的是「關注順序」,不是「有罪判定」

    結論

    越簡單越好:只用行為特徵 × Random Forest

    45 名內鬼全數預警、38 人在犯案前,中位數提早 5 天。人格資訊和行為重疊,加入後只增加複雜度。

    貢獻

    讓主管知道今天先關心誰

    風險分數只決定關注順序(主管關心、確認業務需求、檢視離職者權限),不作為懲處依據。CERT 的惡意行為多從工作滿意度下降開始,提早關心就可能從根本避免事件。

    限制:r4.2 是模擬資料,「人格 → 行為 → 惡意」的關聯是設計出來的;本專題驗證的是做法能讓警報提早,不宣稱人格能預測犯罪。評估只有 45 人,小差異不容易達到顯著。

    下一步:ITAdmin 只佔員工 3.5%,卻佔 Top 10 的 36.8%(工作本來就常插 USB)→ 加入「跟同職務比」的偏離量,並要求連續 2 天進榜才發警報,降低誤報。

    同一套邏輯,延伸到更多場景
    01

    跨產業複用

    「由大到小」鑽研+跟自己過去比,套用到製造業、流程異常排查

    02

    提早預警

    歷史資料建模,提早鎖定高風險族群(離職、流失、詐欺)

    03

    AI 查詢 log

    「誰在異常時段大量查詢內部 AI」與 CERT 是同一類問題

    想看程式與 SQL?

    資料清理 SQL、ML 腳本(00~06)、方法紀錄與 Power BI 說明都在 repo 裡。

    前往 GitHub