Исправление анонимного доступа на чтение к данным BLOB-объектов (классические развертывания)

Хранилище BLOB-объектов Azure поддерживает необязательный анонимный доступ на чтение к контейнерам и BLOB-объектам. Однако анонимный доступ может представлять угрозу безопасности. Рекомендуется отключить анонимный доступ для оптимальной безопасности. Запрет анонимного доступа помогает предотвратить нарушения данных, вызванные нежелательным анонимным доступом.

По умолчанию анонимный доступ к данным BLOB-объектов всегда запрещен. Однако конфигурация по умолчанию для классической учетной записи хранения позволяет пользователю с соответствующими разрешениями настроить анонимный доступ к контейнерам и BLOB-объектам в учетной записи хранения. Чтобы предотвратить анонимный доступ к классической учетной записи хранения, необходимо настроить каждый контейнер в учетной записи, чтобы заблокировать анонимный доступ.

Если ваша учетная запись хранения использует классическую модель развертывания, рекомендуется перенести ее в модель развертывания Azure Resource Manager как можно скорее. После переноса учетной записи его можно настроить для запрета анонимного доступа на уровне учетной записи. Сведения о том, как запретить анонимный доступ для учетной записи Azure Resource Manager, см. в статье "Исправление анонимного доступа на чтение" к данным BLOB-объектов (развертывания Azure Resource Manager).

Если вы не можете перенести классические учетные записи хранения в настоящее время, необходимо исправить анонимный доступ к этим учетным записям, установив для всех контейнеров частный доступ. В этой статье описывается, как исправить доступ к контейнерам в классической учетной записи хранения.

служба хранилища Azure учетные записи, использующие классическую модель развертывания, будут прекращены 31 августа 2024 г. Дополнительные сведения см. в записи о прекращении использования классических учетных записей хранения Azure 31 августа 2024 г.

Предупреждение

Анонимный доступ представляет угрозу безопасности. Мы рекомендуем выполнить действия, описанные в следующем разделе, чтобы устранить анонимный доступ для всех классических учетных записей хранения, если в вашем сценарии не требуется анонимный доступ.

Блокировать анонимный доступ к контейнерам

Чтобы устранить анонимный доступ для классической учетной записи хранения, задайте для каждого контейнера в учетной записи значение Private.

Чтобы устранить анонимный доступ для одного или нескольких контейнеров в портал Azure, выполните следующие действия.

  1. Войдите в свою учетную запись хранения на портале Azure.

  2. В разделе Хранилище данных в колонке меню выберите Контейнеры BLOB-объектов.

  3. Выберите контейнеры, для которых необходимо задать уровень анонимного доступа.

  4. Нажмите кнопку "Изменить уровень доступа", чтобы отобразить параметры доступа.

  5. Выберите "Частный" (без анонимного доступа) в раскрывающемся списке "Анонимный доступ" и нажмите кнопку "ОК", чтобы применить изменение к выбранным контейнерам.

    Screenshot showing how to set anonymous access level in the portal.

Проверьте параметр анонимного доступа для набора контейнеров

Можно проверка, какие контейнеры в одной или нескольких учетных записях хранения настроены для анонимного доступа, перечислив контейнеры и проверка параметр анонимного доступа. Этот подход удобен, если учетная запись хранения не содержит большого количества контейнеров, а также при проверке параметра по небольшому числу учетных записей хранения. Однако при попытке перечисления большого количества контейнеров производительность может снизиться.

В следующем примере powerShell используется для получения параметра анонимного доступа для всех контейнеров в учетной записи хранения. Не забудьте заменить значения заполнителей в скобках собственными значениями.

$rgName = "<resource-group>"
$accountName = "<storage-account>"

$storageAccount = Get-AzStorageAccount -ResourceGroupName $rgName -Name $accountName
$ctx = $storageAccount.Context

Get-AzStorageContainer -Context $ctx | Select Name, PublicAccess

Пример скрипта для массового исправления

