| name | building-cloud-siem-with-sentinel |
| description | 本 skill 涵盖将 Microsoft Sentinel 部署为云原生 SIEM 和 SOAR 平台以实现集中安全运营。 详细介绍为多云日志摄入配置数据连接器、编写 KQL 检测查询、使用 Logic Apps 构建自动化响应手册, 以及利用 Sentinel 数据湖对 AWS、Azure 和 GCP 安全遥测进行 PB 级威胁狩猎。
|
| domain | cybersecurity |
| subdomain | cloud-security |
| tags | ["microsoft-sentinel","cloud-siem","kql-queries","soar-automation","threat-detection"] |
| version | 1.0.0 |
| author | mahipal |
| license | Apache-2.0 |
使用 Sentinel 构建云 SIEM
适用场景
- 为多云环境建立集中式安全运营中心时
- 从传统 SIEM 平台(Splunk、QRadar)迁移到云原生架构时
- 为云特定威胁构建自动化事件响应工作流时
- 对 PB 级安全遥测数据进行大规模威胁狩猎时
- 将威胁情报源与云安全日志分析集成时
不适用于:AWS 独立环境(Security Hub 和 GuardDuty 已足够)、需要 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 工作区,并启用多云摄入的数据连接器。
# 创建 Log Analytics 工作区
az monitor log-analytics workspace create \
--resource-group security-rg \
--workspace-name sentinel-workspace \
--location eastus \
--retention-time 365 \
--sku PerGB2018
# 在工作区上启用 Microsoft Sentinel
az sentinel onboarding-state create \
--resource-group security-rg \
--workspace-name sentinel-workspace
# 启用 AWS CloudTrail 连接器
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"}}
}'
# 启用 Azure AD 登录和审计日志
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 技术。
// 检测不可能的旅行 - 来自地理位置遥远处的登录
let timeframe = 1h;
let distance_threshold = 500; // 千米
SigninLogs
| where TimeGenerated > ago(timeframe)
| where ResultType == 0 // 仅成功登录
| 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
// 检测 CloudTrail 中的 AWS IAM 凭据滥用
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
// 检测 S3 对象批量删除(潜在勒索软件)
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",
步骤 4:配置 Sentinel 数据湖用于长期狩猎
启用 Sentinel 数据湖以实现 PB 级日志保留,并使用 KQL 和 SQL 端点进行高级威胁狩猎。
// 威胁狩猎查询:检测跨 AWS 账户的横向移动
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:集成威胁情报
连接威胁情报提供商,创建基于指标的匹配规则,检测与已知恶意基础设施的通信。
# 启用 Microsoft 威胁情报连接器
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"}}
}'
// 将网络指标与云流日志匹配
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 | Kusto Query Language,Microsoft Sentinel 的主要查询语言,用于搜索、分析和可视化安全数据 |
| 分析规则(Analytics Rule) | Sentinel 中的检测逻辑,按计划评估日志数据,当条件匹配时创建事件 |
| SOAR 手册(SOAR Playbook) | 由事件触发的自动化工作流,执行响应操作,如封锁账户、丰富告警或通知团队 |
| 数据连接器(Data Connector) | 将来自云服务、身份提供商和第三方工具的安全日志摄入 Sentinel 的集成模块 |
| Sentinel 数据湖(Sentinel Data Lake) | PB 级存储层,提供长期日志保留,具有 KQL 和 SQL 查询接口用于高级狩猎 |
| 工作簿(Workbook) | Sentinel 中的交互式仪表板,显示安全数据、趋势和运营指标的可视化 |
| 监视列表(Watchlist) | Sentinel 中的参考数据表,用于通过 VIP 用户列表或已批准 IP 范围等上下文丰富告警 |
| Fusion 检测(Fusion Detection) | 机器学习驱动的关联引擎,自动检测跨数据源的多阶段攻击 |
工具与系统
- Microsoft Sentinel:基于 Azure Log Analytics 的云原生 SIEM/SOAR 平台,具备 AI 驱动的威胁检测
- Azure Logic Apps:低代码自动化平台,用于构建由 Sentinel 事件触发的 SOAR 手册
- Microsoft Threat Intelligence:集成的威胁情报源,提供 IP、域名和 URL 指标用于与安全日志匹配
- Azure Data Explorer:支撑 Sentinel KQL 查询的高性能分析引擎,用于大规模数据探索
- MITRE ATT&CK Navigator:将 Sentinel 检测规则映射到对手战术和技术的框架
常见场景
场景:检测跨云凭据盗窃活动
场景背景:攻击者通过钓鱼入侵 Azure AD 账户,然后使用该账户通过联合身份访问 AWS 资源。Sentinel 需要将 Azure 登录异常与异常 AWS API 活动相关联。
方法:
- 创建检测 Azure AD 不可能旅行或异常登录风险的分析规则
- 编写 KQL 查询,将被入侵的 Azure AD 身份与 AWS CloudTrail AssumeRoleWithSAML 事件相关联
- 构建 Fusion 检测规则,将 Azure AD 风险事件与后续 AWS 权限提升活动关联
- 部署 SOAR 手册,自动禁用 Azure AD 账户并撤销 AWS STS 会话
- 创建工作簿,展示从初始入侵到 AWS 横向移动的时间线
- 在数据湖上运行狩猎查询,检查是否有其他账户存在类似模式
常见陷阱:不跨云提供商关联身份会遗漏完整的攻击链。将分析规则频率设置太低(如 24 小时)会给攻击者留下数小时的未检测访问时间。
输出格式
Microsoft Sentinel SOC 运营报告
==========================================
工作区: sentinel-workspace
数据源: 14 个连接器活跃
报告周期: 2025-02-01 至 2025-02-23
数据摄入:
Azure AD 登录日志: 2.3 TB(23 天)
AWS CloudTrail: 1.8 TB(23 天)
Azure Activity: 0.9 TB(23 天)
Defender for Cloud 告警: 45 GB(23 天)
总摄入量: 5.1 TB
检测摘要:
活跃分析规则: 87 条
创建事件: 234 个
严重: 8 | 高: 34 | 中: 89 | 低: 103
平均检测时间(MTTD): 4.2 分钟
平均响应时间(MTTR): 18 分钟
主要事件类型:
检测到不可能旅行: 42 个事件
AWS 未授权 API 调用模式: 28 个事件
S3 批量文件删除: 3 个事件
可疑 Azure AD 应用注册: 12 个事件
自动化:
执行手册: 156 次
自动禁用账户: 23 个
自动丰富事件: 198 个
误报率: 12%