pwsh/dev/functions/cacheBuiltIn.ps1 (316 lines of code) (raw):

function cacheBuiltIn { $startDefinitionsCaching = Get-Date Write-Host 'Caching built-in Policy and RBAC Role definitions' $arrayBuiltInCaching = @('PolicyDefinitions', 'PolicyDefinitionsStatic', 'PolicySetDefinitions', 'RoleDefinitions') $arrayBuiltInCaching | ForEach-Object -Parallel { $builtInCapability = $_ #fromOtherFunctions $azAPICallConf = $using:azAPICallConf $scriptPath = $using:ScriptPath #Array&HTs $htCacheDefinitionsPolicy = $using:htCacheDefinitionsPolicy $htCacheDefinitionsPolicySet = $using:htCacheDefinitionsPolicySet $htCacheDefinitionsRole = $using:htCacheDefinitionsRole $ValidPolicyEffects = $using:ValidPolicyEffects $htHashesBuiltInPolicy = $using:htHashesBuiltInPolicy #vars $ARMLocation = $using:ARMLocation $ignoreARMLocation = $using:ignoreARMLocation #functions $function:detectPolicyEffect = $using:funcDetectPolicyEffect $function:getPolicyHash = $using:funcGetPolicyHash if ($builtInCapability -eq 'PolicyDefinitions') { $currentTask = 'Caching built-in Policy definitions' Write-Host " $currentTask" $uri = "$($azAPICallConf['azAPIEndpointUrls'].ARM)/providers/Microsoft.Authorization/policyDefinitions?api-version=2021-06-01&`$filter=policyType eq 'BuiltIn'" $method = 'GET' $requestPolicyDefinitionAPI = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask Write-Host " $($requestPolicyDefinitionAPI.Count) built-in Policy definitions returned" $builtinPolicyDefinitions = $requestPolicyDefinitionAPI.where( { $_.properties.policyType -eq 'BuiltIn' } ) foreach ($builtinPolicyDefinition in $builtinPolicyDefinitions) { $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()) = @{ Id = ($builtinPolicyDefinition.Id).ToLower() ScopeMGLevel = '' Scope = 'n/a' ScopeMgSub = 'n/a' ScopeId = 'n/a' DisplayName = $builtinPolicyDefinition.Properties.displayname Name = $builtinPolicyDefinition.Name Description = $builtinPolicyDefinition.Properties.description Type = $builtinPolicyDefinition.Properties.policyType Category = $builtinPolicyDefinition.Properties.metadata.category Version = $builtinPolicyDefinition.Properties.metadata.version PolicyDefinitionId = ($builtinPolicyDefinition.Id).ToLower() LinkToAzAdvertizer = "<a class=`"externallink`" href=`"https://www.azadvertizer.net/azpolicyadvertizer/$(($builtinPolicyDefinition.Id -replace '.*/')).html`" target=`"_blank`" rel=`"noopener`">$($builtinPolicyDefinition.Properties.displayname)</a>" ALZ = $false ALZState = '' ALZLatestVer = '' ALZIdentificationLevel = '' ALZPolicyName = '' } if ($builtinPolicyDefinition.Properties.metadata.deprecated -eq $true -or $builtinPolicyDefinition.Properties.displayname -like "``[Deprecated``]*") { $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()).Deprecated = $builtinPolicyDefinition.Properties.metadata.deprecated } else { $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()).Deprecated = $false } if ($builtinPolicyDefinition.Properties.metadata.preview -eq $true -or $builtinPolicyDefinition.Properties.displayname -like "``[*Preview``]*") { $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()).Preview = $builtinPolicyDefinition.Properties.metadata.preview } else { $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()).Preview = $false } #region effect $htEffectDetected = detectPolicyEffect -policyDefinition $builtinPolicyDefinition $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()).effectDefaultValue = $htEffectDetected.defaultValue $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()).effectAllowedValue = $htEffectDetected.allowedValues $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()).effectFixedValue = $htEffectDetected.fixedValue #endregion effect $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()).Json = $builtinPolicyDefinition if (-not [string]::IsNullOrWhiteSpace($builtinPolicyDefinition.properties.policyRule.then.details.roleDefinitionIds)) { $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()).RoleDefinitionIds = $builtinPolicyDefinition.properties.policyRule.then.details.roleDefinitionIds } else { $script:htCacheDefinitionsPolicy.(($builtinPolicyDefinition.Id).ToLower()).RoleDefinitionIds = 'n/a' } #hashes for parity builtin/custom # $script:htHashesBuiltInPolicy.(($builtinPolicyDefinition.Id).ToLower()) = @{ # policyRuleHash = getPolicyHash -object ($builtinPolicyDefinition.properties.policyRule | ConvertTo-Json -Depth 99) # } $policyRuleHash = (getPolicyHash -json ($builtinPolicyDefinition.properties.policyRule | ConvertTo-Json -Depth 99)) if (-not $htHashesBuiltInPolicy.($policyRuleHash)) { $script:htHashesBuiltInPolicy.($policyRuleHash) = @{ Policies = [System.Collections.ArrayList]@() } $null = $script:htHashesBuiltInPolicy.($policyRuleHash).Policies.Add(($builtinPolicyDefinition.Id).ToLower()) } else { #Write-Host "$($builtinPolicyDefinition.name) $($policyRuleHash) already exists" $null = $script:htHashesBuiltInPolicy.($policyRuleHash).Policies.Add(($builtinPolicyDefinition.Id).ToLower()) #$htHashesBuiltInPolicy.($policyRuleHash).Policies.Count } } Write-Host " $($htHashesBuiltInPolicy.Keys.Count) unique Policy rule hashes for built-in Policy definitions" } if ($builtInCapability -eq 'PolicyDefinitionsStatic') { $currentTask = 'Caching static Policy definitions' Write-Host " $currentTask" $uri = "$($azAPICallConf['azAPIEndpointUrls'].ARM)/providers/Microsoft.Authorization/policyDefinitions?api-version=2021-06-01&`$filter=policyType eq 'Static'" $method = 'GET' $requestPolicyDefinitionAPI = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask Write-Host " $($requestPolicyDefinitionAPI.Count) static Policy definitions returned" $staticPolicyDefinitions = $requestPolicyDefinitionAPI.where( { $_.properties.policyType -eq 'Static' } ) foreach ($staticPolicyDefinition in $staticPolicyDefinitions) { $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()) = @{ Id = ($staticPolicyDefinition.Id).ToLower() ScopeMGLevel = '' Scope = 'n/a' ScopeMgSub = 'n/a' ScopeId = 'n/a' DisplayName = $staticPolicyDefinition.Properties.displayname Name = $staticPolicyDefinition.Name Description = $staticPolicyDefinition.Properties.description Type = $staticPolicyDefinition.Properties.policyType Category = $staticPolicyDefinition.Properties.metadata.category Version = $staticPolicyDefinition.Properties.metadata.version PolicyDefinitionId = ($staticPolicyDefinition.Id).ToLower() LinkToAzAdvertizer = "<a class=`"externallink`" href=`"https://www.azadvertizer.net/azpolicyadvertizer/$(($staticPolicyDefinition.Id -replace '.*/')).html`" target=`"_blank`" rel=`"noopener`">$($staticPolicyDefinition.Properties.displayname)</a>" ALZ = $false ALZState = '' ALZLatestVer = '' ALZIdentificationLevel = '' ALZPolicyName = '' } if ($staticPolicyDefinition.Properties.metadata.deprecated -eq $true -or $staticPolicyDefinition.Properties.displayname -like "``[Deprecated``]*") { $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()).Deprecated = $staticPolicyDefinition.Properties.metadata.deprecated } else { $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()).Deprecated = $false } if ($staticPolicyDefinition.Properties.metadata.preview -eq $true -or $staticPolicyDefinition.Properties.displayname -like "``[*Preview``]*") { $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()).Preview = $staticPolicyDefinition.Properties.metadata.preview } else { $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()).Preview = $false } #region effect $htEffectDetected = detectPolicyEffect -policyDefinition $staticPolicyDefinition $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()).effectDefaultValue = $htEffectDetected.defaultValue $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()).effectAllowedValue = $htEffectDetected.allowedValues $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()).effectFixedValue = $htEffectDetected.fixedValue #endregion effect $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()).Json = $staticPolicyDefinition if (-not [string]::IsNullOrWhiteSpace($staticPolicyDefinition.properties.policyRule.then.details.roleDefinitionIds)) { $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()).RoleDefinitionIds = $staticPolicyDefinition.properties.policyRule.then.details.roleDefinitionIds } else { $script:htCacheDefinitionsPolicy.(($staticPolicyDefinition.Id).ToLower()).RoleDefinitionIds = 'n/a' } } } if ($builtInCapability -eq 'PolicySetDefinitions') { $currentTask = 'Caching built-in PolicySet definitions' Write-Host " $currentTask" $uri = "$($azAPICallConf['azAPIEndpointUrls'].ARM)/providers/Microsoft.Authorization/policySetDefinitions?api-version=2021-06-01&`$filter=policyType eq 'BuiltIn'" $method = 'GET' $requestPolicySetDefinitionAPI = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask $builtinPolicySetDefinitions = $requestPolicySetDefinitionAPI.where( { $_.properties.policyType -eq 'BuiltIn' } ) Write-Host " $($requestPolicySetDefinitionAPI.Count) built-in PolicySet definitions returned" foreach ($builtinPolicySetDefinition in $builtinPolicySetDefinitions) { $script:htCacheDefinitionsPolicySet.(($builtinPolicySetDefinition.Id).ToLower()) = @{ Id = ($builtinPolicySetDefinition.Id).ToLower() ScopeMGLevel = '' Scope = 'n/a' ScopeMgSub = 'n/a' ScopeId = 'n/a' DisplayName = $builtinPolicySetDefinition.Properties.displayname Name = $builtinPolicySetDefinition.Name Description = $builtinPolicySetDefinition.Properties.description Type = $builtinPolicySetDefinition.Properties.policyType Category = $builtinPolicySetDefinition.Properties.metadata.category Version = $builtinPolicySetDefinition.Properties.metadata.version PolicyDefinitionId = ($builtinPolicySetDefinition.Id).ToLower() LinkToAzAdvertizer = "<a class=`"externallink`" href=`"https://www.azadvertizer.net/azpolicyinitiativesadvertizer/$(($builtinPolicySetDefinition.Id -replace '.*/')).html`" target=`"_blank`" rel=`"noopener`">$($builtinPolicySetDefinition.Properties.displayname)</a>" ALZ = $false ALZState = '' ALZLatestVer = '' ALZIdentificationLevel = '' ALZPolicySetName = '' } $htPolicySetPolicyRefIds = @{} $arrayPolicySetPolicyIdsToLower = foreach ($policySetPolicy in $builtinPolicySetDefinition.properties.policydefinitions) { ($policySetPolicy.policyDefinitionId).ToLower() $htPolicySetPolicyRefIds.($policySetPolicy.policyDefinitionReferenceId) = ($policySetPolicy.policyDefinitionId) } $script:htCacheDefinitionsPolicySet.(($builtinPolicySetDefinition.Id).ToLower()).PolicySetPolicyIds = $arrayPolicySetPolicyIdsToLower $script:htCacheDefinitionsPolicySet.(($builtinPolicySetDefinition.Id).ToLower()).PolicySetPolicyRefIds = $htPolicySetPolicyRefIds if ($builtinPolicySetDefinition.Properties.metadata.deprecated -eq $true -or $builtinPolicySetDefinition.Properties.displayname -like "``[Deprecated``]*") { $script:htCacheDefinitionsPolicySet.(($builtinPolicySetDefinition.Id).ToLower()).Deprecated = $builtinPolicySetDefinition.Properties.metadata.deprecated } else { $script:htCacheDefinitionsPolicySet.(($builtinPolicySetDefinition.Id).ToLower()).Deprecated = $false } if ($builtinPolicySetDefinition.Properties.metadata.preview -eq $true -or $builtinPolicySetDefinition.Properties.displayname -like "``[*Preview``]*") { $script:htCacheDefinitionsPolicySet.(($builtinPolicySetDefinition.Id).ToLower()).Preview = $builtinPolicySetDefinition.Properties.metadata.preview } else { $script:htCacheDefinitionsPolicySet.(($builtinPolicySetDefinition.Id).ToLower()).Preview = $false } $script:htCacheDefinitionsPolicySet.(($builtinPolicySetDefinition.Id).ToLower()).Json = $builtinPolicySetDefinition } } if ($builtInCapability -eq 'RoleDefinitions') { $roledefinitionsAPIVersion = $azAPICallConf['htParameters'].APIMappingCloudEnvironment.roledefinitions.($azAPICallConf['htParameters'].azureCloudEnvironment) #region subscriptionScope if ($ignoreARMLocation) { $currentTask = 'Caching built-in Role definitions (subscriptionScope)' Write-Host " $currentTask" $uri = "$($azAPICallConf['azAPIEndpointUrls'].'ARM')/subscriptions/$($azAPICallConf['checkContext'].Subscription.Id)/providers/Microsoft.Authorization/roleDefinitions?api-version=$($roledefinitionsAPIVersion)&`$filter=type eq 'BuiltInRole'" } else { $currentTask = "Caching built-in Role definitions (Location: '$($ARMLocation)') (subscriptionScope)" Write-Host " $currentTask" $uri = "$($azAPICallConf['azAPIEndpointUrls']."ARM$($ARMLocation)")/subscriptions/$($azAPICallConf['checkContext'].Subscription.Id)/providers/Microsoft.Authorization/roleDefinitions?api-version=$($roledefinitionsAPIVersion)&`$filter=type eq 'BuiltInRole'" } $method = 'GET' $requestRoleDefinitionAPI = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask Write-Host " $($requestRoleDefinitionAPI.Count) built-in Role definitions returned (subscriptionScope)" foreach ($roleDefinition in $requestRoleDefinitionAPI) { if ( ( $roleDefinition.properties.permissions.actions -contains 'Microsoft.Authorization/roleassignments/write' -or $roleDefinition.properties.permissions.actions -contains 'Microsoft.Authorization/roleassignments/*' -or $roleDefinition.properties.permissions.actions -contains 'Microsoft.Authorization/*/write' -or $roleDefinition.properties.permissions.actions -contains 'Microsoft.Authorization/*' -or $roleDefinition.properties.permissions.actions -contains '*/write' -or $roleDefinition.properties.permissions.actions -contains '*' ) -and ( $roleDefinition.properties.permissions.notActions -notcontains 'Microsoft.Authorization/roleassignments/write' -and $roleDefinition.properties.permissions.notActions -notcontains 'Microsoft.Authorization/roleassignments/*' -and $roleDefinition.properties.permissions.notActions -notcontains 'Microsoft.Authorization/*/write' -and $roleDefinition.properties.permissions.notActions -notcontains 'Microsoft.Authorization/*' -and $roleDefinition.properties.permissions.notActions -notcontains '*/write' -and $roleDefinition.properties.permissions.notActions -notcontains '*' ) ) { $roleCapable4RoleAssignmentsWrite = $true } else { $roleCapable4RoleAssignmentsWrite = $false } ($script:htCacheDefinitionsRole).($roleDefinition.name) = @{ Id = ($roleDefinition.name) Name = ($roleDefinition.properties.roleName) IsCustom = $false AssignableScopes = ($roleDefinition.properties.assignableScopes) Actions = ($roleDefinition.properties.permissions.actions) NotActions = ($roleDefinition.properties.permissions.notActions) DataActions = ($roleDefinition.properties.permissions.dataActions) NotDataActions = ($roleDefinition.properties.permissions.notDataActions) Json = $roleDefinition LinkToAzAdvertizer = "<a class=`"externallink`" href=`"https://www.azadvertizer.net/azrolesadvertizer/$($roleDefinition.name).html`" target=`"_blank`" rel=`"noopener`">$($roleDefinition.properties.roleName)</a>" RoleCanDoRoleAssignments = $roleCapable4RoleAssignmentsWrite } } #endregion subscriptionScope #region tenantScope if ($ignoreARMLocation) { $currentTask = 'Caching built-in Role definitions (tenantScope)' Write-Host " $currentTask" $uri = "$($azAPICallConf['azAPIEndpointUrls'].'ARM')/providers/Microsoft.Authorization/roleDefinitions?api-version=$($roledefinitionsAPIVersion)&`$filter=type eq 'BuiltInRole'" } else { $currentTask = "Caching built-in Role definitions (Location: '$($ARMLocation)') (tenantScope)" Write-Host " $currentTask" $uri = "$($azAPICallConf['azAPIEndpointUrls']."ARM$($ARMLocation)")/providers/Microsoft.Authorization/roleDefinitions?api-version=$($roledefinitionsAPIVersion)&`$filter=type eq 'BuiltInRole'" } $method = 'GET' $requestRoleDefinitionTenantScopeAPI = AzAPICall -AzAPICallConfiguration $azAPICallConf -uri $uri -method $method -currentTask $currentTask Write-Host " $($requestRoleDefinitionTenantScopeAPI.Count) built-in Role definitions returned (tenantScope)" foreach ($roleDefinition in $requestRoleDefinitionTenantScopeAPI) { if (-not $htCacheDefinitionsRole.($roleDefinition.name)) { Write-Host "tenantScope role: '$($roleDefinition.properties.roleName)' - $($roleDefinition.name)" if ( ( $roleDefinition.properties.permissions.actions -contains 'Microsoft.Authorization/roleassignments/write' -or $roleDefinition.properties.permissions.actions -contains 'Microsoft.Authorization/roleassignments/*' -or $roleDefinition.properties.permissions.actions -contains 'Microsoft.Authorization/*/write' -or $roleDefinition.properties.permissions.actions -contains 'Microsoft.Authorization/*' -or $roleDefinition.properties.permissions.actions -contains '*/write' -or $roleDefinition.properties.permissions.actions -contains '*' ) -and ( $roleDefinition.properties.permissions.notActions -notcontains 'Microsoft.Authorization/roleassignments/write' -and $roleDefinition.properties.permissions.notActions -notcontains 'Microsoft.Authorization/roleassignments/*' -and $roleDefinition.properties.permissions.notActions -notcontains 'Microsoft.Authorization/*/write' -and $roleDefinition.properties.permissions.notActions -notcontains 'Microsoft.Authorization/*' -and $roleDefinition.properties.permissions.notActions -notcontains '*/write' -and $roleDefinition.properties.permissions.notActions -notcontains '*' ) ) { $roleCapable4RoleAssignmentsWrite = $true } else { $roleCapable4RoleAssignmentsWrite = $false } ($script:htCacheDefinitionsRole).($roleDefinition.name) = @{ Id = ($roleDefinition.name) Name = ($roleDefinition.properties.roleName) IsCustom = $false AssignableScopes = ($roleDefinition.properties.assignableScopes) Actions = ($roleDefinition.properties.permissions.actions) NotActions = ($roleDefinition.properties.permissions.notActions) DataActions = ($roleDefinition.properties.permissions.dataActions) NotDataActions = ($roleDefinition.properties.permissions.notDataActions) Json = $roleDefinition LinkToAzAdvertizer = "<a class=`"externallink`" href=`"https://www.azadvertizer.net/azrolesadvertizer/$($roleDefinition.name).html`" target=`"_blank`" rel=`"noopener`">$($roleDefinition.properties.roleName)</a>" RoleCanDoRoleAssignments = $roleCapable4RoleAssignmentsWrite } } } #endregion tenantScope } } $script:builtInPolicyDefinitionsCount = $htCacheDefinitionsPolicy.Values.where({ $_.Type -eq 'BuiltIn' }).count $endDefinitionsCaching = Get-Date Write-Host "Caching built-in definitions duration: $((New-TimeSpan -Start $startDefinitionsCaching -End $endDefinitionsCaching).TotalSeconds) seconds" }