Skip to content

Commit 06f9fac

Browse files
azure-sdkbenbp
andauthored
Sync eng/common directory with azure-sdk-tools for PR 8598 (#36419)
* Set storage account test resources to disable blob public access * Skip adding network rules to storage accounts that don't need them during cleanup * Add succeeded check to set pipeline subnet info step * Disable network firewall by default in resource creation/removal --------- Co-authored-by: Ben Broderick Phillips <[email protected]>
1 parent 7a642c8 commit 06f9fac

File tree

3 files changed

+47
-32
lines changed

3 files changed

+47
-32
lines changed

eng/common/TestResources/Remove-TestResources.ps1

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ $verifyDeleteScript = {
257257
# Get any resources that can be purged after the resource group is deleted coerced into a collection even if empty.
258258
$purgeableResources = Get-PurgeableGroupResources $ResourceGroupName
259259

260-
SetResourceNetworkAccessRules -ResourceGroupName $ResourceGroupName -AllowIpRanges $AllowIpRanges -Override -CI:$CI
260+
SetResourceNetworkAccessRules -ResourceGroupName $ResourceGroupName -AllowIpRanges $AllowIpRanges -SetFirewall -CI:$CI
261261
Remove-WormStorageAccounts -GroupPrefix $ResourceGroupName -CI:$CI
262262

263263
Log "Deleting resource group '$ResourceGroupName'"

eng/common/TestResources/build-test-resource-config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ parameters:
1616
steps:
1717
- task: AzurePowerShell@5
1818
displayName: Set Pipeline Subnet Info
19-
condition: ne(variables['Pool'], '')
19+
condition: and(succeeded(), ne(variables['Pool'], ''))
2020
env: ${{ parameters.EnvVars }}
2121
inputs:
2222
azureSubscription: azure-sdk-tests

eng/common/scripts/Helpers/Resource-Helpers.ps1

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)