private/tests/Test-Assessment.21872.ps1
<# .SYNOPSIS Checks if MFA is required for device join and device registration using conditional access #> function Test-Assessment-21872 { [CmdletBinding()] param() Write-PSFMessage '🟦 Start' -Tag Test -Level VeryVerbose $activity = "Checking Require multifactor authentication for device join and device registration using user action" Write-ZtProgress -Activity $activity -Status "Getting conditional access policies" # Query all Conditional Access policies $caps = Invoke-ZtGraphRequest -RelativeUri 'identity/conditionalAccess/policies' -ApiVersion 'v1.0' # Get device settings to check if MFA is required at device settings level Write-ZtProgress -Activity $activity -Status "Getting device settings" $deviceSettings = Invoke-ZtGraphRequest -RelativeUri "policies/deviceRegistrationPolicy" -ApiVersion 'v1.0' $mfaRequiredInDeviceSettings = $deviceSettings.multiFactorAuthConfiguration -eq "required" # Filter for enabled device registration CA policies $deviceRegistrationPolicies = $caps | Where-Object { ($_.state -eq 'enabled') -and ($_.conditions.applications.includeUserActions -eq "urn:user:registerdevice") } # Check each policy to see if it properly requires MFA - simplified approach $validPolicies = @() foreach ($policy in $deviceRegistrationPolicies) { $requiresMfa = $false # Check if the policy directly requires MFA if ($policy.grantControls.builtInControls -contains "mfa") { $requiresMfa = $true } # Check if the policy uses any authentication strength (all treated as MFA) if ($null -ne $policy.grantControls.authenticationStrength) { $requiresMfa = $true } # If the policy requires MFA, add it to valid policies if ($requiresMfa) { $validPolicies += $policy } } # Determine pass/fail conditions $result = $false # If device settings has MFA required, that's not the recommended approach if ($mfaRequiredInDeviceSettings) { $result = $false $testResultMarkdown = "**MFA is configured incorrectly.** Device Settings has 'Require Multi-Factor Authentication to register or join devices' set to Yes. According to best practices, this should be set to No, and MFA should be enforced through Conditional Access policies instead.%TestResult%" } # If no device registration policies exist elseif ($deviceRegistrationPolicies.Count -eq 0) { $result = $false $testResultMarkdown = "**No Conditional Access policies found** for device registration or device join. Create a policy that requires MFA for these user actions.%TestResult%" } # If policies exist but none are properly configured elseif ($validPolicies.Count -eq 0) { $result = $false $testResultMarkdown = "**Conditional Access policies found**, but they're not correctly configured. Policies should require MFA or appropriate authentication strength.%TestResult%" } # If valid policies exist else { $result = $true $testResultMarkdown = "**Properly configured Conditional Access policies found** that require MFA for device registration/join actions.%TestResult%" } $passed = $result # Build the detailed sections of the markdown $mdInfo = "" # Add device settings information $mdInfo += "`n## Device Settings Configuration`n`n" $mdInfo += "| Setting | Value | Recommended Value | Status |`n" $mdInfo += "| :------ | :---- | :---------------- | :----- |`n" $deviceSettingStatus = if ($mfaRequiredInDeviceSettings) { "❌ Should be set to No" } else { "✅ Correctly configured" } $deviceSettingValue = if ($mfaRequiredInDeviceSettings) { "Yes" } else { "No" } $mdInfo += "| Require Multi-Factor Authentication to register or join devices | $deviceSettingValue | No | $deviceSettingStatus |`n" # Add policies information if any found if ($deviceRegistrationPolicies.Count -gt 0) { $mdInfo += "`n## Device Registration/Join Conditional Access Policies`n`n" $mdInfo += "| Policy Name | State | Requires MFA | Status |`n" $mdInfo += "| :---------- | :---- | :----------- | :----- |`n" foreach ($policy in $deviceRegistrationPolicies) { $policyName = $policy.displayName $policyState = $policy.state $link = "https://entra.microsoft.com/#view/Microsoft_AAD_ConditionalAccess/PolicyBlade/policyId/{0}" -f $policy.id $policyName = "[$policyName]($link)" # Check if this policy is properly configured $isValid = $policy -in $validPolicies $requiresMfaText = if ($isValid) { "Yes" } else { "No" } $statusText = if ($isValid) { "✅ Properly configured" } else { "❌ Incorrectly configured" } $mdInfo += "| $policyName | $policyState | $requiresMfaText | $statusText |`n" } } # Replace the placeholder with the detailed information $testResultMarkdown = $testResultMarkdown -replace "%TestResult%", $mdInfo Add-ZtTestResultDetail -TestId '21872' -Title "Require multifactor authentication for device join and device registration using user action" ` -UserImpact Medium -Risk High -ImplementationCost Low ` -AppliesTo Identity -Tag Identity ` -Status $passed -Result $testResultMarkdown } |