pwsh/dev/functions/validateAccess.ps1 (142 lines of code) (raw):

function validateAccess { #region validationAccess #validation / check 'Microsoft Graph API' Access $permissionCheckResults = @() if ($azAPICallConf['htParameters'].onAzureDevOpsOrGitHubActions -eq $true -or $azAPICallConf['htParameters'].accountType -eq 'ServicePrincipal' -or $azAPICallConf['htParameters'].accountType -eq 'ManagedService' -or $azAPICallConf['htParameters'].accountType -eq 'ClientAssertion') { Write-Host "Checking $($azAPICallConf['htParameters'].accountType) permissions" $permissionsCheckFailed = $false $currentTask = 'Test MSGraph Users Read permission' $uri = "$($azAPICallConf['azAPIEndpointUrls'].MicrosoftGraph)/v1.0/users?`$count=true&`$top=1" $method = 'GET' $res = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask -consistencyLevel 'eventual' -validateAccess if ($res -eq 'failed') { $permissionCheckResults += "MSGraph API 'Users Read' permission - check FAILED" $permissionsCheckFailed = $true } else { $permissionCheckResults += "MSGraph API 'Users Read' permission - check PASSED" } $currentTask = 'Test MSGraph Groups Read permission' $uri = "$($azAPICallConf['azAPIEndpointUrls'].MicrosoftGraph)/v1.0/groups?`$count=true&`$top=1" $method = 'GET' $res = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask -consistencyLevel 'eventual' -validateAccess if ($res -eq 'failed') { $permissionCheckResults += "MSGraph API 'Groups Read' permission - check FAILED" $permissionsCheckFailed = $true } else { $permissionCheckResults += "MSGraph API 'Groups Read' permission - check PASSED" } $currentTask = 'Test MSGraph ServicePrincipals Read permission' $uri = "$($azAPICallConf['azAPIEndpointUrls'].MicrosoftGraph)/v1.0/servicePrincipals?`$count=true&`$top=1" $method = 'GET' $res = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask -consistencyLevel 'eventual' -validateAccess if ($res -eq 'failed') { $permissionCheckResults += "MSGraph API 'ServicePrincipals Read' permission - check FAILED" $permissionsCheckFailed = $true } else { $permissionCheckResults += "MSGraph API 'ServicePrincipals Read' permission - check PASSED" } if (-not $NoPIMEligibility) { $currentTask = 'Test MSGraph PrivilegedAccess.Read.AzureResources permission' $uriExt = "&`$expand=parent&`$filter=(type eq 'subscription' or type eq 'managementgroup')&`$top=1" $uri = "$($azAPICallConf['azAPIEndpointUrls'].MicrosoftGraph)/beta/privilegedAccess/azureResources/resources?`$select=id,displayName,type,externalId" + $uriExt $res = AzAPICall -AzAPICallConfiguration $azapicallConf -uri $uri -currentTask $currentTask -validateAccess if ($res -eq 'failed') { $permissionCheckResults += "MSGraph API 'PrivilegedAccess.Read.AzureResources' permission - check FAILED - if you cannot grant this permission or you do not have a Microsoft Entra ID P2 license, then use parameter -NoPIMEligibility" $permissionsCheckFailed = $true } else { $permissionCheckResults += "MSGraph API 'PrivilegedAccess.Read.AzureResources' permission - check PASSED" } } } #endregion validationAccess #ManagementGroup helper #region managementGroupHelper if (-not $ManagementGroupId) { #$catchResult = "letscheck" $currentTask = 'Getting all Management Groups' #Write-Host $currentTask $uri = "$($azAPICallConf['azAPIEndpointUrls'].ARM)/providers/Microsoft.Management/managementGroups?api-version=2020-05-01" $method = 'GET' $getAzManagementGroups = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask -validateAccess if ($getAzManagementGroups -eq 'failed') { $permissionCheckResults += "RBAC 'Reader' permissions on Management Group - check FAILED (use Id, not displayName)" $permissionsCheckFailed = $true } else { $permissionCheckResults += "RBAC 'Reader' permissions on Management Group - check PASSED" } Write-Host 'Permission check results' foreach ($permissionCheckResult in $permissionCheckResults) { if ($permissionCheckResult -like '*PASSED*') { Write-Host $permissionCheckResult -ForegroundColor Green } else { Write-Host $permissionCheckResult -ForegroundColor DarkRed } } if ($permissionsCheckFailed -eq $true) { Write-Host "Please consult the documentation: https://$($GithubRepository)#required-permissions-in-azure" Throw 'Error - Azure Governance Visualizer: check the last console output for details' } if ($getAzManagementGroups.Count -eq 0) { Write-Host 'Management Groups count returned null' Throw 'Error - Azure Governance Visualizer: check the last console output for details' } else { Write-Host "Detected $($getAzManagementGroups.Count) Management Groups" } [array]$MgtGroupArray = addIndexNumberToArray -array ($getAzManagementGroups) if (-not $MgtGroupArray) { Write-Host 'Seems you do not have access to any Management Group. Please make sure you have the required RBAC role [Reader] assigned on at least one Management Group' -ForegroundColor Red Throw 'Error - Azure Governance Visualizer: check the last console output for details' } selectMg if ($($MgtGroupArray[$SelectedMG - 1].Name)) { $script:ManagementGroupId = $($MgtGroupArray[$SelectedMG - 1].name) $script:ManagementGroupName = $($MgtGroupArray[$SelectedMG - 1].properties.displayName) } else { Write-Host 's.th. unexpected happened' -ForegroundColor Red return } Write-Host "Selected Management Group: #$($SelectedMG) $ManagementGroupName (Id: $ManagementGroupId)" -ForegroundColor Green Write-Host '_______________________________________' } else { $currentTask = "Checking permissions for ManagementGroup '$ManagementGroupId'" Write-Host $currentTask $uri = "$($azAPICallConf['azAPIEndpointUrls'].ARM)/providers/Microsoft.Management/managementGroups/$($ManagementGroupId)?api-version=2020-05-01" $method = 'GET' $selectedManagementGroupId = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask -listenOn 'Content' -validateAccess if ($selectedManagementGroupId -eq 'failed') { $permissionCheckResults += "RBAC 'Reader' permissions on Management Group '$($ManagementGroupId)' - check FAILED (use Id, not displayName)" $permissionsCheckFailed = $true } else { $permissionCheckResults += "RBAC 'Reader' permissions on Management Group '$($ManagementGroupId)' - check PASSED" $script:ManagementGroupId = $selectedManagementGroupId.Name $script:ManagementGroupName = $selectedManagementGroupId.properties.displayName } Write-Host 'Permission check results' foreach ($permissionCheckResult in $permissionCheckResults) { if ($permissionCheckResult -like '*PASSED*') { Write-Host $permissionCheckResult -ForegroundColor Green } else { Write-Host $permissionCheckResult -ForegroundColor DarkRed } } if ($permissionsCheckFailed -eq $true) { Write-Host "Please consult the documentation for permission requirements: https://$($GithubRepository)#technical-documentation" Throw 'Error - Azure Governance Visualizer: check the last console output for details' } } #endregion managementGroupHelper if ($azAPICallConf['htParameters'].accountType -eq 'User') { validateLeastPrivilegeForUser } }