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://maester.dev/docs/commands/Test-MtCaMisconfiguredIDProtection
#>


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

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

    try {
        $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
    } catch {
        Add-MtTestResultDetail -Error $_ -GraphObjectType ConditionalAccess
        return $false
    }
}