工業控制系統中惡意流量檢測與流量移轉
說明
情境:
在真實的鐵路工控環境中設有機器學習異常流量檢測機制,當發現為惡意使用者時,會針對該使用者獨立開啟一個新的容器,攻擊者不會察覺自己的流量被移轉到非正式的環境,後續可以針對新產生的容器日誌進行惡意行為分析
環境:
1. 在ubuntu(一)上以docker架設conpot容器,conpot容器作為合法的鐵路環境
2. 在同一台ubuntu(一)機器上,若偵測到惡意使用者IP時,會動態產生以IP命名的新容器
3. 另外一台ubuntu(二)作為日誌管理平台
異常偵測與流量移轉
(1) 新容器與合法環境的一致性
為了讓攻擊無法察覺自己的流量被移轉,必須產生一個與合法環境一模一樣的環境
透過 docker commit,將合法環境保存為新的映像 conpot_clean
docker commit legit_conpot conpot_clean
legal_conpot
為合法環境conpot_clean
為新的映像檔
(2) 創建 attacker_ips
名單
創建這個名單,後續可以讓腳本自動偵測此名單內的IP來自動啟動新容器
sudo ipset create attacker_ips hash:ip timeout 3600
- 這個
>attacker_ips
集合會存放攻擊者的 IP,並且1小時後自動刪除,防止誤判
(3) 流量移轉--iptables
透過iptables來寫規則,將異常的IP記錄在先前創立的attacker_ips
sudo iptables -I DOCKER-USER 1 -p tcp --dport 5020 -m recent --set --name MODBUS_ATTACK
sudo iptables -I DOCKER-USER 2 -p tcp --dport 5020 -m recent --update --seconds 10 --hitcount 5 --name MODBUS_ATTACK -j SET --add-set attacker_ips src
sudo iptables -A DOCKER-USER -j RETURN
- 規則一: 當有新的 TCP 連接嘗試訪問 5020 端口時,將來源 IP 記錄到
MODBUS_ATTACK
列表,並標記時間戳 - 規則二: 監控
MODBUS_ATTACK
列表中的 IP,如果某個 IP 在 60 秒內超過 5 次連接嘗試,就將其加入attacker_ips
集合。
(4)以個別IP啟動各自的新容器
目的是為了方便後須的分析,一個容器只會紀錄該使用者的紀錄
# 針對每個攻擊者 IP 啟動 Conpot 蜜罐
if [ -n "$ATTACKER_IPS" ]; then
for IP in $ATTACKER_IPS; do
CONPOT_NAME="conpot_$IP"
CONPOT_NAME=$(echo "$CONPOT_NAME" | tr '.' '_')
BACKUP_PATH="$BACKUP_DIR/$CONPOT_NAME"
- 新容器名稱以IP命名
docker run --name "$CONPOT_NAME" \
-v /home/bbrain/conpot_logs/new_machine:/var/log/conpot \
-v "$BACKUP_PATH":/conpot/data \
-p "$PORT_5020:5020" \
-p "$PORT_161:161/udp" \
-p "$PORT_20000:20000" \
-d conpot_clean \
/home/conpot/.local/bin/conpot \
--template /home/conpot/.local/lib/python3.6/site-packages/conpot-0.6.0-py3.6.egg/conpot/templates/default/ \
--config /home/conpot/.local/lib/python3.6/site-packages/conpot-0.6.0-py3.6.egg/conpot/conpot.cfg
- 啟動新容器
-v /home/bbrain/conpot_logs/new_machine:/var/log/conpot
將新容器的log檔映射到ubuntu本機上,以利後須做日誌集中管理
日誌集中管理
我們原先採用較有名的ELK,但是實在太耗系統資源了,原是採用輕量級的Loki + Promtail + Grafana
- Loki跟Grafana安裝在ubuntu(二)上
- Protail安裝在ubuntu(一)上
在ubuntu(一)中可以在promtail-config.yaml
設定要推送到Loki的日誌
- job_name: "Attacker_logs"
static_configs:
- targets:
- localhost
labels:
job: "Attacker_log"
host: "conpot_server"
__path__: "/home/bbrain/conpot_logs/new_machine/conpot.json"
設定好之後執行./promtail-linux-amd64 -config.file=promtail-config.yaml &
就可以在ubuntu(二)的瀏覽器http://<ubuntu(二)IP>:3100/ready
查看日誌