关于 auditing-azure-active-directory-configuration
用于审计 Azure 租户身份配置的技能,面向安全团队和合规审查。内容涵盖角色分配、Conditional Access、陈旧账户、登录风险及 ScoutSuite 自动评估。
主要功能
- 01检查租户安全默认设置
- 02审计特权角色分配
- 03评估 Conditional Access 覆盖情况
- 04查找陈旧账户和来宾用户
- 05分析高风险登录日志
- 06运行 ScoutSuite 评估
适用场景
- 01收购后评估 Azure 租户
- 02审查 MFA 和 Conditional Access 执行情况
- 03识别陈旧或权限过高的账户
- 04调查可疑登录活动
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mukul975/ anthropic-cybersecurity-skills --skill auditing-azure-active-directory-configuration安装后在 Claude Code 中输入/auditing-azure-active-directory-configuration确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
LICENSEreferences/api-reference.mdscripts/agent.py详细介绍
审计 Azure Active Directory 配置
使用场景
- 对 Azure 租户的身份配置进行安全评估时
- 合规审计需要审查身份验证策略、MFA 强制实施和角色分配时
- 在合并或收购后接入新的 Azure 租户时
- 调查可疑的登录活动或已泄露的账户时
- 验证条件访问策略能否充分防御基于身份的攻击时
不要使用于本地 Active Directory 审计(请使用 PingCastle 或 BloodHound AD)、没有身份上下文的 Azure 资源级 RBAC 审计,或实时威胁检测(请使用 Microsoft Defender for Identity)。
前置条件
- 在目标 Microsoft Entra ID 租户中具有全局读取者或安全读取者角色
- 已安装 Microsoft Graph PowerShell SDK(
Install-Module Microsoft.Graph) - 已对目标租户进行 Az CLI 身份验证(
az login --tenant TENANT_ID) - 已配置 Azure 提供程序的 ScoutSuite,用于自动化评估
- 具有对 Azure AD 审核日志和登录日志的访问权限(需要 Azure AD Premium P1/P2)
工作流
第 1 步:枚举租户配置和安全默认值
评估租户的基线身份安全设置,包括安全默认值和旧式身份验证状态。
# Connect to Microsoft Graph
Connect-MgGraph -Scopes "Directory.Read.All","Policy.Read.All","AuditLog.Read.All"
# Get tenant details
Get-MgOrganization | Select-Object DisplayName, Id, VerifiedDomains
# Check if Security Defaults are enabled
Get-MgPolicyIdentitySecurityDefaultEnforcementPolicy | Select-Object IsEnabled
# List authentication methods policies
Get-MgPolicyAuthenticationMethodPolicy | ConvertTo-Json -Depth 5
# Check legacy authentication status via Conditional Access
Get-MgIdentityConditionalAccessPolicy | Where-Object {
$_.Conditions.ClientAppTypes -contains "exchangeActiveSync" -or
$_.Conditions.ClientAppTypes -contains "other"
} | Select-Object DisplayName, State
第 2 步:审计特权角色分配
审查目录角色分配,以识别权限过高的用户、永久管理员账户和高风险角色配置。
# List all Global Administrator assignments
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/directoryRoles/filterByIds" \
--body '{"ids":["62e90394-69f5-4237-9190-012177145e10"]}' | \
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/directoryRoles?filter=displayName eq 'Global Administrator'" \
--query "value[0].id" -o tsv
# List all privileged role assignments using Graph API
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments?\$expand=principal" \
--query "value[*].{Role:roleDefinitionId, Principal:principal.displayName, PrincipalType:[email protected]}" \
-o table
# Check for users with multiple admin roles
az ad user list --query "[].{UPN:userPrincipalName, DisplayName:displayName}" -o table
# List service principals with admin role assignments
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments?\$filter=principalOrganizationId eq 'TENANT_ID'" \
-o json
第 3 步:审查条件访问策略
审计条件访问策略是否存在覆盖缺口,尤其是围绕 MFA 强制实施、设备合规性和基于位置的限制。
# List all Conditional Access policies
Get-MgIdentityConditionalAccessPolicy | Select-Object DisplayName, State, @{
N='GrantControls'; E={$_.GrantControls.BuiltInControls -join ', '}
} | Format-Table -AutoSize
# Identify policies in report-only mode (not enforced)
Get-MgIdentityConditionalAccessPolicy | Where-Object {$_.State -eq "enabledForReportingButNotEnforced"} |
Select-Object DisplayName
# Check MFA enforcement coverage
Get-MgIdentityConditionalAccessPolicy | Where-Object {
$_.GrantControls.BuiltInControls -contains "mfa"
} | Select-Object DisplayName, State, @{
N='Users'; E={$_.Conditions.Users.IncludeUsers -join ', '}
}
# Find policies that exclude groups (potential bypass)
Get-MgIdentityConditionalAccessPolicy | Where-Object {
$_.Conditions.Users.ExcludeGroups.Count -gt 0
} | Select-Object DisplayName, @{
N='ExcludedGroups'; E={$_.Conditions.Users.ExcludeGroups -join ', '}
}
第 4 步:识别长期未使用的账户和来宾用户
查找最近未登录的账户、具有活动角色分配的已禁用账户,以及高风险的来宾用户配置。
# Find users who haven't signed in for 90+ days
az ad user list --query "[?signInActivity.lastSignInDateTime < '2025-11-25T00:00:00Z'].{UPN:userPrincipalName, LastSignIn:signInActivity.lastSignInDateTime, Enabled:accountEnabled}" -o table
# List all guest users
az ad user list --filter "userType eq 'Guest'" \
--query "[].{UPN:userPrincipalName, DisplayName:displayName, CreatedDate:createdDateTime}" \
-o table
# Find guest users with privileged roles
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/roleManagement/directory/roleAssignments?\$expand=principal" \
--query "value[?principal.userType=='Guest'].{Role:roleDefinitionId,Guest:principal.userPrincipalName}" \
-o table
# Check for accounts with disabled MFA
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/reports/authenticationMethods/userRegistrationDetails" \
--query "value[?!isMfaRegistered].{UPN:userPrincipalName,MfaRegistered:isMfaRegistered}" \
-o table
第 5 步:分析登录日志中的高风险活动
审查登录日志,以识别异常的认证模式、失败的 MFA 质询和高风险登录检测。
# Get risky sign-ins from last 7 days
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/auditLogs/signIns?\$filter=riskLevelDuringSignIn ne 'none' and createdDateTime ge 2026-02-16T00:00:00Z" \
--query "value[*].{User:userPrincipalName,Risk:riskLevelDuringSignIn,IP:ipAddress,App:appDisplayName,Status:status.errorCode}" \
-o table
# Get sign-ins from unfamiliar locations
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/auditLogs/signIns?\$filter=riskEventTypes_v2/any(r:r eq 'unfamiliarFeatures')" \
--query "value[*].{User:userPrincipalName,Location:location.city,IP:ipAddress}" \
-o table
# Check for legacy authentication sign-ins
az rest --method GET \
--url "https://graph.microsoft.com/v1.0/auditLogs/signIns?\$filter=clientAppUsed ne 'Browser' and clientAppUsed ne 'Mobile Apps and Desktop clients'" \
--query "value[*].{User:userPrincipalName,ClientApp:clientAppUsed,Status:status.errorCode}" \
-o table
第 6 步:运行 ScoutSuite 自动化评估
执行 ScoutSuite,对 Azure 租户配置进行全面自动化检查。
# Run ScoutSuite against Azure
python3 -m ScoutSuite azure --cli \
--report-dir ./scoutsuite-azure-report \
--all-subscriptions
# Review the generated HTML report
open ./scoutsuite-azure-report/azure-report.html
关键概念
| 术语 | 定义 |
|---|---|
| Microsoft Entra ID | Microsoft 的云身份和访问管理服务,前身为 Azure Active Directory,提供身份验证和授权 |
| 条件访问 | 评估信号(用户、设备、位置、风险)以强制执行 MFA、设备合规性或阻止访问等访问控制的策略引擎 |
| 安全默认值 | Microsoft 的基线身份保护设置,强制实施 MFA 注册、阻止旧式身份验证并保护特权操作 |
| Privileged Identity Management | Azure AD Premium P2 功能,支持带审批工作流和时间限定角色激活的即时特权访问 |
| 旧式身份验证 | 不支持 MFA 的较旧身份验证协议(POP3、IMAP、SMTP、ActiveSync),通常被利用进行凭据攻击 |
| 高风险登录 | Microsoft Entra Identity Protection 对登录异常的检测,包括不可能旅行、陌生位置和与恶意软件关联的 IP |
工具与系统
- Microsoft Graph API:用于查询 Entra ID 配置、策略、角色和审核日志的主要编程接口
- Microsoft Graph PowerShell SDK:用于 Entra ID 管理和安全审计任务的 PowerShell 模块
- ScoutSuite:多云审计工具,支持 Azure 提供程序,可进行 IAM、存储、网络和身份检查
- AzureADRecon:用于全面的 Azure AD 侦察和安全评估报告的社区工具
- Microsoft Defender for Identity:基于云的安全解决方案,用于检测基于身份的威胁和已泄露的凭据
常见场景
场景:收购后的 Azure 租户安全评估
背景:收购一家公司后,安全团队需要在将其与公司 Entra ID 集成之前,评估该 Azure 租户的身份状况。
方法:
- 枚举所有全局管理员,并检查管理员角色中是否存在个人账户
- 审查条件访问策略,以验证 MFA 是否对所有用户(而不仅是管理员)强制执行
- 识别具有特权访问权限的来宾用户,这可能表明第三方供应商权限过度授予
- 检查可能成为凭据攻击目标的闲置账户(90 天以上未登录)
- 审查登录日志中绕过 MFA 的旧版身份验证使用情况
- 验证安全默认值或等效的 CA 策略是否阻止旧版身份验证协议
- 在租户集成之前,生成一份包含按优先级排序的修复步骤的风险报告
陷阱:风险登录检测和 PIM 需要 Azure AD Premium P2。如果被收购的租户使用较低的许可证层级,许多身份保护功能将不可用。来自合作伙伴租户的来宾用户可能通过动态组获得隐式访问权限,而这些权限在标准角色分配查询中不可见。
输出格式
Azure Active Directory Security Audit Report
===============================================
Tenant: acme-acquired.onmicrosoft.com
Tenant ID: a1b2c3d4-e5f6-7890-abcd-ef1234567890
Audit Date: 2026-02-23
License: Azure AD Premium P2
IDENTITY CONFIGURATION:
Security Defaults: Disabled (Conditional Access in use)
Conditional Access Policies: 12 (8 enforced, 3 report-only, 1 disabled)
Legacy Auth Blocked: Partial (blocked for admins only)
PRIVILEGED ACCESS:
Global Administrators: 8 (recommended: <= 4)
Permanent admin assignments: 6 (no PIM activation required)
Service principals with admin: 3
Guest users with privileged roles: 2
ACCOUNT HYGIENE:
Total users: 1,247
Stale accounts (90+ days): 89
Guest users: 234
Users without MFA registered: 156
SIGN-IN RISK:
Risky sign-ins (last 30 days): 34
Legacy auth sign-ins (last 7 days): 67
Impossible travel detections: 5
Unfamiliar location sign-ins: 12
CRITICAL FINDINGS:
1. 8 Global Administrators with permanent assignments (use PIM)
2. Legacy authentication not blocked for non-admin users
3. 156 users without MFA registration
4. 2 guest users with Privileged Role Administrator role
评论
支持 Markdown