)
基于 Graph Activity Logs 检测 Entra 攻击工具的 Schema 与 KQL 参考指南Anthropic-Cybersecurity-Skills【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills导读本指南围绕 Anthropic-Cybersecurity-Skills 仓库中detecting-entra-offensive-tools-in-graph-logs技能的参考文档展开系统讲解MicrosoftGraphActivityLogs与AADGraphActivityLogs两张目录 API 活动日志表的字段结构、跨表关联键与可复用的 KQL 构建块并给出启用诊断设置的 Azure CLI 命令与 Sentinel 分析规则的 REST API 接入大纲。读完本文你将掌握如何确认日志表摄入、用 User-Agent 与端点扫描指纹定位 ROADtools / AADInternals / AzureHound 等 Entra 枚举工具并把高危查询沉淀为生产级 Sentinel 计划性分析规则。背景弥补 Azure AD Graph 十年的可见性盲区近十年来遗留的 Azure AD Graph APIgraph.windows.net一直是防御方的盲区针对它的请求不会产生一等活动日志因此重度依赖 AAD Graph 的工具如 ROADtools 的roadrecon、AADInternals几乎可以不留痕迹地枚举整个租户。Microsoft 推出的AADGraphActivityLogs2026 年正式可用与已可用的MicrosoftGraphActivityLogsgraph.microsoft.com互补为 SOC 提供了目录 API 流量的请求级可见性调用方身份、应用、源 IP、HTTP 方法、请求 URI以及关键的User-Agent字段。本技能是攻击侧 Entra 工具的防御性镜像其检测行为对应 MITRE ATTCKT1078.004有效账户云账户——攻击者使用合法常为钓鱼或令牌窃取所得云凭据经 Graph API 枚举并操作租户。仓库中的完整技能文档见 SKILL.md框架映射见 standards.md。日志表结构两张表一套 Schema 思路参考文档将检测所需的两张表归纳如下表覆盖范围关键字段MicrosoftGraphActivityLogsgraph.microsoft.com 请求RequestUri、RequestMethod、UserAgent、UserId、AppId、IPAddress/CallerIpAddress、ResponseStatusCode、SignInActivityId、TimeGeneratedAADGraphActivityLogs遗留 graph.windows.net 请求RequestUri、RequestMethod、UserAgent、UserId、AppId、CallerIpAddress、SignInActivityId、TimeGenerated两张表字段高度同构狩猎时可以直接用union合并检索。其中SignInActivityId是将 API 调用回溯到登录会话的关键桥接字段见下文关联键。从 agent.py 的HUNTS字典可以看到仓库实际执行的查询正是围绕这些字段展开ingestion探针确认摄入、roadtools-ua命中CallerIpAddress/AppId/UserAgent/UserId、endpoint-sweep则利用RequestUri做资源级聚合。关联键把 API 调用接回一次登录要将可疑的 Graph 调用关联到具体的登录会话参考文档给出了四组核心关联键字段关联目标说明SignInActivityIdSigninLogs.UniqueTokenIdentifierAADGraphActivityLogs 中的值可能带有填充关联前需先裁剪SessionIdSigninLogs / MicrosoftGraphActivityLogs / Unified Audit Log跨源会话关联UserIdSigninLogs.UserId账户实体AppIdSigninLogs.AppId调用应用其中SignInActivityId的填充差异是实战中容易踩坑的点。参考文档给出了两段可复用的 KQL 构建块来处理该问题// Trim SignInActivityId padding for correlation | extend TokenId trim_end(, tostring(SignInActivityId))在 SKILL.md 的 Step 6 中这个TokenId会被进一步用于与SigninLogs做join以恢复设备、位置、MFA 与条件访问结果等上下文。可复用的 KQL 构建块参考文档提供了五段可直接粘贴的 KQL 片段构成后续所有狩猎查询的基础组件// Confirm ingestion union withsourceTbl MicrosoftGraphActivityLogs, AADGraphActivityLogs | where TimeGenerated ago(1d) | summarize count() by Tbl // aiohttp / python UA (ROADtools) AADGraphActivityLogs | where UserAgent contains python and UserAgent contains aiohttp // Toolkit UA strings union MicrosoftGraphActivityLogs, AADGraphActivityLogs | where UserAgent has_any (AADInternals,azurehound,BloodHound,Go-http-client) // Extract top-level Graph resource from RequestUri | extend TopLevelResource tolower(tostring(split(split(RequestUri,?)[0],/)[3])) // Trim SignInActivityId padding for correlation | extend TokenId trim_end(, tostring(SignInActivityId))要点解读摄入确认union withsourceTbl会保留来源表名Tbl便于确认两张表是否都在流入工作区。User-Agent 指纹ROADtools 基于 Python 的aiohttp未伪装 UA 时形如Python/3.12 aiohttp/3.10.4AADInternals、AzureHoundGo HTTP 客户端等工具也有特征明显的 agent 字符串。注意contains是子串匹配has_any是按词边界匹配后者对Go-http-client这类字符串更合适。顶层资源抽取split(split(RequestUri,?)[0],/)[3]先去除查询字符串再取路径的第 4 段如users、groups、tenantdetails这是端点扫描行为检测的基础。启用诊断设置让日志先流起来无论写多好的查询前提是两张日志表已经流入工作区。可在 Azure 门户的 Microsoft Entra ID → Diagnostic settings 中配置或直接使用参考文档给出的 Azure CLI 命令az monitor diagnostic-settings create \ --name entra-graph-logs \ --resource /providers/microsoft.aadiam/diagnosticSettings \ --logs [{category:MicrosoftGraphActivityLogs,enabled:true},{category:AADGraphActivityLogs,enabled:true}] \ --workspace log-analytics-workspace-id要点--resource固定指向租户级资源/providers/microsoft.aadiam/diagnosticSettings即 Entra ID 的诊断设置资源提供程序--logs为 JSON 数组必须同时启用MicrosoftGraphActivityLogs与AADGraphActivityLogs两个类别只启用其一仍会留下另一侧盲区--workspace填入目标 Log Analytics 工作区 IDGUID。日志落地后建议先用前述摄入确认查询验证 24 小时内两张表均有记录。结合源码把狩猎查询自动化参考文档的 KQL 构建块在仓库中被直接固化为自动化脚本 agent.py。该脚本用 Python 标准库urllib调用 Azure Monitor Query REST APIhttps://api.loganalytics.io/v1/workspaces/{ws}/query通过POST提交 KQL 并格式化打印结果。脚本内置了五个与技能工作流一一对应的狩猎模板HUNTS字典ingestion、roadtools-ua、tool-agents、endpoint-sweep、volume-outlier其中{days}与{threshold}是运行时参数。典型用法如下# 获取 api.loganalytics.io 的 bearer token az account get-access-token --resource https://api.loganalytics.io \ --query accessToken -o tsv # 运行全部狩猎默认回看 7 天volume-outlier 阈值默认 200 python3 agent.py --workspace workspace-id --token $TOKEN # 只跑端点扫描狩猎并指定 30 天回看窗口 python3 agent.py --workspace workspace-id --token $TOKEN \ --hunt endpoint-sweep --days 30从源码可见其工程细节--token也支持环境变量AZ_MONITOR_TOKENHTTPError与URLError均被捕获并以非零退出码终止print_table对结果列宽做了友好格式化并截断前 50 行。该脚本定位为防御性蓝队工具使用时需具备对应的 Log Analytics 读取权限。实战狩猎从 User-Agent 到行为指纹参考文档给出了基础指纹构建块完整的七步狩猎工作流则沉淀在 SKILL.md。其核心思想是字符串指纹可被伪装行为指纹难以消除。Step 2 — User-Agent 指纹ROADtools/aiohttp未伪装的roadrecon请求会同时包含python与aiohttpAADGraphActivityLogs | where TimeGenerated ago(7d) | where RequestMethod GET | where UserAgent contains python and UserAgent contains aiohttp | summarize RequestCount count() by CallerIpAddress, AppId, UserAgent, UserId | sort by RequestCount descStep 4 — 行为指纹roadrecon 端点扫描抗伪装即使攻击者伪造 UAroadrecon gather也会在极短时间窗内触达一组特征性的目录资源。按用户与 5 分钟窗口分桶命中完整扫描集合即告警AADGraphActivityLogs | where TimeGenerated ago(1d) | where RequestMethod GET | extend TopLevelResource tolower(tostring(split(split(RequestUri, ?)[0], /)[3])) | summarize TopLevelResources make_set(TopLevelResource), AppIds make_set(AppId), CallerIPs make_set(CallerIpAddress), UserAgents make_set(UserAgent), StartTime min(TimeGenerated), EndTime max(TimeGenerated) by UserId, bin(TimeGenerated, 5m) | where TopLevelResources has_all (users, tenantdetails, groups, applications, serviceprincipals, devices, directoryroles, roledefinitions, contacts, oauth2permissiongrants, authorizationpolicy) | project StartTime, EndTime, UserId, AppIds, CallerIPs, UserAgents这套完整扫描集合列表users、groups、applications、serviceprincipals、devices、directoryroles、roledefinitions、oauth2permissiongrants等正是roadrecon gather的行为签名即使UserAgent被伪造也仍然成立。Step 5 — 高量枚举离群点捕获短时间内远超人类水平的目录读取按 10 分钟窗口聚合读取量超过 200 即可疑阈值可调MicrosoftGraphActivityLogs | where TimeGenerated ago(1d) | where RequestMethod GET | where RequestUri has_any (/users, /groups, /servicePrincipals, /applications, /directoryRoles, /roleManagement) | summarize Readscount(), Resourcesdcount(RequestUri) by UserId, AppId, CallerIpAddress, bin(TimeGenerated, 10m) | where Reads 200 | sort by Reads descStep 6 — 回连登录会话用裁剪后的SignInActivityId关联SigninLogs恢复UserPrincipalName、IPAddress、AppDisplayName、ConditionalAccessStatus、DeviceDetail等登录上下文。各工具的指纹速查出自 SKILL.md 的 Detection Fingerprint Reference工具主要指纹主要落点表ROADtools (roadrecon)pythonaiohttpUA5 分钟内完成全目录端点扫描AADGraphActivityLogsAADInternalsUA 含AADInternals/工具库字符串AAD Graph 读取AADGraphActivityLogsAzureHoundGo HTTP 客户端 UA广泛的 MS Graph 枚举MicrosoftGraphActivityLogs通用侦察短时间内跨 users/groups/apps/SP 的高 GET 量两表生产化Sentinel 计划性分析规则参考文档的最后一部分给出了将狩猎查询落地为 Sentinel 分析规则的 REST API 大纲。通过Microsoft.SecurityInsights资源提供程序的 Scheduled 规则端点可用PUT创建/更新规则方法端点用途PUT/subscriptions/{sub}/resourceGroups/{rg}/providers/Microsoft.OperationalInsights/workspaces/{ws}/providers/Microsoft.SecurityInsights/alertRules/{ruleId}?api-version2023-02-01创建/更新 Scheduled 分析规则请求体携带 KQLquery、queryFrequency、queryPeriod、tactics、techniques: [T1078.004]与entityMappings生产化时的关键调优出自 SKILL.md Step 7调度参数典型配置为每 1 小时运行一次、覆盖 1 天数据queryFrequency/queryPeriod技术映射规则显式标注techniques: [T1078.004]附带 T1087.004云账户发现、T1069.003云组/权限组发现、T1526云服务发现实体映射Account UserId、IP CallerIpAddress、Host/App AppId让告警自动富化误报控制通过 watchlist 排除已知正常的服务主体 App ID 与获批的扫描器 IP再启用规则。框架映射与适用前提本技能的检测行为在仓库中被映射到 NIST CSF 2.0 的DE.CM-09持续监控计算硬件、软件、运行时环境及其数据以发现潜在不利事件并覆盖 MITRE ATTCK 的T1078.004核心技术与 T1087.004、T1069.003、T1526 关联技术详见 standards.md。适用前提需要 Sentinel或 Log Analytics工作区同时摄入MicrosoftGraphActivityLogs与AADGraphActivityLogs并具备SigninLogs、AADNonInteractiveUserSignInLogs用于关联运行 KQL 需要 Sentinel Reader/Responder或 Log Analytics ReaderRBAC 权限。需要特别说明的是AADGraphActivityLogs 为 2026 年正式可用的新表若你的租户尚未启用对应诊断设置本文所有针对该表的查询都不会命中——因此启用诊断设置是整套检测方案的第一步。验证清单参考 SKILL.md 的 Validation Criteria一套完整的落地检查项包括两张 Graph 活动日志表均已确认摄入已执行 ROADtools/aiohttp 的 User-Agent 指纹狩猎已执行 AADInternals/AzureHound agent 狩猎已执行行为端点扫描狩猎并针对误报调优已执行高量枚举离群点查询至少一条发现已回连到登录/会话与源身份最优查询已固化为带 T1078.004 映射与实体映射的计划性分析规则已知正常的服务主体/IP 已通过 watchlist 排除以控制误报【免费下载链接】Anthropic-Cybersecurity-Skills817 structured cybersecurity skills for AI agents · Mapped to 6 frameworks: MITRE ATTCK, NIST CSF 2.0, MITRE ATLAS, D3FEND, NIST AI RMF MITRE F3 (Fight Fraud) · agentskills.io standard · Works with Claude Code, GitHub Copilot, Codex CLI, Cursor, Gemini CLI 20 platforms · 29 security domains · Apache 2.0项目地址: https://gitcode.com/GitHub_Trending/an/Anthropic-Cybersecurity-Skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考