building-cloud-siem-with-sentinel について
Microsoft Sentinel でクラウド SIEM を構築するセキュリティチーム向けのガイドです。マルチクラウドのログ取り込み、KQL による検知、自動対応、長期的な脅威ハンティングを扱います。
主な機能
- 01マルチクラウドデータコネクターの設定
- 02KQL による検知・調査クエリの作成
- 03Logic Apps の対応ワークフロー構築
- 04データレイクでの長期調査
- 05脅威インテリジェンス指標の統合
活用シーン
- 01マルチクラウド SOC の設立
- 02従来型 SIEM からクラウド構成への移行
- 03クラウドセキュリティインシデントへの自動対応
- 04大量のテレメトリーを対象とした脅威ハンティング
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill building-cloud-siem-with-sentinelインストール後、Claude Code で/building-cloud-siem-with-sentinelを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
LICENSEreferences/api-reference.mdscripts/agent.py詳細
Sentinel で Cloud SIEM を構築する
使用する場面
- マルチクラウド環境向けに一元化されたセキュリティオペレーションセンターを構築するとき
- レガシー SIEM プラットフォーム(Splunk、QRadar)からクラウドネイティブアーキテクチャへ移行するとき
- クラウド固有の脅威に対するインシデント対応ワークフローを自動化するとき
- ペタバイト規模のセキュリティテレメトリ全体を対象に大規模な脅威ハンティングを実施するとき
- 脅威インテリジェンスフィードをクラウドセキュリティログ分析と統合するとき
使用しないでください。Security Hub と GuardDuty で十分な AWS 専用環境、EDR 機能を必要とするエンドポイント検出(Defender for Endpoint を使用してください)、またはコンプライアンス態勢の監視(building-cloud-security-posture-management を参照してください)には適していません。
前提条件
- Log Analytics ワークスペースで Microsoft Sentinel が有効になっている Azure サブスクリプション
- 対象ログソース(AWS CloudTrail、Azure Activity、GCP)のデータコネクタ権限
- 自動応答プレイブック用の Logic Apps または Azure Functions
- 検出ルールとハンティングクエリを記述するための KQL(Kusto Query Language)の習熟
ワークフロー
ステップ 1:Sentinel ワークスペースとデータコネクタをプロビジョニングする
セキュリティデータに最適化された Log Analytics ワークスペースを作成し、マルチクラウドのデータ取り込み用データコネクタを有効にします。
# Create Log Analytics workspace
az monitor log-analytics workspace create \
--resource-group security-rg \
--workspace-name sentinel-workspace \
--location eastus \
--retention-time 365 \
--sku PerGB2018
# Enable Microsoft Sentinel on the workspace
az sentinel onboarding-state create \
--resource-group security-rg \
--workspace-name sentinel-workspace
# Enable AWS CloudTrail connector
az sentinel data-connector create \
--resource-group security-rg \
--workspace-name sentinel-workspace \
--data-connector-id aws-cloudtrail \
--kind AmazonWebServicesCloudTrail \
--aws-cloud-trail-data-connector '{
"awsRoleArn": "arn:aws:iam::123456789012:role/SentinelCloudTrailRole",
"dataTypes": {"logs": {"state": "Enabled"}}
}'
# Enable Azure AD sign-in and audit logs
az sentinel data-connector create \
--resource-group security-rg \
--workspace-name sentinel-workspace \
--data-connector-id azure-ad \
--kind AzureActiveDirectory \
--azure-active-directory '{
"dataTypes": {
"alerts": {"state": "Enabled"},
"signinLogs": {"state": "Enabled"},
"auditLogs": {"state": "Enabled"}
}
}'
ステップ 2:KQL 検出ルールを記述する
Kusto Query Language を使用して分析ルールを作成し、クラウド固有の脅威を検出します。各ルールを MITRE ATT&CK の手法に対応付けます。
// Detect impossible travel - sign-ins from geographically distant locations
let timeframe = 1h;
let distance_threshold = 500; // km
SigninLogs
| where TimeGenerated > ago(timeframe)
| where ResultType == 0 // Successful sign-ins only
| project TimeGenerated, UserPrincipalName, IPAddress, Location,
Latitude = toreal(LocationDetails.geoCoordinates.latitude),
Longitude = toreal(LocationDetails.geoCoordinates.longitude)
| sort by UserPrincipalName asc, TimeGenerated asc
| extend PrevLatitude = prev(Latitude, 1), PrevLongitude = prev(Longitude, 1),
PrevTime = prev(TimeGenerated, 1), PrevUser = prev(UserPrincipalName, 1)
| where UserPrincipalName == PrevUser
| extend TimeDiff = datetime_diff('minute', TimeGenerated, PrevTime)
| where TimeDiff < 60
| extend Distance = geo_distance_2points(Longitude, Latitude, PrevLongitude, PrevLatitude) / 1000
| where Distance > distance_threshold
| project TimeGenerated, UserPrincipalName, IPAddress, Location, Distance, TimeDiff
// Detect AWS IAM credential abuse from CloudTrail
AWSCloudTrail
| where TimeGenerated > ago(24h)
| where EventName in ("ConsoleLogin", "AssumeRole", "GetSessionToken")
| where ErrorCode == ""
| summarize LoginCount = count(), DistinctIPs = dcount(SourceIpAddress),
IPList = make_set(SourceIpAddress, 10)
by UserIdentityArn, bin(TimeGenerated, 1h)
| where DistinctIPs > 3
| project TimeGenerated, UserIdentityArn, LoginCount, DistinctIPs, IPList
// Detect mass S3 object deletion (potential ransomware)
AWSCloudTrail
| where TimeGenerated > ago(1h)
| where EventName == "DeleteObject" or EventName == "DeleteObjects"
| summarize DeleteCount = count(), BucketsAffected = dcount(RequestParameters_bucketName)
by UserIdentityArn, bin(TimeGenerated, 10m)
| where DeleteCount > 100
| project TimeGenerated, UserIdentityArn, DeleteCount, BucketsAffected
ステップ 3:Logic Apps で SOAR プレイブックを構築する
分析ルールがインシデントをトリガーしたときに実行される自動応答プレイブックを作成します。一般的なアクションには、ユーザーのブロック、リソースの隔離、脅威インテリジェンスによるアラートの強化などがあります。
{
"definition": {
"triggers": {
"Microsoft_Sentinel_incident": {
"type": "ApiConnectionWebhook",
"inputs": {
"body": {"incidentArmId": "subscriptions/@{triggerBody()?['workspaceInfo']?['SubscriptionId']}/resourceGroups/@{triggerBody()?['workspaceInfo']?['ResourceGroupName']}/providers/Microsoft.OperationalInsights/workspaces/@{triggerBody()?['workspaceInfo']?['WorkspaceName']}/providers/Microsoft.SecurityInsights/Incidents/@{triggerBody()?['object']?['properties']?['incidentNumber']}"},
"host": {"connection": {"name": "@parameters('$connections')['microsoftsentinel']['connectionId']"}}
}
}
},
"actions": {
"Get_incident_entities": {
"type": "ApiConnection",
"inputs": {"method": "post", "path": "/Incidents/entities"}
},
"For_each_account_entity": {
"type": "Foreach",
"foreach": "@body('Get_incident_entities')?['Accounts']",
"actions": {
"Disable_Azure_AD_user": {
"type": "ApiConnection",
"inputs": {
"method": "PATCH",
"path": "/v1.0/users/@{items('For_each_account_entity')?['AadUserId']}",
"body": {"accountEnabled": false}
}
},
"Add_comment_to_incident": {
"type": "ApiConnection",
"inputs": {
"body": {"message": "User @{items('For_each_account_entity')?['Name']} disabled by automated playbook"}
}
}
}
}
}
}
}
ステップ 4:長期ハンティング用に Sentinel Data Lake を構成する
Sentinel Data Lake を有効にし、KQL と SQL の両方のエンドポイントを使用して、ペタバイト規模のログ保持と高度な脅威ハンティングを実現します。
// Threat hunting query: detect lateral movement across AWS accounts
let suspicious_roles = AWSCloudTrail
| where TimeGenerated > ago(7d)
| where EventName == "AssumeRole"
| extend AssumedRoleArn = tostring(parse_json(RequestParameters).roleArn)
| where AssumedRoleArn contains "cross-account" or AssumedRoleArn contains "admin"
| summarize AssumeCount = count(), UniqueSourceAccounts = dcount(RecipientAccountId)
by UserIdentityArn, AssumedRoleArn
| where AssumeCount > 10 and UniqueSourceAccounts > 2;
suspicious_roles
| join kind=inner (
AWSCloudTrail
| where TimeGenerated > ago(7d)
| where EventName in ("RunInstances", "CreateFunction", "PutBucketPolicy")
) on UserIdentityArn
| project TimeGenerated, UserIdentityArn, AssumedRoleArn, EventName, SourceIpAddress
ステップ 5:脅威インテリジェンスを統合する
脅威インテリジェンスプロバイダーに接続し、インジケーターベースの照合ルールを作成して、既知の悪意あるインフラストラクチャとの通信を検出します。
# Enable Microsoft Threat Intelligence connector
az sentinel data-connector create \
--resource-group security-rg \
--workspace-name sentinel-workspace \
--data-connector-id microsoft-ti \
--kind MicrosoftThreatIntelligence \
--microsoft-threat-intelligence '{
"dataTypes": {"microsoftEmergingThreatFeed": {"lookbackPeriod": "2025-01-01T00:00:00Z", "state": "Enabled"}}
}'
// Match network indicators against cloud flow logs
let TI_IPs = ThreatIntelligenceIndicator
| where TimeGenerated > ago(30d)
| where isnotempty(NetworkIP)
| distinct NetworkIP;
AzureNetworkAnalytics_CL
| where TimeGenerated > ago(24h)
| where DestIP_s in (TI_IPs)
| project TimeGenerated, SrcIP_s, DestIP_s, DestPort_d, FlowType_s
主要な概念
| 用語 | 定義 |
|---|---|
| KQL | Microsoft Sentinel の主要なクエリ言語である Kusto Query Language。セキュリティデータの検索、分析、可視化に使用します |
| Analytics Rule | ログデータを定期的に評価し、条件に一致した場合にインシデントを作成する Sentinel の検出ロジック |
| SOAR Playbook | インシデントによってトリガーされ、アカウントのブロック、アラートの強化、チームへの通知などの対応アクションを実行する自動化ワークフロー |
| Data Connector | クラウドサービス、ID プロバイダー、サードパーティ製ツールから Sentinel にセキュリティログを取り込む統合モジュール |
| Sentinel Data Lake | 高度なハンティング向けに、KQL と SQL のクエリインターフェースを備えた長期ログ保持を提供するペタバイト規模のストレージ層 |
| Workbook | セキュリティデータの可視化、傾向、運用指標を表示する Sentinel のインタラクティブなダッシュボード |
| Watchlist | VIP ユーザーリストや承認済み IP 範囲などのコンテキストでアラートを強化するために Sentinel で使用する参照データテーブル |
| Fusion Detection | データソースを横断する複数段階の攻撃を自動検出する、機械学習を活用した相関エンジン |
ツールとシステム
- Microsoft Sentinel:AI を活用した脅威検出機能を備え、Azure Log Analytics 上に構築されたクラウドネイティブの SIEM/SOAR プラットフォーム
- Azure Logic Apps:Sentinel のインシデントによってトリガーされる SOAR プレイブックを構築するためのローコード自動化プラットフォーム
- Microsoft Threat Intelligence:セキュリティログとの照合に使用する IP、ドメイン、URL のインジケーターを提供する統合脅威フィード
- Azure Data Explorer:大規模なデータ探索向け Sentinel KQL クエリを支える高性能分析エンジン
- MITRE ATT&CK Navigator:Sentinel の検出ルールを敵対者の戦術と手法に対応付けるためのフレームワーク
よくあるシナリオ
シナリオ:クラウドをまたぐ認証情報窃取キャンペーンの検出
コンテキスト:攻撃者はフィッシングを通じて Azure AD アカウントを侵害し、その後、フェデレーション ID を使って AWS リソースにアクセスします。Sentinel では、Azure のサインイン異常と異常な AWS API アクティビティを関連付ける必要があります。
アプローチ:
- Azure AD の不可能な移動または異常なサインインリスクを検出する分析ルールを作成します
- 侵害された Azure AD ID と AWS CloudTrail の AssumeRoleWithSAML イベントを関連付ける KQL クエリを記述します
- Azure AD のリスクイベントと、その後に発生する AWS の権限昇格アクティビティを関連付ける Fusion 検出ルールを作成します
- Azure AD アカウントを自動的に無効化し、AWS STS セッションを取り消す SOAR プレイブックをデプロイします
- 最初の侵害から AWS への横展開までのタイムラインを示すワークブックを作成します
- データレイク全体を対象にハンティングクエリを実行し、他のアカウントにも同様のパターンが発生していないか確認します
落とし穴:クラウドプロバイダー間で ID を関連付けないと、攻撃チェーンの全体像を見逃します。分析ルールの頻度を低く設定しすぎると(例:24 時間)、攻撃者が何時間も検知されずにアクセスできてしまいます。
出力形式
Microsoft Sentinel SOC Operations Report
==========================================
Workspace: sentinel-workspace
Data Sources: 14 connectors active
Report Period: 2025-02-01 to 2025-02-23
DATA INGESTION:
Azure AD Sign-in Logs: 2.3 TB (23 days)
AWS CloudTrail: 1.8 TB (23 days)
Azure Activity: 0.9 TB (23 days)
Defender for Cloud Alerts: 45 GB (23 days)
Total Ingestion: 5.1 TB
DETECTION SUMMARY:
Active Analytics Rules: 87
Incidents Created: 234
Critical: 8 | High: 34 | Medium: 89 | Low: 103
Mean Time to Detect (MTTD): 4.2 minutes
Mean Time to Respond (MTTR): 18 minutes
TOP INCIDENT TYPES:
Impossible Travel Detected: 42 incidents
AWS Unauthorized API Call Pattern: 28 incidents
Mass File Deletion in S3: 3 incidents
Suspicious Azure AD App Registration: 12 incidents
AUTOMATION:
Playbooks Executed: 156
Accounts Auto-Disabled: 23
Incidents Auto-Enriched: 198
False Positive Rate: 12%