@@ -308,51 +308,66 @@ function Remove-WormStorageAccounts() {
308308 }
309309}
310310
311- function SetResourceNetworkAccessRules ([string ]$ResourceGroupName , [array ]$AllowIpRanges , [switch ]$CI ) {
312- SetStorageNetworkAccessRules - ResourceGroupName $ResourceGroupName - AllowIpRanges $AllowIpRanges - CI:$CI
311+ function SetResourceNetworkAccessRules ([string ]$ResourceGroupName , [array ]$AllowIpRanges , [switch ]$CI , [ switch ] $SetFirewall ) {
312+ SetStorageNetworkAccessRules - ResourceGroupName $ResourceGroupName - AllowIpRanges $AllowIpRanges - CI:$CI - SetFirewall: $SetFirewall
313313}
314314
315- function SetStorageNetworkAccessRules ([string ]$ResourceGroupName , [array ]$AllowIpRanges , [switch ]$CI , [switch ]$Override ) {
315+ function SetStorageNetworkAccessRules ([string ]$ResourceGroupName , [array ]$AllowIpRanges , [switch ]$CI , [switch ]$SetFirewall ) {
316316 $clientIp = $null
317317 $storageAccounts = Retry { Get-AzResource - ResourceGroupName $ResourceGroupName - ResourceType " Microsoft.Storage/storageAccounts" }
318318 # Add client IP to storage account when running as local user. Pipeline's have their own vnet with access
319319 if ($storageAccounts ) {
320320 $appliedRule = $false
321321 foreach ($account in $storageAccounts ) {
322+ $properties = Get-AzStorageAccount - ResourceGroupName $ResourceGroupName - AccountName $account.Name
322323 $rules = Get-AzStorageAccountNetworkRuleSet - ResourceGroupName $ResourceGroupName - AccountName $account.Name
323- if ($rules -and ($Override -or $rules.DefaultAction -eq " Allow" )) {
324- Write-Host " Restricting network rules in storage account '$ ( $account.Name ) ' to deny access by default"
325- Retry { Update-AzStorageAccountNetworkRuleSet - ResourceGroupName $ResourceGroupName - Name $account.Name - DefaultAction Deny }
326- if ($CI -and $env: PoolSubnet ) {
327- Write-Host " Enabling access to '$ ( $account.Name ) ' from pipeline subnet $ ( $env: PoolSubnet ) "
328- Retry { Add-AzStorageAccountNetworkRule - ResourceGroupName $ResourceGroupName - Name $account.Name - VirtualNetworkResourceId $env: PoolSubnet }
329- $appliedRule = $true
330- }
331- elseif ($AllowIpRanges ) {
332- Write-Host " Enabling access to '$ ( $account.Name ) ' to $ ( $AllowIpRanges.Length ) IP ranges"
333- $ipRanges = $AllowIpRanges | ForEach-Object {
334- @ { Action = ' allow' ; IPAddressOrRange = $_ }
335- }
336- Retry { Update-AzStorageAccountNetworkRuleSet - ResourceGroupName $ResourceGroupName - Name $account.Name - IPRule $ipRanges | Out-Null }
337- $appliedRule = $true
324+
325+ if ($properties.AllowBlobPublicAccess ) {
326+ Write-Host " Restricting public blob access in storage account '$ ( $account.Name ) '"
327+ Set-AzStorageAccount - ResourceGroupName $ResourceGroupName - StorageAccountName $account.Name - AllowBlobPublicAccess $false
328+ }
329+
330+ # In override mode, we only want to capture storage accounts that have had incomplete network rules applied,
331+ # otherwise it's not worth updating due to timing and throttling issues.
332+ # If the network rules are deny only without any vnet/ip allowances, then we can't ever purge the storage account
333+ # when immutable blobs need to be removed.
334+ if (! $rules -or ! $SetFirewall -or $rules.DefaultAction -eq " Allow" ) {
335+ return
336+ }
337+
338+ # Add firewall rules in cases where existing rules added were incomplete to enable blob removal
339+ Write-Host " Restricting network rules in storage account '$ ( $account.Name ) ' to deny access by default"
340+ Retry { Update-AzStorageAccountNetworkRuleSet - ResourceGroupName $ResourceGroupName - Name $account.Name - DefaultAction Deny }
341+ if ($CI -and $env: PoolSubnet ) {
342+ Write-Host " Enabling access to '$ ( $account.Name ) ' from pipeline subnet $ ( $env: PoolSubnet ) "
343+ Retry { Add-AzStorageAccountNetworkRule - ResourceGroupName $ResourceGroupName - Name $account.Name - VirtualNetworkResourceId $env: PoolSubnet }
344+ $appliedRule = $true
345+ }
346+ elseif ($AllowIpRanges ) {
347+ Write-Host " Enabling access to '$ ( $account.Name ) ' to $ ( $AllowIpRanges.Length ) IP ranges"
348+ $ipRanges = $AllowIpRanges | ForEach-Object {
349+ @ { Action = ' allow' ; IPAddressOrRange = $_ }
338350 }
339- elseif (! $CI ) {
340- Write-Host " Enabling access to '$ ( $account.Name ) ' from client IP"
341- $clientIp ?? = Retry { Invoke-RestMethod - Uri ' https://icanhazip.com/' } # cloudflare owned ip site
342- $clientIp = $clientIp.Trim ()
343- $ipRanges = Get-AzStorageAccountNetworkRuleSet - ResourceGroupName $ResourceGroupName - Name $account.Name
344- if ($ipRanges ) {
345- foreach ($range in $ipRanges.IpRules ) {
346- if (DoesSubnetOverlap $range.IPAddressOrRange $clientIp ) {
347- return
348- }
351+ Retry { Update-AzStorageAccountNetworkRuleSet - ResourceGroupName $ResourceGroupName - Name $account.Name - IPRule $ipRanges | Out-Null }
352+ $appliedRule = $true
353+ }
354+ elseif (! $CI ) {
355+ Write-Host " Enabling access to '$ ( $account.Name ) ' from client IP"
356+ $clientIp ?? = Retry { Invoke-RestMethod - Uri ' https://icanhazip.com/' } # cloudflare owned ip site
357+ $clientIp = $clientIp.Trim ()
358+ $ipRanges = Get-AzStorageAccountNetworkRuleSet - ResourceGroupName $ResourceGroupName - Name $account.Name
359+ if ($ipRanges ) {
360+ foreach ($range in $ipRanges.IpRules ) {
361+ if (DoesSubnetOverlap $range.IPAddressOrRange $clientIp ) {
362+ return
349363 }
350364 }
351- Retry { Add-AzStorageAccountNetworkRule - ResourceGroupName $ResourceGroupName - Name $account.Name - IPAddressOrRange $clientIp | Out-Null }
352- $appliedRule = $true
353365 }
366+ Retry { Add-AzStorageAccountNetworkRule - ResourceGroupName $ResourceGroupName - Name $account.Name - IPAddressOrRange $clientIp | Out-Null }
367+ $appliedRule = $true
354368 }
355369 }
370+
356371 if ($appliedRule ) {
357372 Write-Host " Sleeping for 15 seconds to allow network rules to take effect"
358373 Start-Sleep 15
0 commit comments