Windowsブロックネットワークトラフィックの取得

  • Windowsブロックネットワークトラフィックの取得

Windows ブロックネットワークトラフィックの取得

  • ブロックされたトラフィックを特定する必要があります。ブロックされたトラフィックには、送信方向と受信方向が含まれます。
  • ブロックの2つの形式:接続(connection)ベースとパケット(packet)ベースです。パケットの破棄は頻繁に発生し、破棄理由を審査する必要があります。接続ベースのブロックは、実際に注目すべきブロックシナリオにより適しています。
  • 多くの正常に処理されたパケットもドロップされるため、ドロップとブロックの動作を区別する必要があります。主にブロックの状況に注目します。

テストプロジェクトの構築

WFPは主にusermodeで動作し、一部はkernelmodeで動作します。その能力はドライバーの形で体現されます。テスト環境を構築する方法は比較的複雑です。推奨される方法は、テストマシンとして別の物理マシンを使用し、開発マシンでコンパイル後にリモートデバッグする方法です。 条件の制約により、ローカルでのデバッグも可能です。

コンパイルの問題:

その他の問題:

監査によるブロックイベントの取得

デフォルトでは、WFPの監査は無効になっています。

  • グループポリシーオブジェクトエディタMMC管理単位、ローカルセキュリティポリシーMMC管理単位、またはauditpol.exeコマンドを使用して、カテゴリ別に監査を有効化できます。
  • auditpol.exeコマンドを使用して、サブカテゴリ別に監査を有効化できます。
  • 設定にはGUIDを使用する必要があります。そうでない場合、異なる言語のシステムでローカライズの問題が発生します。
  • 監査は循環ログを使用し、128KBでリソース消費を心配する必要はありません。

カテゴリhttps://docs.microsoft.com/en-us/windows/win32/secauthz/auditing-constants

Category/Subcategory GUID
Object Access {6997984A-797A-11D9-BED3-505054503030}
Policy Change {6997984D-797A-11D9-BED3-505054503030}

Object Access サブカテゴリと対応GUID https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-gpac/77878370-0712-47cd-997d-b07053429f6d

Object Access Subcategory Subcategory GUID Inclusion Setting
Filtering Platform Packet Drop {0CCE9225-69AE-11D9-BED3-505054503030} No Auditing
Filtering Platform Connection {0CCE9226-69AE-11D9-BED3-505054503030} No Auditing
Other Object Access Events {0CCE9227-69AE-11D9-BED3-505054503030} No Auditing

Policy Change サブカテゴリと対応GUID:

Policy Change Subcategory Subcategory GUID
Audit Policy Change {0CCE922F-69AE-11D9-BED3-505054503030}
Authentication Policy Change {0CCE9230-69AE-11D9-BED3-505054503030}
Authorization Policy Change {0CCE9231-69AE-11D9-BED3-505054503030}
MPSSVC Rule-Level Policy Change {0CCE9232-69AE-11D9-BED3-505054503030}
Filtering Platform Policy Change {0CCE9233-69AE-11D9-BED3-505054503030}
Other Policy Change Events {0CCE9234-69AE-11D9-BED3-505054503030}
# auditpolマニュアル参照:https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/auditpol
# このセクションは主に'Object Access'カテゴリに注目します
# クエリ可能なフィールドを取得
# -v はGUIDを表示し、-r はcsvレポートを表示します
auditpol /list /category /v
auditpol /list /subcategory:* /v
# 特定のサブカテゴリの監査設定を取得
auditpol /get /category:'Object Access' /r | ConvertFrom-Csv| Get-Member
# GUIDを照会
auditpol /get /category:'Object Access' /r | ConvertFrom-Csv| Format-Table Subcategory,'Subcategory GUID','Inclusion Setting'
# Subcategoryを探す
auditpol /list /subcategory:"Object Access","Policy Change" -v
# バックアップ
auditpol /backup /file:d:\audit.bak
# 復元
auditpol /restore /file:d:\audit.bak
# Policyを変更
# **Policy Change**    | {6997984D-797A-11D9-BED3-505054503030}
auditpol /set /category:"{6997984D-797A-11D9-BED3-505054503030}" /success:disable /failure:disable
# Filtering Platform Policy Change | {0CCE9233-69AE-11D9-BED3-505054503030}
auditpol /set /subcategory:"{0CCE9233-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable

