skills/building-cloud-siem-with-sentinel/SKILL.md
本 skill 涵盖将 Microsoft Sentinel 部署为云原生 SIEM 和 SOAR 平台以实现集中安全运营。 详细介绍为多云日志摄入配置数据连接器、编写 KQL 检测查询、使用 Logic Apps 构建自动化响应手册, 以及利用 Sentinel 数据湖对 AWS、Azure 和 GCP 安全遥测进行 PB 级威胁狩猎。
npx skillsauth add killvxk/cybersecurity-skills-zh building-cloud-siem-with-sentinelInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
不适用于:AWS 独立环境(Security Hub 和 GuardDuty 已足够)、需要 EDR 能力的终端检测(使用 Defender for Endpoint),或合规态势监控(参见 building-cloud-security-posture-management)。
创建针对安全数据优化的 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"}
}
}'
使用 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
创建当分析规则触发事件时执行的自动化响应手册。常见操作包括封锁用户、隔离资源和用威胁情报丰富告警。
{
"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": "用户 @{items('For_each_account_entity')?['Name']} 已由自动化手册禁用"}
}
}
}
}
}
}
}
启用 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
连接威胁情报提供商,创建基于指标的匹配规则,检测与已知恶意基础设施的通信。
# 启用 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) | 机器学习驱动的关联引擎,自动检测跨数据源的多阶段攻击 |
场景背景:攻击者通过钓鱼入侵 Azure AD 账户,然后使用该账户通过联合身份访问 AWS 资源。Sentinel 需要将 Azure 登录异常与异常 AWS API 活动相关联。
方法:
常见陷阱:不跨云提供商关联身份会遗漏完整的攻击链。将分析规则频率设置太低(如 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%
testing
设计并执行社会工程学渗透测试,包括钓鱼、语音钓鱼、短信钓鱼和物理借口活动,以衡量人员安全韧性并识别培训差距。
testing
主持结构化的事件后审查,以识别根本原因、记录有效和无效的措施,并提出可操作的改进建议以提升未来的事件响应能力。
testing
通过分析举报的邮件、提取指标、评估凭据受攻陷情况、在全组织范围隔离恶意邮件并修复受影响账号来响应网络钓鱼事件。涵盖邮件头分析、URL/附件沙箱检测和邮箱范围清除操作。适用于网络钓鱼响应、邮件事件、凭据钓鱼、鱼叉式网络钓鱼调查或钓鱼修复相关请求。
tools
票据传递(Pass-the-Ticket,PtT)是一种横向移动技术,使用窃取的 Kerberos 票据(TGT 或 TGS)在不知道用户密码的情况下向服务进行认证。通过从已控制的主机内存中提取 Kerberos 票据,攻击者可以将这些票据注入自己的会话以模拟票据所有者。