1. はじめに
Microsoft Sentinel の検証や PoC、分析ルール(Analytics Rule)のチューニング、ハンズオン研修などをやっていると、必ず突き当たるのが 「リアルなサンプルログがない」 という悩みがあります。
- 顧客環境のログを使うのは NG..
- 自分でログを書いて流し込むのは大変..
- 攻撃シナリオを再現したい場合、複数テーブルにまたがる相関ログが必要..
- ASIM や CommonSecurityLog、AWS、Okta などテーブルごとにスキーマが違って面倒..
こうした課題を解消するために作ったのが、本稿で紹介する Sentinel LogSeeder です。GitHub Copilot のエージェントモードと組み合わせて、自然言語で「CrowdStrike のサンプルログを入れて」「ブルートフォース → ラテラルムーブメントの攻撃シナリオを流して」とお願いするだけで、Log Analytics ワークスペースに整合性のあるサンプルログを投入できます。
本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。
本ブログは AI の力を借りて作成しています。
2. Sentinel LogSeeder とは
Sentinel LogSeeder は、Azure Monitor Logs Ingestion API を経由して Log Analytics(Microsoft Sentinel)にサンプルデータを投入する PowerShell ツールキットです。GitHub Copilot のエージェントが .github/copilot-instructions.md と Skill ファイルを読み込み、スキーマ調査・DCE/DCR デプロイ・データ生成・取り込みまでを一気通貫で実行してくれます。
2.1 主な機能
| 機能 | 内容 |
|---|---|
| 製品名ベースのサンプルログ生成・取り込み | 「CrowdStrike のログを入れて」と指示すると、エージェントが Sentinel コネクタのドキュメントを調べ、対応テーブル・スキーマを自動判定 |
| 単一テーブルの取り込み | ASIM・CommonSecurityLog・AWS 系・カスタムテーブル(_CL)など任意のテーブルにサンプルログを投入 |
| サンプルファイルからの取り込み | JSON / CSV を渡すと、内容を解析してテーブル・スキーマを推定し取り込み |
| 攻撃シナリオの取り込み | 複数テーブルにまたがる相関のあるイベントを時系列で投入し、ストーリー性のある攻撃を再現 |
| エンティティの一貫性 | ユーザ・IP・端末・ドメインなどのエンティティプールを共有し、テーブル間で同じ実体を参照 |
2.2 アーキテクチャ
┌──────────────────────────────────────────────────────────────┐
│ GitHub Copilot Agent (Skill: sentinel-logseeder) │
│ - ユーザ意図解釈 / スキーマ調査 / シナリオ選定 │
└──────────────────────────────────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────────────────┐
│ PowerShell scripts │
│ - Invoke-SampleDataIngestion.ps1 (単一テーブル) │
│ - Invoke-AttackScenarioIngestion.ps1 (シナリオ) │
└──────────────────────────────────────────────────────────────┘
│ Logs Ingestion API
▼
┌──────────────────────────────────────────────────────────────┐
│ Azure Monitor │
│ Data Collection Endpoint (DCE) │
│ Data Collection Rule (DCR) ──► Log Analytics ──► Sentinel│
└──────────────────────────────────────────────────────────────┘
2.3 サポートテーブル
Logs Ingestion API の制約により、投入できるのは以下のテーブルです。
-
カスタムテーブル(
_CLサフィックスのテーブル全般) -
API 対応の組み込みテーブル:
ASim*、CommonSecurityLog、Syslog、SecurityEvent、AWS*、GCP*、CrowdStrike*ほか多数
逆に SigninLogs / AuditLogs / DeviceProcessEvents のような ベンダー管理テーブルは API 経由では書き込み不可なので、その場合は ASIM 系(例:ASimAuthenticationEventLogs)に置き換えます。
詳細は Logs Ingestion API — Supported Tables を参照してください
3. 活用例
3.1 分析ルールのテストデータ生成
新しい KQL 検出ルールを書いたとき、「ヒットさせるためのデータを Sentinel に投入したい」というケースは多いはずです。Sentinel LogSeeder なら、検出対象テーブル(例:ASimAuthenticationEventLogs)にだけサンプルログを集中投入し、ルールのトリガー条件を実機で確認できます。
3.2 攻撃シナリオベースの SOC 演習
複数テーブルにまたがる相関のあるイベントを投入できるため、SOC アナリストの演習に最適です。例えば「ブルートフォース成功 → RDP ラテラルムーブメント → LSASS ダンプ」という攻撃を、認証・ネットワーク・プロセスの 3 テーブルに整合した時系列で流し込めます。
3.3 検証環境での SIEM コネクタ事前確認
新規導入予定のコネクタ(CrowdStrike、Okta、Zscaler ZIA など)について、実コネクタを設定する前にダミーデータでダッシュボード・Workbook の見え方を確認できます。
3.4 Atomic Red Team 由来のシナリオ自動生成
Atomic Red Team の MITRE ATT&CK テクニックテストから、製品非依存のシナリオを自動生成する仕組みも備えています。scenarios/generated/ 配下に出力され、手書きシナリオと同じフォーマットで利用可能です。
4. 同梱の攻撃シナリオ紹介
scenarios/ 配下には、現場の調査で頻出する 4 つの攻撃シナリオがプリセットされています。
4.1 Brute Force + Lateral Movement
外部 IP からの認証失敗連発 → 成功 → 内部ホストへの RDP → プロセス実行、という横展開シナリオ。
| Phase | テーブル | 内容 |
|---|---|---|
| 1 | ASimAuthenticationEventLogs |
同一 IP からの認証失敗を高頻度で繰り返し |
| 2 | ASimAuthenticationEventLogs |
認証成功 |
| 3 | ASimNetworkSessionLogs |
内部 RDP セッション確立 |
| 4 | ASimProcessEventLogs |
偵察コマンド(whoami / net user 等) |
4.2 Ransomware Deployment
フィッシングで侵害されたアカウントから、悪性プロセス実行 → 大量ファイル暗号化 → レジストリ永続化までの一連の流れ。Authentication / ProcessEvent / FileEvent / RegistryEvent の 4 テーブルに同期して投入されます。
4.3 Data Exfiltration
機微リソースへの特権アクセス → 大量ファイル読み取り → 外部への大規模アウトバウンド転送 → DNS トンネリング、という情報持ち出しシナリオ。AuditEvent / FileEvent / NetworkSession / DnsActivity をカバー。
4.4 Credential Theft + Privilege Escalation
侵害アカウント → LSASS メモリダンプ → 新規管理者ユーザ作成 → 特権セッション、という権限昇格シナリオ。
4.5 自作シナリオの作り方
scenarios/_template.json をコピーして JSON を書き換えるだけです。各 Phase に「対象テーブル」「件数」「相対時刻」「フィールドの上書き値」を指定でき、エンティティはシナリオ内で共有されます。
{
"name": "my-scenario",
"description": "...",
"phases": [
{
"table": "ASimAuthenticationEventLogs",
"count": 50,
"timeOffset": "-30m",
"overrides": { "EventResult": "Failure" }
}
]
}
5. デプロイ方法
5.1 前提条件
- GitHub Copilot の有効なサブスクリプション(エージェントモード利用のため)
-
Azure CLI (
az login済み) +log-analytics拡張 - PowerShell 7+
- Microsoft Sentinel が有効化された Log Analytics ワークスペース
- リソースグループ上の Azure RBAC:
-
Log Analytics Contributor(DCE / DCR / カスタムテーブル作成) -
User Access Administrator(DCR へのMonitoring Metrics Publisher付与)
-
5.2 リポジトリの取得
git clone https://github.com/your-org/sentinel-logseeder.git
cd sentinel-logseeder
code .
VS Code で開くと、エージェントモードが .github/copilot-instructions.md と Skill ファイルを自動的に読み込みます。
5.3 ワークスペース設定
config/workspace.json.template を config/workspace.json にリネームし、ワークスペース名のみ記載します(他の値は az のコンテキストから自動解決)。
{
"workspaceName": "law-mgmt-sentinel-US"
}
tenantId / subscriptionId / resourceGroup / dceName などはエージェントが自動で解決してくれます。
config/workspace.jsonは.gitignore対象なので、誤コミットの心配はありません。
5.4 PowerShell の実行ポリシー
PowerShell スクリプトの実行のために、現在のユーザに対して一時的に Bypass を設定します(検証後は元に戻すことを推奨)。
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Bypass
6. 使い方
6.1 単一テーブルへの取り込み(GitHub Copilot 経由)
VS Code のチャットで以下のように依頼するだけです。
AWSCloudTrail テーブルにサンプルログを 500 件入れて
エージェントが以下を自動実行します。
-
schemas/AWSCloudTrail.jsonを読み込み(無ければ生成) - DCE
sample-data-dceを再利用 / 新規作成 - DCR
sampledata-AWSCloudTrailを作成しMicrosoft-AWSCloudTrailストリームに出力 - ユーザに
Monitoring Metrics Publisherを DCR スコープで自動付与 - エンティティプールから整合した値で 500 件生成
- Logs Ingestion API へ POST
確認は KQL で。
AWSCloudTrail
| where TimeGenerated > ago(30m)
| take 10
Log Analytics への反映には 5〜10 分ほどかかります。
6.2 単一テーブルへの取り込み(PowerShell 直接)
CLI でも実行可能です。例として Zscaler ZIA を CommonSecurityLog に投入する例です。
.\scripts\Invoke-SampleDataIngestion.ps1 `
-TableName "CommonSecurityLog" `
-Schema "schemas\CommonSecurityLog-ZscalerZIA.json" `
-RowCount 500 `
-Deploy -Ingest
実行ログ(抜粋):
Reusing existing DCE 'sample-data-dce'.
Creating DCR 'sampledata-CommonSecurityLog'...
DCR 'sampledata-CommonSecurityLog' created.
Infrastructure ready:
DCE endpoint : https://sample-data-dce-xxxx.centralus-1.ingest.monitor.azure.com
DCR immutable: dcr-5f48ff1eee6a43f29ccc712acf2760dd
Stream : Custom-CommonSecurityLog
[RBAC] Role assignment succeeded.
Generating 500 sample records...
Successfully ingested 500 records in 2 batch(es).
6.3 攻撃シナリオの取り込み
GitHub Copilot に以下を依頼すると、シナリオ全体が一気に投入されます。
brute-force-lateral-movement のシナリオを実行して
PowerShell から直接実行する場合:
.\scripts\Invoke-AttackScenarioIngestion.ps1 `
-ScenarioFile "scenarios\brute-force-lateral-movement.json"
エージェントは複数テーブルにまたがるシナリオを実行する際、「ステージごとにどの製品のテーブルを使うか」をユーザに確認してから取り込みます(例:「エンドポイントは CrowdStrike か ASIM どちらにしますか?」)。
対応シナリオ一覧
scenarios/ 配下にプリセットされた手書きシナリオ 4 本と、Atomic Red Team から自動生成された MITRE ATT&CK テクニックシナリオ 10 本を備えています。
手書きシナリオ(scenarios/)
| シナリオ | 目的(攻撃ストーリー) | 主な対象テーブル | MITRE |
|---|---|---|---|
| brute-force-lateral-movement | 外部 IP からのブルートフォース成功 → 内部 RDP ラテラルムーブメント → 偵察コマンド実行 | Authentication / NetworkSession / ProcessEvent | T1110 / T1078 / T1021 |
| ransomware-deployment | フィッシング侵害アカウント → 悪性プロセス実行 → 大量ファイル暗号化 → レジストリ永続化 | Authentication / ProcessEvent / FileEvent / RegistryEvent | T1566 / T1486 / T1490 / T1547 |
| data-exfiltration | 機密リソースへの特権アクセス → 大量ファイル読み取り → 大規模アウトバウンド転送 → DNS トンネリング | AuditEvent / FileEvent / NetworkSession / DnsActivity | T1530 / T1041 / T1048 / T1071 |
| credential-theft-privesc | 侵害アカウント → LSASS メモリダンプ → 新規管理者ユーザ作成 → 特権セッション | Authentication / ProcessEvent / UserManagement | T1003 / T1136 / T1078 |
Atomic Red Team 自動生成シナリオ(scenarios/generated/)
| シナリオ | 目的(テクニック) | 主な対象テーブル |
|---|---|---|
| atomic-t1003-os-credential-dumping | OS Credential Dumping(LSASS / SAM / NTDS の認証情報窃取) | ProcessEvent / FileEvent |
| atomic-t1005-data-from-local-system | Data from Local System(ローカル端末からの情報収集) | FileEvent |
| atomic-t1021-remote-services | Remote Services(リモートサービス経由のラテラルムーブメント) | Authentication |
| atomic-t1053-scheduled-taskjob | Scheduled Task/Job(タスクスケジューラ/cron による永続化) | ProcessEvent / RegistryEvent |
| atomic-t1059-command-and-scripting-interpreter | Command and Scripting Interpreter(PowerShell / cmd / WSH 実行) | ProcessEvent |
| atomic-t1078-valid-accounts | Valid Accounts(正規アカウント悪用) | Authentication |
| atomic-t1110-brute-force | Brute Force(パスワード総当たり) | Authentication |
| atomic-t1136-create-account | Create Account(新規アカウント作成による永続化) | AuditEvent |
| atomic-t1486-data-encrypted-for-impact | Data Encrypted for Impact(ランサムウェアによる暗号化) | FileEvent / ProcessEvent |
| atomic-t1547-boot-or-logon-autostart-execution | Boot or Logon Autostart Execution(起動時自動実行による永続化) | RegistryEvent / ProcessEvent |
自作シナリオを追加する場合は、
scenarios/_template.jsonをコピーして JSON を編集するだけです(4.5 節参照)。
6.4 サンプルファイルからの取り込み
JSON や CSV のログファイルがあれば、内容をそのまま流し込めます。
このサンプル CSV を Sentinel に取り込んで
エージェントがファイル内容からテーブルを推定し、必要ならカスタムテーブルを作って取り込みます。
6.5 投入後の検証
検出ルールに引っかかるかどうかは Sentinel の Analytics Rule をデプロイして確認できます。本リポジトリには detections/custom-detection-rules.kql に 17 本のテンプレートルール(D01〜D17)が同梱されており、scripts/Deploy-AnalyticsRules.ps1 で一括デプロイできます。
.\scripts\Deploy-AnalyticsRules.ps1
同梱の 17 本は、本リポジトリの 4 つのプリセット攻撃シナリオ+ Atomic Red Team 由来シナリオで投入されるイベントを検出することを目的に設計されており、ASIM 系・Windows Security Event・OktaV2_CL を対象にしています。
| ID | 分析ルール名 | 目的(検出対象) | Severity | MITRE |
|---|---|---|---|---|
| D01 | Brute Force: High Rate of Failed Logons from Single Source | 単一 IP からの短時間・高頻度な認証失敗を ASIM Authentication で検知 | Medium | T1110 |
| D02 | Successful Logon Following Brute Force from Same Source | 同一 IP の認証失敗バースト後 30 分以内の認証成功を相関させ侵害成立を高確度で検知 | High | T1078 |
| D03 | Internal RDP Lateral Movement | 内部 RFC1918 間の RDP(3389/tcp)セッションをラテラルムーブメント兆候として検知 | Medium | T1021 |
| D04 | Reconnaissance Command Cluster on Endpoint | 同一ユーザ/ホストで複数の Windows 偵察コマンドが連続実行される手動侵入パターンを検知 | Medium | T1082 / T1016 / T1087 / T1033 |
| D05 | LSASS Credential Dumping Indicators | LSASS メモリダンプに用いられるツール・コマンドラインを検知 | High | T1003 |
| D06 | Local or Domain Administrator Account Created | 新規ユーザ作成や特権グループ追加(Administrators / Domain Admins 等)を検知 | High | T1136 / T1098 |
| D07 | net.exe Used to Create User or Add to Admin Group |
net.exe / net1.exe によるユーザ作成・管理者グループ追加を検知 |
High | T1098 |
| D08 | Suspicious Service Creation or Auto-Start Configuration | ユーザ書き込み可能パスのバイナリを自動起動するサービス作成・再構成を検知 | Medium | T1543 |
| D09 | Office Application Spawning Script Interpreter | Office プロセスがスクリプトインタプリタや LOLBin を起動する悪性マクロ/フィッシング兆候を検知 | High | T1059 |
| D10 | Shadow Copy or Backup Catalog Deletion | ボリュームシャドウコピー削除・回復無効化など、ランサムウェアの復旧妨害を検知 | High | T1490 |
| D11 | Mass File Encryption or Ransom Note Creation | ランサムウェア拡張子の大量書き込みや脅迫文ファイル作成を検知 | High | T1486 |
| D12 | Registry Run Key or Security Policy Tampering | Run/RunOnce や Defender/Firewall ポリシーの改変による永続化/防御無効化を検知 | Medium | T1547 |
| D13 | Okta Sign-in Followed by Suspicious Endpoint Execution | Okta サインイン成功と 30 分以内の不審プロセス実行を相関させ ID 侵害を検知 | High | T1566 / T1078 |
| D14 | Privileged Directory and Audit Enumeration Burst | 単一 ID による特権・監査・ディレクトリ列挙の集中実行を検知 | Medium | T1087 / T1526 / T1069 |
| D15 | Bulk Access to Confidential File Share | confidential / finance / hr / legal / board 配下の機密ファイルへの大量アクセスを検知 | Medium | T1039 / T1530 |
| D16 | Large Outbound Data Transfer to External Destination | 内部から外部への 15 分あたり 100 MB を超えるアウトバウンド転送を検知 | High | T1048 / T1041 |
| D17 | DNS Tunneling to Suspicious Parent Domain | 同一親ドメインへの長いラベルのサブドメインクエリ/TXT 多発による DNS トンネリングを検知 | High | T1071 |
7. ハマりポイントと回避策
7.1 HTTP 403 「The authentication token does not have access to ingest data」
DCR の Monitoring Metrics Publisher ロールがあるはずなのに 403 が返るケースがあります。
| 原因 | 対処 |
|---|---|
| ロール伝搬待ち | 5〜10 分待つ |
| DCR 側の認可キャッシュ不整合 | DCR を一旦削除して再作成(同名でも OK) |
| トークンのテナント不一致 |
az account show で tenantId を確認、必要なら az login --tenant <id>
|
ロールが付与されているかは以下で確認できます。
az role assignment list `
--assignee "<your-objectId>" `
--scope "<dcr-resourceId>" `
--include-inherited -o table
7.2 サブテクニック ID(例:T1003.001)が Analytics Rule API に弾かれる
Sentinel の Alert Rule API は T#### 形式しか受け付けないため、Atomic Red Team 由来のサブテクニック ID は親テクニックに丸める必要があります(T1003.001 → T1003)。
7.3 _CL テーブルが見つからない
カスタムテーブルは Logs Ingestion API での投入に事前作成が必要です。Sentinel LogSeeder は -Deploy 時に自動でテーブルを作成しますが、テナント側で作成権限が無い場合はエラーになります。リソースグループスコープで Log Analytics Contributor を付与してください。
8. まとめ
- Sentinel LogSeeder は、Microsoft Sentinel の検証・SOC 演習・分析ルール開発に必要な「リアルなサンプルログ」を、GitHub Copilot 経由で自然言語から投入できる OSS です
- 単一テーブル投入だけでなく、複数テーブルにまたがる相関のある攻撃シナリオをプリセット(4 種)+ Atomic Red Team 自動生成でサポートしています
- DCE / DCR / カスタムテーブル / RBAC のセットアップは
-Deploy一発で自動化されており、Logs Ingestion API の煩雑な構成を意識せずに使えます - 「
SigninLogsなどのベンダ管理テーブルには書き込めない」「サブテクニックは親に丸める」など、API 制約由来のハマりどころも本記事のハマりポイントを参考にすれば回避できます
ぜひ自分の Sentinel 検証環境にクローンして、自然言語で攻撃シナリオを投入してみてください!
本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。
