Back to Checks
Prowlerprowler-provider-m365
Conditional Access policies enforce MFA for device registration
entra_conditional_access_policy_device_registration_mfa_required
Service: entraSeverity: high
OfficialBuilt-inVerified
Categories:identity-accesse3
Resource Type:NotDefined
Microsoft Entra Conditional Access policies can require multifactor authentication (MFA) for device registration operations.
This control ensures users must complete MFA before registering or joining devices to the directory, reducing the likelihood that compromised credentials can be used to register rogue devices.
Risk
Without MFA for device registration, attackers with stolen credentials could register unauthorized devices into the directory, gain persistence, and bypass compliance-based Conditional Access protections that rely on trusted device state.
Run this check with Prowler
Run in Prowler CloudRun
prowler m365 --checks entra_conditional_access_policy_device_registration_mfa_requiredRecommendation
Enforce MFA through Conditional Access for device registration so users must verify identity before registering or joining devices to the directory.
Remediation
Other
1Navigate to the Microsoft Entra admin center (https://entra.microsoft.com).
2Expand **Protection** > **Conditional Access** and select **Policies**.
3Click **New policy**.
4Under **Users**, include **All users**.
5Under **Target resources**, select **User actions** and check **Register or join devices**.
6Under **Grant**, select **Grant access** and require **multifactor authentication**.
7Set the policy to **Report-only** until validated, then enable it.
Check Code
from prowler.lib.check.models import Check, CheckReportM365
from prowler.providers.m365.services.entra.entra_client import entra_client
from prowler.providers.m365.services.entra.entra_service import (
ConditionalAccessGrantControl,
ConditionalAccessPolicyState,
UserAction,
)
class entra_conditional_access_policy_device_registration_mfa_required(Check):
"""Ensure MFA is required for device registration."""
def execute(self) -> list[CheckReportM365]:
findings = []
report = CheckReportM365(
metadata=self.metadata(),
resource={},
resource_name="Conditional Access Policies",
resource_id="conditionalAccessPolicies",
)
report.status = "FAIL"
report.status_extended = (
"No Conditional Access Policy requires MFA for device registration."
)
reporting_policy = None
for policy in entra_client.conditional_access_policies.values():
if policy.state == ConditionalAccessPolicyState.DISABLED:
continue
if "All" not in policy.conditions.user_conditions.included_users:
continue
if (
UserAction.REGISTER_DEVICE
not in policy.conditions.application_conditions.included_user_actions
):
continue
if (
ConditionalAccessGrantControl.MFA
not in policy.grant_controls.built_in_controls
):
continue
if policy.state == ConditionalAccessPolicyState.ENABLED:
report = CheckReportM365(
metadata=self.metadata(),
resource=policy,
resource_name=policy.display_name,
resource_id=policy.id,
)
report.status = "PASS"
report.status_extended = (
f"Conditional Access Policy '{policy.display_name}' enforces MFA "
"for device registration."
)
break
if (
policy.state == ConditionalAccessPolicyState.ENABLED_FOR_REPORTING
and reporting_policy is None
):
reporting_policy = policy
if report.status == "FAIL" and reporting_policy:
report.status_extended = (
f"Conditional Access Policy '{reporting_policy.display_name}' reports "
"MFA for device registration but does not enforce it."
)
findings.append(report)
return findings