Corrección del acceso de lectura anónimo a datos de blobs (implementaciones clásicas)

Azure Blob Storage admite el acceso de lectura anónimo opcional a contenedores y blobs. Sin embargo, el acceso anónimo puede suponer un riesgo de seguridad. Para mayor seguridad, se recomienda deshabilitar el acceso anónimo. No permitir el acceso anónimo ayuda a evitar las vulneraciones de datos que se producen debido a los accesos anónimos no deseados.

De manera predeterminada, siempre se prohíbe el acceso anónimo a los datos del blob. Sin embargo, la configuración predeterminada de una cuenta de almacenamiento clásica permite a un usuario con los permisos adecuados configurar el acceso anónimo a los contenedores y blobs en una cuenta de almacenamiento. Para evitar el acceso anónimo a una cuenta de almacenamiento clásica, debe configurar cada contenedor de la cuenta para bloquear el acceso anónimo.

Si la cuenta de almacenamiento usa el modelo de implementación clásica, se recomienda migrar al modelo de implementación de Azure Resource Manager lo antes posible. Después de migrar la cuenta, puede configurarla para no permitir el acceso anónimo en el nivel de cuenta. Para obtener información sobre cómo denegar el acceso anónimo en una cuenta de Azure Resource Manager, consulte Corrección del acceso de lectura anónimo a datos de blobs (implementaciones de Azure Resource Manager).

Si no puede migrar las cuentas de almacenamiento clásicas en este momento, debe corregir el acceso anónimo a esas cuentas estableciendo todos los contenedores como privados. En este artículo se describe cómo corregir el acceso a los contenedores en una cuenta de almacenamiento clásica.

Las cuentas de Azure Storage que usan el modelo de implementación clásica se retirarán el 31 de agosto de 2024. Para más información, consulte Las cuentas de almacenamiento clásicas de Azure se retirarán el 31 de agosto de 2024.

Advertencia

El acceso anónimo presenta un riesgo de seguridad. Se recomienda realizar las acciones descritas en la sección siguiente para corregir el acceso anónimo a todas las cuentas de almacenamiento clásicas, a menos que el escenario requiera específicamente acceso anónimo.

Bloqueo del acceso anónimo a contenedores

Para corregir el acceso anónimo de una cuenta de almacenamiento clásica, establezca el nivel de acceso anónimo para cada contenedor de la cuenta en Privado.

Para corregir el acceso anónimo en uno o varios contenedores en Azure Portal, siga estos pasos:

  1. Vaya a la información general de su cuenta de almacenamiento en Azure Portal.

  2. En Almacenamiento de datos en la hoja de menú, seleccione Contenedores de blob.

  3. Seleccione los contenedores para los que desee establecer el nivel de acceso anónimo.

  4. Use el botón Cambiar nivel de acceso para mostrar la configuración de acceso.

  5. Seleccione Privado (sin acceso anónimo) en la lista desplegable Nivel de acceso anónimo y haga clic en el botón Aceptar para aplicar el cambio a los contenedores seleccionados.

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

Comprobación de la configuración del acceso anónimo de un conjunto de contenedores

Para comprobar qué contenedores de una o varias cuentas de almacenamiento están configurados para el acceso anónimo, puede enumerar los contenedores y consultar la configuración del acceso anónimo. Este enfoque es una opción práctica cuando una cuenta de almacenamiento no contiene un elevado número de contenedores, o bien cuando se comprueba la configuración de un pequeño número de cuentas de almacenamiento. Sin embargo, el rendimiento puede empeorar si intenta enumerar un elevado número de contenedores.

En el ejemplo siguiente se usa PowerShell para obtener la configuración del acceso anónimo de todos los contenedores de una cuenta de almacenamiento. No olvide reemplazar los valores del marcador de posición entre corchetes con sus propios valores:

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

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

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

Script de ejemplo para la corrección masiva

El siguiente script de PowerShell de ejemplo se ejecuta en todas las cuentas de almacenamiento clásicas de una suscripción y establece la configuración de acceso anónimo para los contenedores de esas cuentas en Privado.

Precaución

La ejecución de este script en cuentas de almacenamiento con un gran número de contenedores puede requerir recursos significativos y tardar mucho tiempo. Si tiene una cuenta de almacenamiento con un gran número de contenedores, es posible que quiera diseñar un enfoque diferente para corregir el acceso anónimo.

# 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"

Consulte también