azuread_account_provisioning_activity_report_reviewedazuread_admin_consent_workflow_enabledazuread_admin_user_mfa_enabledazuread_administrative_account_on_premises_sync_disabledazuread_all_user_mfa_enabledazuread_audit_log_search_enabledazuread_authentication_method_microsoft_authenticator_mfa_fatigue_protectionazuread_authentication_method_restrict_insecure_methodsazuread_authorization_policy_accessing_company_data_not_allowedazuread_conditional_access_block_device_code_flowazuread_conditional_access_block_signin_risk_medium_highazuread_conditional_access_require_managed_device_for_authenticationazuread_conditional_access_require_managed_device_register_security_infoazuread_conditional_access_signin_frequency_intune_every_timeazuread_dynamic_group_for_guest_userazuread_global_admin_range_restrictedazuread_group_not_publicazuread_guest_user_access_reviews_configuredazuread_guest_user_infoazuread_legacy_authentication_disabledazuread_microsoft_azure_management_limited_to_administrative_rolesazuread_password_protection_enabledazuread_privileged_roles_access_reviews_configuredazuread_risky_sign_ins_reportazuread_security_default_disabledazuread_signin_frequency_policyazuread_signin_risk_policyazuread_third_party_application_not_allowedazuread_user_password_not_set_to_expireazuread_user_risk_policyazuread_user_sspr_enabledmicrosoft365_calendar_sharing_disabledmicrosoft365_sharepoint_external_content_sharing_restrictedmicrosoft365_sharepoint_external_sharing_managed_by_domain_whitelist_or_blacklistmicrosoft365_sharepoint_resharing_by_external_users_disabledmicrosoft_user_mfa_capable
Query: azuread_privileged_roles_access_reviews_configured
Usage
powerpipe query microsoft365_compliance.query.azuread_privileged_roles_access_reviews_configuredSQL
with tenant_list as ( select distinct on (tenant_id) tenant_id, _ctx from azuread_user),privileged_roles as ( select tenant_id, id, display_name from azuread_directory_role_definition where display_name in ( 'Global Administrator', 'Exchange Administrator', 'SharePoint Administrator', 'Teams Administrator', 'Security Administrator' )),privileged_role_reviews as ( select ar.tenant_id, d.id from azuread_access_review_schedule_definition ar, jsonb_array_elements(ar.scope -> 'resourceScopes') as r join azuread_directory_role_definition d on split_part(r ->> 'query', 'roleDefinitions/', 2) = d.id where (ar.settings -> 'mailNotificationsEnabled')::bool and (ar.settings -> 'reminderNotificationsEnabled')::bool and (ar.settings -> 'justificationRequiredOnApproval')::bool and ar.settings ->> 'defaultDecision' = 'Deny'),role_check as ( select tenant_id, array_agg(distinct id)::text[] as roles_reviewed from privileged_role_reviews group by tenant_id)select t.tenant_id as resource, case when array(select id from privileged_roles where tenant_id = t.tenant_id) <@ coalesce(r.roles_reviewed, '{}') then 'ok' else 'alarm' end as status, case when array(select id from privileged_roles where tenant_id = t.tenant_id) <@ coalesce(r.roles_reviewed, '{}') then t.tenant_id || ' has access reviews configured monthly (or more frequently) for all high-privileged roles (Global Administrator, Exchange Administrator, SharePoint Administrator, Teams Administrator, Security Administrator).' else t.tenant_id || ' does not have access reviews configured monthly for all high-privileged roles. Missing: ' || array_to_string( array( select pr.display_name from privileged_roles pr where pr.tenant_id = t.tenant_id and pr.id not in ( select unnest(coalesce(r.roles_reviewed, '{}')) ) ), ', ' ) end as reason , t.tenant_id as tenant_id from tenant_list as t left join role_check as r on r.tenant_id = t.tenant_id;
Controls
The query is being used by the following controls: