大三專題-ICS惡意流量辨識與流量移轉

工業控制系統中惡意流量檢測與流量移轉


說明


情境:


在真實的鐵路工控環境中設有機器學習異常流量檢測機制,當發現為惡意使用者時,會針對該使用者獨立開啟一個新的容器,攻擊者不會察覺自己的流量被移轉到非正式的環境,後續可以針對新產生的容器日誌進行惡意行為分析

環境:

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查看日誌