Conditional Access policy requires MFA for Microsoft Admin Portals
Microsoft Entra Conditional Access is evaluated for a policy that requires multifactor authentication when accessing Microsoft Admin Portals (Microsoft 365 Admin Center, Microsoft Entra Admin Center, Microsoft Exchange Admin Center, etc.). The check confirms an enabled policy targets All users, includes the Microsoft Admin Portals app, and enforces an MFA grant control.
Risk
Without MFA on admin portals, attackers with stolen credentials can access Microsoft 365 Admin Center, Entra Admin Center, or Exchange Admin Center to modify tenant settings, escalate privileges, and exfiltrate data. This directly impacts confidentiality, integrity, and availability of all services managed through those portals.
Run this check with Prowler
Run in Prowler Cloudprowler azure --checks entra_conditional_access_policy_require_mfa_for_admin_portalsRecommendation
Create a Conditional Access policy that requires MFA for the Microsoft Admin Portals app targeting All users. Exclude only break-glass emergency accounts and non-interactive service principals. Test in Report-only mode before enforcing. Prefer phishing-resistant MFA methods (FIDO2, passkeys) and apply least privilege principles.
Remediation
Terraform
resource "azuread_conditional_access_policy" "<example_resource_name>" {
display_name = "<example_resource_name>"
state = "enabled"
conditions {
users {
included_users = ["All"]
excluded_users = ["<break_glass_account_id>"]
}
applications {
included_applications = ["MicrosoftAdminPortals"] # Critical: Microsoft Admin Portals
}
}
grant_controls {
operator = "OR"
built_in_controls = ["mfa"] # Critical: requires MFA
}
}Other
Check Code
from prowler.lib.check.models import Check, Check_Report_Azure
from prowler.providers.azure.config import MICROSOFT_ADMIN_PORTALS
from prowler.providers.azure.services.entra.entra_client import entra_client
class entra_conditional_access_policy_require_mfa_for_admin_portals(Check):
def execute(self) -> Check_Report_Azure:
findings = []
for (
tenant_name,
conditional_access_policies,
) in entra_client.conditional_access_policy.items():
for policy in conditional_access_policies.values():
if (
policy.state == "enabled"
and "All" in policy.users["include"]
and MICROSOFT_ADMIN_PORTALS in policy.target_resources["include"]
and any(
"mfa" in access_control.lower()
for access_control in policy.access_controls["grant"]
)
):
report = Check_Report_Azure(
metadata=self.metadata(), resource=policy
)
report.subscription = f"Tenant: {tenant_name}"
report.status = "PASS"
report.status_extended = "Conditional Access Policy requires MFA for Microsoft Admin Portals."
break
else:
report = Check_Report_Azure(
metadata=self.metadata(),
resource=conditional_access_policies,
)
report.subscription = f"Tenant: {tenant_name}"
report.resource_name = "Conditional Access Policy"
report.resource_id = "Conditional Access Policy"
report.status = "FAIL"
report.status_extended = "Conditional Access Policy does not require MFA for Microsoft Admin Portals."
findings.append(report)
return findings