private/tests/Test-Assessment.21799.ps1

<#
.SYNOPSIS

#>


function Test-Assessment-21799 {
    [CmdletBinding()]
    param()

    Write-PSFMessage '🟦 Start' -Tag Test -Level VeryVerbose

    $activity = "Checking Block high risk sign-ins"
    Write-ZtProgress -Activity $activity -Status "Getting policy"

    $authMethodPolicy = Invoke-ZtGraphRequest -RelativeUri "policies/authenticationMethodsPolicy" -ApiVersion 'v1.0'
    $allCAPolicies = Invoke-ZtGraphRequest -RelativeUri "identity/conditionalAccess/policies" -ApiVersion 'v1.0'
    $matchedPolicies = $null

    if (($authMethodPolicy.authenticationMethodConfigurations.state -eq 'enabled').count -gt 0) {
        # Local filtering for high risk sign-ins - only consider enabled policies
        $matchedPolicies = $allCAPolicies | Where-Object {
            $_.conditions.signInRiskLevels -eq 'high' -and
            ($_.conditions.users.includeUsers -contains 'All') -and
            ($_.grantControls.builtInControls -contains 'block' -or $_.grantControls.builtInControls -contains 'mfa' -or $null -ne $_.grantControls.authenticationStrength) -and
            ($_.state -eq 'enabled')
        }
    }
    else {
        # Local filtering for high risk sign-ins - only consider enabled policies
        $matchedPolicies = $allCAPolicies | Where-Object {
            $_.conditions.signInRiskLevels -eq 'high' -and
            ($_.conditions.users.includeUsers -contains 'All') -and
            ($_.grantControls.builtInControls -contains 'block') -and
            ($_.state -eq 'enabled')
        }
    }

    $testResultMarkdown = ""

    if ($matchedPolicies.Count -gt 0) {
        $passed = $true
        $testResultMarkdown += "All high-risk sign-in attempts are mitigated by Conditional Access policies enforcing appropriate controls.%TestResult%"
    }
    else {
        $passed = $false
        $testResultMarkdown += "Some high-risk sign-in attempts are not adequately mitigated by Conditional Access policies."
    }


    # Build the detailed sections of the markdown

    # Define variables to insert into the format string
    $reportTitle = "Conditional Access Policies targeting high-risk sign-in attempts"
    $tableRows = ""

    if ($matchedPolicies.Count -gt 0) {
        # Create a here-string with format placeholders {0}, {1}, etc.
        $formatTemplate = @'

## {0}


| Policy Name | Grant Controls | Target Users |
| :---------- | :------------- | :----------- |
{1}

'@


        foreach ($policy in $matchedPolicies) {
            $portalLink = "https://entra.microsoft.com/#view/Microsoft_AAD_ConditionalAccess/PolicyBlade/policyId/{0}" -f $policy.id

            $grantControls = switch ($policy.grantControls) {
                {$_.builtInControls -contains 'block'} {
                    "Block Access"
                }
                {$_.builtInControls -contains 'mfa'} {
                    "Require Multi-Factor Authentication"
                }
                {$null -ne $_.authenticationStrength} {
                    "Require Authentication Strength"
                }
            }

            $targetUsers = if ($policy.conditions.users.includeUsers -contains 'All') {
                "All Users"
            }
            else {
                $policy.conditions.users.includeUsers -join ', '
            }

            $tableRows += @"
| [$(Get-SafeMarkdown($policy.displayName))]($portalLink) | $grantControls | $targetUsers |`n
"@

        }

        # Format the template by replacing placeholders with values
        $mdInfo = $formatTemplate -f $reportTitle, $tableRows
    }
    else {
        $mdInfo = "Some high-risk sign-in attempts are not adequately mitigated by Conditional Access policies.`n"
    }

    # Replace the placeholder with the detailed information
    $testResultMarkdown = $testResultMarkdown -replace "%TestResult%", $mdInfo


    $params = @{
        TestId             = '21799'
        Title              = "Block high risk sign-ins"
        UserImpact         = 'Medium'
        Risk               = 'High'
        ImplementationCost = 'Medium'
        AppliesTo          = 'Identity'
        Tag                = 'Identity'
        Status             = $passed
        Result             = $testResultMarkdown
    }
    Add-ZtTestResultDetail @params
}