@@ -308,51 +308,66 @@ function Remove-WormStorageAccounts() {
308
308
}
309
309
}
310
310
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
313
313
}
314
314
315
- function SetStorageNetworkAccessRules ([string ]$ResourceGroupName , [array ]$AllowIpRanges , [switch ]$CI , [switch ]$Override ) {
315
+ function SetStorageNetworkAccessRules ([string ]$ResourceGroupName , [array ]$AllowIpRanges , [switch ]$CI , [switch ]$SetFirewall ) {
316
316
$clientIp = $null
317
317
$storageAccounts = Retry { Get-AzResource - ResourceGroupName $ResourceGroupName - ResourceType " Microsoft.Storage/storageAccounts" }
318
318
# Add client IP to storage account when running as local user. Pipeline's have their own vnet with access
319
319
if ($storageAccounts ) {
320
320
$appliedRule = $false
321
321
foreach ($account in $storageAccounts ) {
322
+ $properties = Get-AzStorageAccount - ResourceGroupName $ResourceGroupName - AccountName $account.Name
322
323
$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 = $_ }
338
350
}
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
349
363
}
350
364
}
351
- Retry { Add-AzStorageAccountNetworkRule - ResourceGroupName $ResourceGroupName - Name $account.Name - IPAddressOrRange $clientIp | Out-Null }
352
- $appliedRule = $true
353
365
}
366
+ Retry { Add-AzStorageAccountNetworkRule - ResourceGroupName $ResourceGroupName - Name $account.Name - IPAddressOrRange $clientIp | Out-Null }
367
+ $appliedRule = $true
354
368
}
355
369
}
370
+
356
371
if ($appliedRule ) {
357
372
Write-Host " Sleeping for 15 seconds to allow network rules to take effect"
358
373
Start-Sleep 15
0 commit comments