# **Object Access**    | {6997984A-797A-11D9-BED3-505054503030}
auditpol /get /category:"{6997984A-797A-11D9-BED3-505054503030}"
auditpol /set /category:"{6997984A-797A-11D9-BED3-505054503030}" /success:disable /failure:disable
# Filtering Platform Packet Drop | {0CCE9225-69AE-11D9-BED3-505054503030}
auditpol /set /subcategory:"{0CCE9225-69AE-11D9-BED3-505054503030}" /success:disable /failure:enable
# Filtering Platform Connection  | {0CCE9226-69AE-11D9-BED3-505054503030}
auditpol /set /subcategory:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:disable /failure:enable
# ログを読み込む
$Events = Get-WinEvent -LogName 'Security'
foreach ($event in $Events) {
    ForEach ($line in $($event.Message -split "`r`n")) {
        Write-host $event.RecordId ':' $Line
        break
    }
}

イベントの説明:

Event ID Explanation
5031(F) The Windows Firewall Service blocked an application from accepting incoming connections on the network.
5150(-) The Windows Filtering Platform blocked a packet.
5151(-) A more restrictive Windows Filtering Platform filter has blocked a packet.
5152(F) The Windows Filtering Platform blocked a packet.
5153(S) A more restrictive Windows Filtering Platform filter has blocked a packet.
5154(S) The Windows Filtering Platform has permitted an application or service to listen on a port for incoming connections.
5155(F) The Windows Filtering Platform has blocked an application or service from listening on a port for incoming connections.
5156(S) The Windows Filtering Platform has permitted a connection.
5157(F) The Windows Filtering Platform has blocked a connection.
5158(S) The Windows Filtering Platform has permitted a bind to a local port.
5159(F) The Windows Filtering Platform has blocked a bind to a local port.

注目のイベントの詳細説明:

  • Audit Filtering Platform Packet Drop
    • この種類のイベントは発生量が非常に多く、5157イベントに注目することをお勧めします。同じ情報を記録しますが、5157は接続ベースで記録され、パケットベースではありません。

    • Failure events volume typically is very high for this subcategory and typically used for troubleshooting. If you need to monitor blocked connections, it is better to use “5157(F): The Windows Filtering Platform has blocked a connection,” because it contains almost the same information and generates per-connection, not per-packet. 5157を推奨

    • 5152

    • 5153

  • Audit Filtering Platform Connection
    • 失敗イベントのみに注目することをお勧めします。ブロックされた接続など、必要に応じて許可された接続に注目します。
    • 5031
      • If you don’t have any firewall rules (Allow or Deny) in Windows Firewall for specific applications, you will get this event from Windows Filtering Platform layer, because by default this layer is denying any incoming connections.
    • 5150
    • 5151
    • 5155
    • 5157
    • 5159

プロバイダー情報の取得

# security関連のプロバイダー情報を取得
Get-WinEvent -ListProvider "*Security*"  | Select-Object providername,id
# Microsoft-Windows-Security-Auditing                             54849625-5478-4994-a5ba-3e3b0328c30d
# プロバイダーが提供するtask情報を取得
Get-WinEvent -ListProvider "Microsoft-Windows-Security-Auditing"  | Select-Object -ExpandProperty tasks
# SE_ADT_OBJECTACCESS_FIREWALLCONNECTION       12810 Filtering Platform Connection          00000000-0000-0000-0000-000000000000
ProviderName Id
Security Account Manager 00000000-0000-0000-0000-000000000000
Security 00000000-0000-0000-0000-000000000000
SecurityCenter 00000000-0000-0000-0000-000000000000
Microsoft-Windows-Security-SPP-UX-GenuineCenter-Logging fb829150-cd7d-44c3-af5b-711a3c31cedc
Microsoft-Windows-Security-Mitigations fae10392-f0af-4ac0-b8ff-9f4d920c3cdf
Microsoft-Windows-VerifyHardwareSecurity f3f53c76-b06d-4f15-b412-61164a0d2b73
Microsoft-Windows-SecurityMitigationsBroker ea8cd8a5-78ff-4418-b292-aadc6a7181df
Microsoft-Windows-Security-Adminless ea216962-877b-5b73-f7c5-8aef5375959e
Microsoft-Windows-Security-Vault e6c92fb8-89d7-4d1f-be46-d56e59804783
Microsoft-Windows-Security-Netlogon e5ba83f6-07d0-46b1-8bc7-7e669a1d31dc
Microsoft-Windows-Security-SPP e23b33b0-c8c9-472c-a5f9-f2bdfea0f156
Microsoft-Windows-Windows Firewall With Advanced Security d1bc9aff-2abf-4d71-9146-ecb2a986eb85
Microsoft-Windows-Security-SPP-UX-Notifications c4efc9bb-2570-4821-8923-1bad317d2d4b
Microsoft-Windows-Security-SPP-UX-GC bbbdd6a3-f35e-449b-a471-4d830c8eda1f
Microsoft-Windows-Security-Kerberos 98e6cfcb-ee0a-41e0-a57b-622d4e1b30b1
Microsoft-Windows-Security-ExchangeActiveSyncProvisioning 9249d0d0-f034-402f-a29b-92fa8853d9f3
Microsoft-Windows-NetworkSecurity 7b702970-90bc-4584-8b20-c0799086ee5a
Microsoft-Windows-Security-SPP-UX 6bdadc96-673e-468c-9f5b-f382f95b2832
Microsoft-Windows-Security-Auditing 54849625-5478-4994-a5ba-3e3b0328c30d
Microsoft-Windows-Security-LessPrivilegedAppContainer 45eec9e5-4a1b-5446-7ad8-a4ab1313c437
Microsoft-Windows-Security-UserConsentVerifier 40783728-8921-45d0-b231-919037b4b4fd
Microsoft-Windows-Security-IdentityListener 3c6c422b-019b-4f48-b67b-f79a3fa8b4ed
Microsoft-Windows-Security-EnterpriseData-FileRevocationManager 2cd58181-0bb6-464e-828a-056ff837f966
Microsoft-Windows-Security-Audit-Configuration-Client 08466062-aed4-4834-8b04-cddb414504e5
Microsoft-Windows-Security-IdentityStore 00b7e1df-b469-4c69-9c41-53a6576e3dad

