【実務・中級編】 NetFlow / IPFIX / sFlowを活用したランサムウェアの横展開(ラテラルムーブメント)のトラフィック異常検知 – サイバーセキュリティとプライバシー保護実践ガイド

ランサムウェアの「横展開」をフローデータで見抜け:ネットワークの深淵を可視化する技術

現場でネットワーク機器のログを眺めていると、時折「背筋が凍るような違和感」を覚える瞬間があります。普段は穏やかなはずの内部トラフィックが、真夜中に突然、特定のセグメントで異常なパルスを刻み始める――。それが、ランサムウェアによるラテラルムーブメント(横展開)の予兆であることは少なくありません。

今日は、教科書的な「セキュリティ製品を入れれば安心」という幻想を捨て、フローデータ(NetFlow/IPFIX/sFlow)を武器に、ネットワークの深層心理を読み解くエンジニアリングの話をしましょう。

—

なぜパケットキャプチャではなく「フロー」なのか

まず、誤解を解いておきます。全パケットをフルキャプチャ(PCAP)してIDS/IPSにかけるのは理想ですが、Gbps級のバックボーンでそれをやるのは物理的にもコスト的にも現実的ではありません。

そこで登場するのがフローデータです。フローとはいわば「通信の通帳記入」。誰が、いつ、どこに、どれくらいのデータを送ったかという「メタデータ」の集積です。

  • NetFlow/IPFIX: ルーターやL3スイッチが生成する、通信の「要約」。特に IPFIX は拡張性が高く、ベンダー独自の属性も埋め込めるのが強みです。
  • sFlow: パケットサンプリング技術。統計的な「断面」を切り取るため、高負荷な環境でもCPU負荷を抑えつつ広範な可視化が可能です。

これらを活用すれば、マルウェアが社内ネットワークを這いずり回る「足音」を、軽量かつ確実にキャッチできます。

—

異常検知の要:フローデータで「いつもと違う」を定義する

ランサムウェアが横展開を始めると、必ずと言っていいほど以下の挙動を見せます。

1. ARP/ICMPスキャン: ターゲットを探索する。
2. SMB/RDPによる大量アクセス: 暗号化対象を探し、ファイル共有を試みる。
3. 未知のポートへのバースト: C&Cサーバーとの通信や、特殊な攻撃コードの実行。

これらを検知するためには、フローデータから srcIP, dstIP, dstPort, bytes, packets を抽出し、時系列で統計処理をかける必要があります。

Pythonによる簡易異常検知ロジック(概念)

Pandasを使って、特定の送信元IPからの「接続先ポート数の急増」を検知するコード例です。

import pandas as pd

# フローデータを読み込む(実際にはElasticsearchやBigQueryから抽出したもの)
# df = load_flow_data()
# カラム構成: ['timestamp', 'src_ip', 'dst_ip', 'dst_port']

def detect_lateral_movement(df, threshold=50):
    # 送信元IPごとの「接続先ポート数」を1分単位で集計
    pivot = df.groupby(['timestamp', 'src_ip'])['dst_port'].nunique().reset_index()
    
    # 閾値を超えた怪しいIPを抽出
    suspicious = pivot[pivot['dst_port'] > threshold]
    
    for _, row in suspicious.iterrows():
        print(f"[!] 警告: {row['src_ip']} が短時間で {row['dst_port']} 個のポートへスキャンを実行中")

# 運用ではこのスクリプトをCronやAirflowで回し、Slack通知へ飛ばす

—

現場で役立つIPFIXの設定Tips

CiscoやJuniper、あるいは仮想ルーターでIPFIXを設定する際、単にフローを飛ばすだけでは不十分です。以下のパラメーターを意識してください。

# Cisco IOSでの設定例
flow record FLOW_MONITOR
 match ipv4 source address
 match ipv4 destination address
 match transport destination-port
 collect counter bytes long
 collect counter packets long
 # タイムアウトを短くし、検知ラグを減らす
 cache timeout active 60

cache timeout active 60 が重要です。デフォルトではフローの集計間隔が長すぎて、攻撃が終わった後にログが届く、という「死体検分」になりがちです。60秒程度に刻むことで、リアルタイム性を担保します。

—

APIベースでの自動遮断:インフラ運用への実装

異常を検知した後の「初動」こそ、エンジニアの腕の見せ所です。フローデータで異常を検知したら、そのIPを即座にAPI経由でスイッチのACLに登録し、通信を遮断(隔離)します。

# curlでファイアウォール/スイッチのAPIを叩いて隔離する例
curl -X POST https://network-controller.local/api/v1/acl/block \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <API_TOKEN>" \
-d '{
  "ip_address": "192.168.10.55",
  "action": "deny",
  "reason": "Lateral movement detected via Flow Analysis",
  "expire_minutes": 60
}'

この「検知→隔離」の自動化パイプラインが組めていれば、夜間にランサムウェアが徘徊しても、朝起きた時には「一件落着」しているという状況を作れます。

—

最後に:ツールに頼りすぎないための眼差しを

フローデータによる異常検知は強力ですが、万能ではありません。巧妙な攻撃者は、スキャン速度を落として低速で横展開する「低速スキャン」を仕掛けてきます。

フローデータを監視する際は、単に「閾値」を見るだけでなく、「通信の相関関係」を意識してください。「普段はWebサーバーとしか通信しないはずのDBサーバーが、なぜか経理部のPCへアクセスしている」。この「違和感」を検知できるのは、ネットワークの論理構成を熟知しているあなただけです。

技術はあくまで道具です。その裏側でパケットがどのように流れているのか、という想像力を忘れずに、泥臭くネットワークを守り抜いていきましょう。それが、真の「凄腕」への唯一の近道です。

コメント

タイトルとURLをコピーしました