Rules/ID-003.security-defaults-coherence.psd1

@{
    Id          = 'ID-003'
    Title       = 'Security defaults and Conditional Access are used coherently'
    Area        = 'AuthorizationPolicy'
    Severity    = 'Medium'
    References  = @(
        'https://learn.microsoft.com/entra/fundamentals/security-defaults'
    )
    Rationale   = 'Security defaults and Conditional Access should not run in parallel (conflicting prompts), but at least one of the two must protect the tenant.'
    Remediation = 'When Conditional Access is in use, disable security defaults. When no Conditional Access policies exist, enable security defaults as the baseline.'
    Test        = {
        param($Snapshot)
        $authArea = $Snapshot.AuthorizationPolicy
        $securityDefaultsOn = [bool]($authArea.securityDefaults -and $authArea.securityDefaults.isEnabled)
        if ($null -eq $Snapshot.PSObject.Properties['ConditionalAccess']) {
            return New-TLRuleResult -Status Manual -Evidence 'Conditional Access area was not collected - correlation with security defaults is not possible.'
        }
        $enabledPolicies = @($Snapshot.ConditionalAccess | Where-Object { $_.state -eq 'enabled' })
        if ($enabledPolicies.Count -gt 0 -and $securityDefaultsOn) {
            return New-TLRuleResult -Status Fail -Evidence 'Security defaults are enabled although Conditional Access policies are active.'
        }
        if ($enabledPolicies.Count -eq 0 -and -not $securityDefaultsOn) {
            return New-TLRuleResult -Status Fail -Evidence 'Neither security defaults nor any enabled Conditional Access policy protects this tenant.'
        }
        if ($securityDefaultsOn) {
            New-TLRuleResult -Status Pass -Evidence 'Security defaults are enabled (no Conditional Access in use).'
        }
        else {
            New-TLRuleResult -Status Pass -Evidence ("Conditional Access is active ({0} enabled policies), security defaults are off." -f $enabledPolicies.Count)
        }
    }
}