public/maester/entra/Test-MtCaMisconfiguredIDProtection.ps1

<#
 .Synopsis
Checks for common misconfigurations in Conditional Access - both user risk and sign-in risk are configured in one policy.
 
 .Description
Conditional Access policies access controls are enforced only if ALL conditions are met. Therefore, sign-in risk and user risk should be configured separately.
 
  Learn more:
  https://learn.microsoft.com/en-us/entra/id-protection/howto-identity-protection-configure-risk-policies
 
 .Example
  Test-MtCaMisconfiguredIDProtection
 
  .LINK
  https://mycorp.dev/docs/commands/Test-MtCaMisconfiguredIDProtection
#>


Function Test-MtCaMisconfiguredIDProtection {
    [CmdletBinding()]
    [OutputType([bool])]
    param ()

    if ( ( Get-MtLicenseInformation EntraID ) -ne "P2" ) {
        Add-MtTestResultDetail -SkippedBecause NotLicensedEntraIDP2
        return $null
    }

    $policies = Get-MtConditionalAccessPolicy | Where-Object { $_.state -eq "enabled" }
    $policiesResult = New-Object System.Collections.ArrayList

    $result = $false
    $hasRiskCAPolicy = $false # flag to check if there is any policy with risk controls, we skip the test if there is none

    foreach ($policy in $policies) {
        if ($policy.conditions.userRiskLevels -or $policy.conditions.signInRiskLevels) {
            $hasRiskCAPolicy = $true
        }
        if ($policy.conditions.userRiskLevels -and $policy.conditions.signInRiskLevels) {
            $result = $true
            $currentresult = $true
            $policiesResult.Add($policy) | Out-Null
        }
        else {
            $currentresult = $false
        }
        Write-Verbose "$($policy.displayName) - $currentresult"
    }


    if ( -not $hasRiskCAPolicy ) {
        Add-MtTestResultDetail -SkippedBecause Custom -SkippedCustomReason "There are no Conditional Access policies with risk controls configured."
        return $null
    }

    if ( $result ) {
        $testResult = "The following conditional access policies have both sign-in risk and user risk controls configured:`n`n%TestResult%"
    }
    else {
        $testResult = "Well done! No conditional access policies detected where sign-in risk and user risk are combined."
    }
    Add-MtTestResultDetail -Result $testResult -GraphObjects $policiesResult -GraphObjectType ConditionalAccess

    return $result
}