このAzure FunctionsアプリケーションはBlob Storageに追加されたEVTXファイルを自動的に処理し、Azure Monitor Log Ingest APIを使用してMicrosoft Sentinelの組み込み SecurityEvent テーブルに送信します。
- 本READMEおよび実装コードはAIツール(GitHub Copilot)を用いて生成・整備されています。
- 本コードは個人の検証目的で提供しており、企業・団体などの本番環境で利用する場合は利用者自身の責任で検証・運用してください。
- Descriptionやイベントログフィールドのマッピングには不足や誤りが含まれる可能性があります。必要に応じて内容を精査・補完してください。
SecurityEventテーブル完全互換性を実現!
- ✅ SecurityEvent (組み込み) テーブルへ直接インジェスト
- ✅ SecurityEventテーブルと同等のスキーマ構成(DCRのストリーム定義で実現)
- ✅ DCR (Data Collection Rule) 設定完了
- ✅ 完全なフィールドマッピング実装
- ✅ テストデータ送信成功確認
- Blob Trigger: 指定されたBlobコンテナにEVTXファイルが追加されると自動実行
- EVTX解析: EVTXファイルをXMLとして解析し、SecurityEvent互換形式のJSONに変換
- Log Analytics送信: Azure Monitor Log Ingest APIを使用してSecurityEventテーブルに送信
- 完全互換性: SecurityEventテーブルの90フィールドに対応した包括的データマッピング
- バッチ処理: 大量のイベントを効率的に処理するため1000件ずつバッチ送信
- エラーハンドリング: 適切なログ出力とエラー処理
azure-functions
azure-monitor-ingestion
azure-identity
python-evtx
requests
以下の環境変数を設定する必要があります:
DCE_ENDPOINT: Data Collection Endpoint URL- 例:
https://your-dce-endpoint.monitor.azure.com
- 例:
DCR_IMMUTABLE_ID: Data Collection Rule の Immutable ID- 例:
dcr-12345678abcd1234abcd1234abcd1234
- 例:
STREAM_NAME: データストリーム名 (デフォルト:Custom-SecurityEvent)
AzureWebJobsStorage: Azure Storage接続文字列(Blob Triggerおよび内部状態の保持に利用)FUNCTIONS_WORKER_RUNTIME:python
create-azure-resources.ps1 を使用すると、SecurityEvent テーブルへ直接送信するための Data Collection Endpoint (DCE) と Data Collection Rule (DCR) を一括で構成できます。手動で個別の az コマンドを実行する必要はありません。
- DCE と DCR を作成または再利用し、両者を自動で関連付け
dcr-schema-securityevent.jsonを基に SecurityEvent 互換の 90+ フィールド構成を適用- DCR Immutable ID と DCE Endpoint を出力し、Azure Functions の環境変数設定をガイド
- 冪等性を考慮しており、再実行しても既存リソースを破壊しません
- Azure CLI がインストールされており、
az login済み(必要に応じてサービスプリンシパル指定可) - 指定するサブスクリプション、リソースグループ、Log Analytics Workspace が既に存在
- PowerShell (pwsh) でスクリプトを実行可能
pwsh ./create-azure-resources.ps1 `
-SubscriptionId "00000000-0000-0000-0000-000000000000" `
-ResourceGroup "rg-evtx" `
-WorkspaceName "laws-evtx" `
-Location "japaneast"任意で以下のパラメーターを指定できます:
-DcrName/-DceName: 既定以外の名前を使用したい場合-DcrFilePath: カスタム DCR JSON を利用したい場合-ServicePrincipalAppId-ServicePrincipalSecret-ServicePrincipalTenantId: サービスプリンシパルでのログインをスクリプト内で完結させる場合に指定
- コンソールに表示される
DCR Immutable IDとDCE Endpointをlocal.settings.jsonなどのDCR_IMMUTABLE_ID/DCE_ENDPOINTとして設定 - 出力メッセージに従い、必要なロール割り当て(Monitoring Metrics Publisher、Log Analytics Contributor)を付与
- Log Analytics で
SecurityEvent | take 5などのクエリを実行して取り込み結果を確認
詳細な手順やロール設定のコマンドは create-azure-resources.ps1 内のコメントにも記載されています。
Azure Functions から Log Ingest API を実行するには、サービスプリンシパルまたはマネージドアイデンティティに適切な Azure ロールを付与する必要があります。
-
Monitoring Metrics Publisher (DCR に対して)
- Data Collection Rule へのデータ送信に必須
- スコープ: 作成した DCR リソース
-
Log Analytics Contributor (Log Analytics Workspace に対して・オプション)
- ワークスペースのテーブル操作やクエリ実行が必要な場合に付与
- スコープ: Log Analytics Workspace リソース
方法1: サービスプリンシパル認証(推奨)
-
サービスプリンシパルを作成:
az ad sp create-for-rbac --name "evtx-function-sp" --role "Monitoring Metrics Publisher" --scopes "/subscriptions/{subscription-id}/resourceGroups/{rg}/providers/microsoft.insights/datacollectionrules/{dcr-name}"
-
出力された
appId,password,tenantをlocal.settings.jsonに設定:{ "Values": { "AZURE_CLIENT_ID": "your-service-principal-app-id", "AZURE_CLIENT_SECRET": "your-service-principal-password", "AZURE_TENANT_ID": "your-tenant-id", ... } }
方法2: Azure CLI認証
az login- ローカル開発時は Azure CLI の認証情報を
DefaultAzureCredentialが自動的に利用 - ただし、CLI ユーザーにも同様のロール割り当てが必要
マネージドアイデンティティの使用(推奨)
-
Azure Functions でシステム割り当てマネージドアイデンティティを有効化:
az functionapp identity assign --name {function-app-name} --resource-group {rg} -
マネージドアイデンティティに必要なロールを付与:
# Monitoring Metrics Publisher ロールを DCR に付与 az role assignment create \ --assignee {managed-identity-principal-id} \ --role "Monitoring Metrics Publisher" \ --scope "/subscriptions/{subscription-id}/resourceGroups/{rg}/providers/microsoft.insights/datacollectionrules/{dcr-name}"
-
Azure Functions の環境変数には認証情報を設定不要(マネージドアイデンティティが自動的に使用される)
詳細な設定手順は SERVICE_PRINCIPAL_SETUP.md を参照してください。
python -m venv .venv
.venv\\Scripts\\activate # Windows
source .venv/bin/activate # Linux/macOSpip install -r requirements.txt{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "UseDevelopmentStorage=true",
"FUNCTIONS_WORKER_RUNTIME": "python",
"DCE_ENDPOINT": "https://your-dce-endpoint.monitor.azure.com",
"DCR_IMMUTABLE_ID": "your-dcr-immutable-id",
"STREAM_NAME": "Custom-SecurityEvent"
}
}azurite --silent --location ./azurite --debug ./azurite/debug.logfunc start- Azure Functions アプリが作成済み(Python 3.9 以降、Linux または Windows)
- Azure CLI と Azure Functions Core Tools がインストール済み
# ストレージアカウント作成
az storage account create \
--name {storage-account-name} \
--resource-group {rg} \
--location {location} \
--sku Standard_LRS
# Function App 作成 (Linux + Python 3.11)
az functionapp create \
--name {function-app-name} \
--resource-group {rg} \
--storage-account {storage-account-name} \
--runtime python \
--runtime-version 3.11 \
--os-type Linux \
--functions-version 4# システム割り当てマネージドアイデンティティを有効化
az functionapp identity assign \
--name {function-app-name} \
--resource-group {rg}
# 出力された principalId をメモ
PRINCIPAL_ID=$(az functionapp identity show --name {function-app-name} --resource-group {rg} --query principalId -o tsv)
# DCR への Monitoring Metrics Publisher ロール付与
az role assignment create \
--assignee $PRINCIPAL_ID \
--role "Monitoring Metrics Publisher" \
--scope "/subscriptions/{subscription-id}/resourceGroups/{rg}/providers/microsoft.insights/datacollectionrules/{dcr-name}"az functionapp config appsettings set \
--name {function-app-name} \
--resource-group {rg} \
--settings \
DCE_ENDPOINT="https://your-dce-endpoint.monitor.azure.com" \
DCR_IMMUTABLE_ID="dcr-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \
STREAM_NAME="Custom-SecurityEvent"# プロジェクトルートから実行
func azure functionapp publish {function-app-name}# 関数一覧の確認
az functionapp function list --name {function-app-name} --resource-group {rg}
# ログストリーミングで動作確認
func azure functionapp logstream {function-app-name}- Azure Portal で Function App のログを確認
- Blob Storage の
mycontainerに EVTX ファイルをアップロードしてトリガーをテスト - Log Analytics Workspace で
SecurityEventテーブルにデータが取り込まれているか確認:SecurityEvent | where TimeGenerated > ago(1h) | take 10
指定されたBlobコンテナ(mycontainer)にEVTXファイルをアップロードします。
ファイルがアップロードされると、Azure Functionが自動的に起動し:
- EVTXファイルを解析
- SecurityEventテーブル形式のJSONに変換
- Log Analytics Workspaceに送信
Azure Functionsのログから処理状況を確認できます:
Python blob trigger function processed blob Name: sample.evtx Blob Size: 1024 bytes
Successfully processed 150 events from sample.evtx
-
インポートエラー
- 仮想環境が正しく設定されているか確認
pip install -r requirements.txtを再実行
-
認証エラー
- DCRとワークスペースへの適切な権限が付与されているか確認
-
EVTXファイル処理エラー
- ファイルが正しいEVTX形式か確認
- ファイルサイズが制限内か確認
-
Log Analytics送信エラー
- DCE_ENDPOINTとDCR_IMMUTABLE_IDが正しく設定されているか確認
- ネットワーク接続とファイアウォール設定を確認
python test_function.py[Blob Storage] → [Azure Functions] → [Log Analytics Workspace]
↓ ↓ ↓
.evtx files Processing SecurityEvent Table
- Parse EVTX
- Convert to JSON
- Batch send
- 最小権限の原則に従ったRBACロール設定
- 機密データを含むログファイルの適切な処理
- バッチ処理により効率的なデータ転送
- 一時ファイルの適切なクリーンアップ
- エラー時の適切なリトライ機能
- EVTXファイルサイズの制限(Azure Functions実行時間制限による)
- 同時処理可能なファイル数の制限
- Log Analytics Workspaceのデータ取り込み制限