|
| 1 | +function Invoke-CippTestZTNA21872 { |
| 2 | + param($Tenant) |
| 3 | + |
| 4 | + $TestId = 'ZTNA21872' |
| 5 | + |
| 6 | + try { |
| 7 | + # Get conditional access policies and device registration policy from cache |
| 8 | + $CAPolicies = New-CIPPDbRequest -TenantFilter $Tenant -Type 'ConditionalAccessPolicies' |
| 9 | + $DeviceRegistrationPolicy = New-CIPPDbRequest -TenantFilter $Tenant -Type 'DeviceRegistrationPolicy' |
| 10 | + |
| 11 | + if (-not $CAPolicies) { |
| 12 | + Add-CippTestResult -TenantFilter $Tenant -TestId $TestId -TestType 'Identity' -Status 'Investigate' -ResultMarkdown 'Conditional Access policies not found in cache' -Risk 'High' -Name 'Require multifactor authentication for device join and device registration using user action' -UserImpact 'Medium' -ImplementationEffort 'Low' -Category 'Access control' |
| 13 | + return |
| 14 | + } |
| 15 | + |
| 16 | + if (-not $DeviceRegistrationPolicy) { |
| 17 | + Add-CippTestResult -TenantFilter $Tenant -TestId $TestId -TestType 'Identity' -Status 'Investigate' -ResultMarkdown 'Device registration policy not found in cache' -Risk 'High' -Name 'Require multifactor authentication for device join and device registration using user action' -UserImpact 'Medium' -ImplementationEffort 'Low' -Category 'Access control' |
| 18 | + return |
| 19 | + } |
| 20 | + |
| 21 | + $MfaRequiredInDeviceSettings = $DeviceRegistrationPolicy.multiFactorAuthConfiguration -eq 'required' |
| 22 | + |
| 23 | + # Filter for enabled device registration CA policies |
| 24 | + $DeviceRegistrationPolicies = $CAPolicies | Where-Object { |
| 25 | + ($_.state -eq 'enabled') -and |
| 26 | + ($_.conditions.applications.includeUserActions -eq 'urn:user:registerdevice') |
| 27 | + } |
| 28 | + |
| 29 | + # Check each policy to see if it properly requires MFA |
| 30 | + $ValidPolicies = [System.Collections.Generic.List[object]]::new() |
| 31 | + foreach ($Policy in $DeviceRegistrationPolicies) { |
| 32 | + $RequiresMfa = $false |
| 33 | + |
| 34 | + # Check if the policy directly requires MFA |
| 35 | + if ($Policy.grantControls.builtInControls -contains 'mfa') { |
| 36 | + $RequiresMfa = $true |
| 37 | + } |
| 38 | + |
| 39 | + # Check if the policy uses any authentication strength |
| 40 | + if ($null -ne $Policy.grantControls.authenticationStrength) { |
| 41 | + $RequiresMfa = $true |
| 42 | + } |
| 43 | + |
| 44 | + # If the policy requires MFA, add it to valid policies |
| 45 | + if ($RequiresMfa) { |
| 46 | + $ValidPolicies.Add($Policy) |
| 47 | + } |
| 48 | + } |
| 49 | + |
| 50 | + # Determine pass/fail conditions |
| 51 | + if ($MfaRequiredInDeviceSettings) { |
| 52 | + $Passed = 'Failed' |
| 53 | + $ResultMarkdown = "❌ **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.`n`n" |
| 54 | + } elseif ($DeviceRegistrationPolicies.Count -eq 0) { |
| 55 | + $Passed = 'Failed' |
| 56 | + $ResultMarkdown = "❌ **No Conditional Access policies found** for device registration or device join. Create a policy that requires MFA for these user actions.`n`n" |
| 57 | + } elseif ($ValidPolicies.Count -eq 0) { |
| 58 | + $Passed = 'Failed' |
| 59 | + $ResultMarkdown = "❌ **Conditional Access policies found**, but they're not correctly configured. Policies should require MFA or appropriate authentication strength.`n`n" |
| 60 | + } else { |
| 61 | + $Passed = 'Passed' |
| 62 | + $ResultMarkdown = "✅ **Properly configured Conditional Access policies found** that require MFA for device registration/join actions.`n`n" |
| 63 | + } |
| 64 | + |
| 65 | + # Add device settings information |
| 66 | + $ResultMarkdown += "## Device Settings Configuration`n`n" |
| 67 | + $ResultMarkdown += "| Setting | Value | Recommended Value | Status |`n" |
| 68 | + $ResultMarkdown += "| :------ | :---- | :---------------- | :----- |`n" |
| 69 | + |
| 70 | + $DeviceSettingStatus = if ($MfaRequiredInDeviceSettings) { '❌ Should be set to No' } else { '✅ Correctly configured' } |
| 71 | + $DeviceSettingValue = if ($MfaRequiredInDeviceSettings) { 'Yes' } else { 'No' } |
| 72 | + $ResultMarkdown += "| Require Multi-Factor Authentication to register or join devices | $DeviceSettingValue | No | $DeviceSettingStatus |`n" |
| 73 | + |
| 74 | + # Add policies information if any found |
| 75 | + if ($DeviceRegistrationPolicies.Count -gt 0) { |
| 76 | + $ResultMarkdown += "`n## Device Registration/Join Conditional Access Policies`n`n" |
| 77 | + $ResultMarkdown += "| Policy Name | State | Requires MFA | Status |`n" |
| 78 | + $ResultMarkdown += "| :---------- | :---- | :----------- | :----- |`n" |
| 79 | + |
| 80 | + foreach ($Policy in $DeviceRegistrationPolicies) { |
| 81 | + $PolicyName = $Policy.displayName |
| 82 | + $PolicyState = $Policy.state |
| 83 | + $PolicyLink = "https://entra.microsoft.com/#view/Microsoft_AAD_ConditionalAccess/PolicyBlade/policyId/$($Policy.id)" |
| 84 | + $PolicyNameLink = "[$PolicyName]($PolicyLink)" |
| 85 | + |
| 86 | + # Check if this policy is properly configured |
| 87 | + $IsValid = $Policy -in $ValidPolicies |
| 88 | + $RequiresMfaText = if ($IsValid) { 'Yes' } else { 'No' } |
| 89 | + $StatusText = if ($IsValid) { '✅ Properly configured' } else { '❌ Incorrectly configured' } |
| 90 | + |
| 91 | + $ResultMarkdown += "| $PolicyNameLink | $PolicyState | $RequiresMfaText | $StatusText |`n" |
| 92 | + } |
| 93 | + } |
| 94 | + |
| 95 | + Add-CippTestResult -TenantFilter $Tenant -TestId $TestId -TestType 'Identity' -Status $Passed -ResultMarkdown $ResultMarkdown -Risk 'High' -Name 'Require multifactor authentication for device join and device registration using user action' -UserImpact 'Medium' -ImplementationEffort 'Low' -Category 'Access control' |
| 96 | + |
| 97 | + } catch { |
| 98 | + $ErrorMessage = Get-CippException -Exception $_ |
| 99 | + Write-LogMessage -API 'Tests' -tenant $Tenant -message "Failed to run test: $($ErrorMessage.NormalizedError)" -sev Error -LogData $ErrorMessage |
| 100 | + Add-CippTestResult -TenantFilter $Tenant -TestId $TestId -TestType 'Identity' -Status 'Failed' -ResultMarkdown "Error running test: $($ErrorMessage.NormalizedError)" -Risk 'High' -Name 'Require multifactor authentication for device join and device registration using user action' -UserImpact 'Medium' -ImplementationEffort 'Low' -Category 'Access control' |
| 101 | + } |
| 102 | +} |
0 commit comments