mcpField
A
auditing-azure-active-directory-configuration

auditing-azure-active-directory-configuration

github.com/mukul975安全35.2k231 次安装8 周前更新
代码仓库

关于 auditing-azure-active-directory-configuration

用于审计 Azure 租户身份配置的技能,面向安全团队和合规审查。内容涵盖角色分配、Conditional Access、陈旧账户、登录风险及 ScoutSuite 自动评估。

主要功能

  1. 01检查租户安全默认设置
  2. 02审计特权角色分配
  3. 03评估 Conditional Access 覆盖情况
  4. 04查找陈旧账户和来宾用户
  5. 05分析高风险登录日志
  6. 06运行 ScoutSuite 评估

适用场景

  1. 01收购后评估 Azure 租户
  2. 02审查 MFA 和 Conditional Access 执行情况
  3. 03识别陈旧或权限过高的账户
  4. 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 外,安装时一起下载的参考资料和脚本。

LICENSE
references/
api-reference.md
scripts/
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 IDMicrosoft 的云身份和访问管理服务,前身为 Azure Active Directory,提供身份验证和授权
条件访问评估信号(用户、设备、位置、风险)以强制执行 MFA、设备合规性或阻止访问等访问控制的策略引擎
安全默认值Microsoft 的基线身份保护设置,强制实施 MFA 注册、阻止旧式身份验证并保护特权操作
Privileged Identity ManagementAzure 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 租户的身份状况。

方法:

  1. 枚举所有全局管理员,并检查管理员角色中是否存在个人账户
  2. 审查条件访问策略,以验证 MFA 是否对所有用户(而不仅是管理员)强制执行
  3. 识别具有特权访问权限的来宾用户,这可能表明第三方供应商权限过度授予
  4. 检查可能成为凭据攻击目标的闲置账户(90 天以上未登录)
  5. 审查登录日志中绕过 MFA 的旧版身份验证使用情况
  6. 验证安全默认值或等效的 CA 策略是否阻止旧版身份验证协议
  7. 在租户集成之前,生成一份包含按优先级排序的修复步骤的风险报告

陷阱:风险登录检测和 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