ブロックイベントの構築

ブロックイベントを構築する際は、ローカルの他のソフトウェアの動作に影響を与えることに非常に注意してください! 必要に応じて、.\WFPSampler.exe -cleanを使用してフィルターをすぐにクリアできます。

手順:

  1. Filtering Platform Connectionの監査スイッチをオンにします。auditpol /set /subcategory:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable

  2. Event Viewerを開き、Custom Viewを作成し、フィルターを作成します。ここでは5155、5157、5159の3つのイベントに注目します。 filter example

  3. フィルターを構築します。WFPSampler.exeを使用してフィルターを構築し、ローカルの80ポートへのリスニングをブロックします。.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_LISTEN_V4 -iplp 80

  4. サードパーティ製(IIS以外)のHTTPサーバーを使用します。ここではnginxを使用し、デフォルトで80ポートをリスンします。ダブルクリックで起動すると5155イベントが発生します。 Audit event example

  5. フィルターを元に戻します。.\WFPSampler.exe -clean

  6. 監査スイッチを元に戻します。auditpol /set /category:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:disable /failure:disable

# 5155 blocked an application or service from listening on a port for incoming connections
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_LISTEN_V4
# 5157 blocked a connection
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_CONNECT_V4
# 5159, blocked a bind to a local port
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V4

# Other
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V4_DISCARD
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4_DISCARD
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_CONNECT_V4_DISCARD

# To find a specific Windows Filtering Platform filter by ID, run the following command:
netsh wfp show filters
# To find a specific Windows Filtering Platform layer ID, you need to execute the following command:
netsh wfp show state

ネットワークイベント(NET_EVENT)の監視

  • ネットワークイベントは列挙検索とサブスクリプションをサポートしています。
  • 列挙方式はカスタムフィルター条件をサポートし、特定期間のネットワークイベントを取得できます。
  • サブスクリプション方式はコールバック関数を注入でき、リアルタイムでフィードバックします。

サポートされているイベントタイプ:

typedef enum FWPM_NET_EVENT_TYPE_ {
  FWPM_NET_EVENT_TYPE_IKEEXT_MM_FAILURE = 0,
  FWPM_NET_EVENT_TYPE_IKEEXT_QM_FAILURE,
  FWPM_NET_EVENT_TYPE_IKEEXT_EM_FAILURE,
  FWPM_NET_EVENT_TYPE_CLASSIFY_DROP,
  FWPM_NET_EVENT_TYPE_IPSEC_KERNEL_DROP,
  FWPM_NET_EVENT_TYPE_IPSEC_DOSP_DROP,
  FWPM_NET_EVENT_TYPE_CLASSIFY_ALLOW,
  FWPM_NET_EVENT_TYPE_CAPABILITY_DROP,
  FWPM_NET_EVENT_TYPE_CAPABILITY_ALLOW,
  FWPM_NET_EVENT_TYPE_CLASSIFY_DROP_MAC,
  FWPM_NET_EVENT_TYPE_LPM_PACKET_ARRIVAL,
  FWPM_NET_EVENT_TYPE_MAX
} FWPM_NET_EVENT_TYPE;