Следующий пример скрипта PowerShell выполняется для всех классических учетных записей хранения в подписке и задает параметр анонимного доступа для контейнеров в этих учетных записях частным.

Внимание

Выполнение этого сценария для учетных записей хранения с очень большим количеством контейнеров может потребовать значительных ресурсов и занять много времени. Если у вас есть учетная запись хранения с очень большим количеством контейнеров, вам может потребоваться разработать другой подход к устранению анонимного доступа.

# This script runs against all classic storage accounts in a single subscription
# and sets containers to private.

## IMPORTANT ##
# Running this script requires a connected account through the previous version 
# of Azure PowerShell. Use the following command to install:
# Install-Module Azure -scope CurrentUser -force
#
# Once installed, you will need to connect with:
# Add-AzureAccount
#
# This command may fail if there are modules installed that conflict with it.
# One known conflicting module is AzureRm.Accounts
# You will need to remove conflicting modules using the following:
# Remove-Module -name <name>
#
# The Azure PowerShell module assumes a current subscription when enumerating
# storage accounts.  You can set the current subscription with:
# Select-AzureSubscription -subscriptionId <subscriptionId>
#
# Get-AzureSubscription lists all subscriptions available to the Azure
# module. Not all subscriptions listed under your name in the portal may 
# appear here. If a subscription does not appear, you may need to use 
# the portal to remediate public access for those accounts.
# After you have selected your subscription, verify that it is current
# by running:
# Get-AzureSubscription -current
# 
# After the current subscription runs, you can run this script, change
# to another subscription after it completes, and then run again as necessary.
## END IMPORTANT##

# Standard operation will enumerate all accounts and check for containers with public 
# access, then allow the user to decide whether or not to disable the setting.  

# Run with BypassConfirmation=$true if you wish to remove permissions from all containers
# without individual confirmation

# Run with BypassArmUpgrade=$true if you wish to upgrade your storage account to use the 
# Azure Resource Manager deployment model. All accounts must be upgraded by 31 August 2024.

param(
    [boolean]$BypassConfirmation=$false,
    [boolean]$BypassArmUpgrade=$false
)

#Do not change this
$convertAccounts = $false

foreach($classicAccount in Get-AzureStorageAccount)
{
    $enumerate = $false

    if(!$BypassArmUpgrade)
    {
        write-host "Classic Storage Account" $classicAccount.storageAccountname "found"
        $confirmation = read-host "Convert to ARM? [y/n]:"
    }
    if(($confirmation -eq 'y') -and (!$BypassArmUpgrade))
    {
        write-host "Conversion selected"
        $convertAccounts = $true
    }
    else
    {
        write-host $classicAccount.StorageAccountName "conversion not selected.  Searching for public containers..."
        $enumerate = $true
    }

    if($enumerate)
    {
        foreach($container in get-azurestoragecontainer -context (get-azurestorageaccount -storageaccountname $classicAccount.StorageAccountName).context)
        {
            if($container.PublicAccess -eq 'Off')
            {
            } 
            else 
            {
                if(!$BypassConfirmation)
                {
                    $selection = read-host $container.Name $container.PublicAccess "access found, Make private?[y/n]:"
                }
                if(($selection -eq 'y') -or ($BypassConfirmation))
                {
                    write-host "Removing permissions from" $container.name "container on storage account" $classicaccount.StorageAccountName
                    try
                    {
                        Set-AzureStorageContainerAcl -context $classicAccount.context -name $container.name -Permission Off
                        write-host "Success!"
                    }
                    catch
                    {
                        $_
                    }
                }
                else
                {
                    write-host "Skipping..."
                }
            }
        }
    }
}
if($convertAccounts)
{
    write-host "Converting accounts to ARM is the preferred method, however there are some caveats."
    write-host "The preferred method would be to use the portal to perform the conversions and then "
    write-host "run the ARM script against them.  For more information on converting a classic account"
    write-host "to an ARM account, please see:"
    write-host "https://learn.microsoft.com/en-us/azure/virtual-machines/migration-classic-resource-manager-overview"
}
write-host "Script complete"

См. также