Windowsブロックネットワークトラフィックの取得
Categories:
- Windowsブロックネットワークトラフィックの取得
Windows ブロックネットワークトラフィックの取得
- ブロックされたトラフィックを特定する必要があります。ブロックされたトラフィックには、送信方向と受信方向が含まれます。
- ブロックの2つの形式:接続(connection)ベースとパケット(packet)ベースです。パケットの破棄は頻繁に発生し、破棄理由を審査する必要があります。接続ベースのブロックは、実際に注目すべきブロックシナリオにより適しています。
- 多くの正常に処理されたパケットもドロップされるため、ドロップとブロックの動作を区別する必要があります。主にブロックの状況に注目します。
テストプロジェクトの構築
WFPは主にusermodeで動作し、一部はkernelmodeで動作します。その能力はドライバーの形で体現されます。テスト環境を構築する方法は比較的複雑です。推奨される方法は、テストマシンとして別の物理マシンを使用し、開発マシンでコンパイル後にリモートデバッグする方法です。 条件の制約により、ローカルでのデバッグも可能です。
- Microsoft WFP Sample プロジェクト
- こちらに注目:Windows-driver-samples\network\trans\WFPSampler
- WFPSampler プロジェクトガイド
コンパイルの問題:
その他の問題:
監査によるブロックイベントの取得
デフォルトでは、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.

-
- 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.
51505151- 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を使用してフィルターをすぐにクリアできます。
手順:
-
Filtering Platform Connectionの監査スイッチをオンにします。
auditpol /set /subcategory:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable -
Event Viewerを開き、Custom Viewを作成し、フィルターを作成します。ここでは5155、5157、5159の3つのイベントに注目します。

-
フィルターを構築します。WFPSampler.exeを使用してフィルターを構築し、ローカルの80ポートへのリスニングをブロックします。
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_LISTEN_V4 -iplp 80 -
サードパーティ製(IIS以外)のHTTPサーバーを使用します。ここではnginxを使用し、デフォルトで80ポートをリスンします。ダブルクリックで起動すると5155イベントが発生します。

-
フィルターを元に戻します。
.\WFPSampler.exe -clean -
監査スイッチを元に戻します。
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
- その他のフィルターの参照 filtering-layer-identifiers
コーディング
ほとんどのWFP関数はユーザーモードでもカーネルモードでも呼び出せます。ただし、ユーザーモード関数はWin32エラーコードを表すDWORD値を返し、カーネルモード関数はNTステータスコードを表すNTSTATUS値を返します。したがって、関数名とセマンティクスはユーザーモードとカーネルモードで同じですが、関数シグネチャは異なります。これにより、関数プロトタイプの個別のユーザーモードとカーネルモード固有のヘッダーが必要になります。ユーザーモードのヘッダーファイル名は「u」で終わり、カーネルモードのヘッダーファイル名は「k」で終わります。
結論
要件はイベントの発生を知ることだけで、イベントを即座に処理する必要はありません。また、ドライバーを開発するとさらに大きなリスクが伴うため、イベント監査を使用してログ生成イベントを監視し、ブロックイベントを取得することを決定しました。 NotifyChangeEventLogを使用してログレコードイベントを監視するスレッドを新しく作成します。
付録
WFPアーキテクチャ
WFP(Windows Filter Platform) 
データフロー
データフロー:
- パケットがネットワークスタックに入ります。
- ネットワークスタックはシャムを見つけ、呼び出します。
- シャムは特定のレイヤーで分類プロセスを呼び出します。
- 分類中にフィルターが一致し、結果として得られるアクションが実行されます。(フィルターアービトレーションを参照してください。)
- 分類プロセス中にコールアウトフィルターが一致した場合、対応するコールアウトが呼び出されます。
- シャムは最終的なフィルタリング決定に従って動作します(例:パケットをドロップ)。