サポートされているフィルター条件(FWPM_NET_EVENT_ENUM_TEMPLATE):

Value Meaning
FWPM_CONDITION_IP_PROTOCOL RFC 1700で指定されたIPプロトコル番号。
FWPM_CONDITION_IP_LOCAL_ADDRESS ローカルIPアドレス。
FWPM_CONDITION_IP_REMOTE_ADDRESS リモートIPアドレス。
FWPM_CONDITION_IP_LOCAL_PORT ローカルトランスポートプロトコルポート番号。ICMPの場合はメッセージタイプ。
FWPM_CONDITION_IP_REMOTE_PORT リモートトランスポートプロトコルポート番号。ICMPの場合はメッセージコード。
FWPM_CONDITION_SCOPE_ID インターフェイスIPv6スコープ識別子。内部使用のために予約されています。
FWPM_CONDITION_ALE_APP_ID アプリケーションのフルパス。
FWPM_CONDITION_ALE_USER_ID ローカルユーザーの識別。

ドライバー以外の呼び出し方式では、通常のドロップイベントしか取得できません。

ネットワーク接続(NetConnection)の監視

ネットワークイベントの監視と比較して、ネットワーク接続の監視にはより高い権限が必要です。 callback方式

呼び出し元は、接続オブジェクトのコンテナに対してFWPM_ACTRL_ENUMアクセスと、接続オブジェクトに対してFWPM_ACTRL_READアクセスが必要です。詳細は、Access Controlを参照してください。

ネットワーク接続の監視にまだ成功していません。

同様の問題を見つけました。Receiving in/out traffic stats using WFP user-mode API。私の調査で遭遇した現象と同じく、サブスクリプション関数は何も受信せず、イベントが得られず、エラーもありません。監査をオンにしたり、特権を上げても成功しませんでした。カーネルモード以外ではドロップイベントの報告しか得られないと指摘している人もいます。これはブロックイベントを取得する必要性を満たせません。

セキュリティディスクリプタの追加例: https://docs.microsoft.com/en-us/windows/win32/fwp/reserving-ports

Application Layer Enforcement(ALE)の紹介

  • ALEは一連のカーネルモードフィルターを含み、ステートフルフィルタリングをサポートします。
  • ALE層のフィルターは、接続の作成、ポート割り当て、ソケット管理、原始ソケット作成、プロミスキャスモード受信の許可をサポートします。
  • ALE層のフィルターは接続(connection)ベースまたはソケット(socket)ベースで分類されますが、他の層のフィルターはパケット(packet)ベースでのみ分類できます。
  • ALEフィルターの参照 ale-layers

コーディング

ほとんどのWFP関数はユーザーモードでもカーネルモードでも呼び出せます。ただし、ユーザーモード関数はWin32エラーコードを表すDWORD値を返し、カーネルモード関数はNTステータスコードを表すNTSTATUS値を返します。したがって、関数名とセマンティクスはユーザーモードとカーネルモードで同じですが、関数シグネチャは異なります。これにより、関数プロトタイプの個別のユーザーモードとカーネルモード固有のヘッダーが必要になります。ユーザーモードのヘッダーファイル名は「u」で終わり、カーネルモードのヘッダーファイル名は「k」で終わります。

結論

要件はイベントの発生を知ることだけで、イベントを即座に処理する必要はありません。また、ドライバーを開発するとさらに大きなリスクが伴うため、イベント監査を使用してログ生成イベントを監視し、ブロックイベントを取得することを決定しました。 NotifyChangeEventLogを使用してログレコードイベントを監視するスレッドを新しく作成します。

付録

WFPアーキテクチャ

WFP(Windows Filter Platform) Windows Filter Platformの基本アーキテクチャ

データフロー

データフロー:

  1. パケットがネットワークスタックに入ります。
  2. ネットワークスタックはシャムを見つけ、呼び出します。
  3. シャムは特定のレイヤーで分類プロセスを呼び出します。
  4. 分類中にフィルターが一致し、結果として得られるアクションが実行されます。(フィルターアービトレーションを参照してください。)
  5. 分類プロセス中にコールアウトフィルターが一致した場合、対応するコールアウトが呼び出されます。
  6. シャムは最終的なフィルタリング決定に従って動作します(例:パケットをドロップ)。

参考リンク