auditing-azure-active-directory-configuration について
Azure テナントの ID 構成を監査するスキルで、セキュリティチームやコンプライアンス審査を対象とします。ロール割り当て、Conditional Access、休眠アカウント、サインインリスク、ScoutSuite による自動評価を扱います。
主な機能
- 01テナントのセキュリティ既定値の確認
- 02特権ロール割り当ての監査
- 03Conditional Access の適用範囲評価
- 04休眠アカウントとゲストユーザーの特定
- 05リスクのあるサインインログの分析
- 06ScoutSuite による評価の実行
活用シーン
- 01買収後の Azure テナント評価
- 02MFA と 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 テナントの ID 構成に対するセキュリティ評価を実施する場合
- コンプライアンス監査で、認証ポリシー、MFA の適用、ロールの割り当てを確認する必要がある場合
- 合併または買収後に、新しい Azure テナントを導入する場合
- 不審なサインインアクティビティや侵害されたアカウントを調査する場合
- 条件付きアクセス ポリシーが ID ベースの攻撃から適切に保護していることを検証する場合
次の場合は使用しないでください。オンプレミスの Active Directory の監査(PingCastle または BloodHound AD を使用)、ID のコンテキストを伴わない 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:テナント構成とセキュリティの既定値を列挙する
セキュリティの既定値やレガシー認証の状態など、テナントの基本的な ID セキュリティ設定を評価します。
# 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 | 旧称 Azure Active Directory。認証と認可を提供する、Microsoft のクラウド ID およびアクセス管理サービス |
| 条件付きアクセス | ユーザー、デバイス、場所、リスクなどのシグナルを評価し、MFA、デバイスのコンプライアンス、アクセスのブロックなどのアクセス制御を適用するポリシーエンジン |
| セキュリティの既定値 | MFA の登録を必須にし、レガシー認証をブロックし、特権操作を保護する、Microsoft の基本的な ID 保護設定 |
| Privileged Identity Management | Azure AD Premium P2 の機能。承認ワークフローと期間限定のロール有効化を用いて、必要なときだけ特権アクセスを有効にできます |
| レガシー認証 | MFA をサポートせず、認証情報を狙った攻撃によく悪用される古い認証プロトコル(POP3、IMAP、SMTP、ActiveSync) |
| リスクのあるサインイン | あり得ない移動、見慣れない場所、マルウェアに関連する IP など、サインインの異常を検出する Microsoft Entra Identity Protection の機能 |
ツールとシステム
- Microsoft Graph API:Entra ID の構成、ポリシー、ロール、監査ログを照会するための主要なプログラムインターフェイス
- Microsoft Graph PowerShell SDK:Entra ID の管理やセキュリティ監査に使用する PowerShell モジュール
- ScoutSuite:IAM、ストレージ、ネットワーク、ID のチェックに対応した Azure プロバイダーを備える、マルチクラウド監査ツール
- AzureADRecon:包括的な Azure AD の偵察とセキュリティ評価レポートを行うコミュニティツール
- Microsoft Defender for Identity:ID ベースの脅威や侵害された認証情報を検出するクラウドベースのセキュリティソリューション
よくあるシナリオ
シナリオ:買収後の Azure テナントセキュリティ評価
コンテキスト:企業を買収した後、セキュリティチームは、企業の Entra ID と統合する前に Azure テナントの ID セキュリティ態勢を評価する必要があります。
アプローチ:
- すべてのグローバル管理者を列挙し、管理者ロールに個人アカウントが含まれていないか確認します
- 条件付きアクセス ポリシーを確認し、管理者だけでなくすべてのユーザーに MFA が適用されていることを検証します
- 第三者ベンダーへの過剰な権限付与を示す可能性がある、特権アクセスを持つゲストユーザーを特定します
- 古いアカウント(90 日以上サインインしていないアカウント)を確認します。これらは認証情報を狙った攻撃の標的になる可能性があります
- MFA を回避するレガシー認証の使用について、サインインログを確認します
- セキュリティの既定値または同等の CA ポリシーによって、レガシー認証プロトコルがブロックされていることを検証します
- テナント統合前に、優先順位を付けた修復手順を含むリスクレポートを作成します
注意点:リスクのあるサインインの検出と PIM には Azure AD Premium P2 が必要です。買収したテナントが下位のライセンスプランを使用している場合、多くの ID 保護機能を利用できません。パートナーテナントのゲストユーザーは、標準的なロール割り当てクエリでは確認できない動的グループを通じて、暗黙的なアクセス権を持っている場合があります。
出力形式
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