Administración de claves de cuenta de almacenamiento con Key Vault y Azure PowerShell (heredado)

Importante

Las claves de la cuenta de almacenamiento administradas por Key Vault (heredadas) se admiten tal cual, sin más actualizaciones planeadas. Solo se admiten SAS de cuenta con una versión del servicio de almacenamiento firmado para las definiciones de SAS que no sea posterior al 28 de marzo de 2018.

Importante

Es recomendable usar la integración de Azure Storage con Microsoft Entra ID, el servicio de administración de acceso y de identidades basado en la nube de Microsoft. La integración de Microsoft Entra está disponible para los Blobs y las colas de Azure y proporciona acceso basado en tokens de OAuth2 a Azure Storage (al igual que Azure Key Vault). Microsoft Entra ID le permite autenticar la aplicación cliente mediante una identidad de aplicación o usuario, en lugar de las credenciales de cuenta de almacenamiento. Puede usar una identidad administrada de Microsoft Entra cuando realice la ejecución en Azure. Las identidades administradas eliminan la necesidad de autenticación del cliente y de almacenar las credenciales en la aplicación o con ella. Use esta solución solo cuando no sea posible la autenticación de Microsoft Entra.

Una cuenta de Azure Storage usa credenciales que constan de un nombre de cuenta y una clave. La clave se genera automáticamente y actúa como una contraseña y no como una clave criptográfica. Key Vault, para administrar las claves de la cuenta de almacenamiento, las regenera periódicamente en una cuenta de almacenamiento y proporciona tokens de firma de acceso compartido para el acceso delegado a los recursos de la cuenta de almacenamiento.

Puede usar la característica de clave de cuenta de almacenamiento administrada de Key Vault para mostrar (sincronizar) las claves con una cuenta de almacenamiento de Azure y volver a generar (girar) las claves periódicamente. Puede administrar claves para las cuentas de almacenamiento y las cuentas de almacenamiento clásicas.

Cuando use la característica de clave de cuenta de almacenamiento administrada, tenga en cuenta los puntos siguientes:

  • Los valores de clave nunca se devuelven como respuesta a un autor de la llamada.
  • Solo Key Vault debe administrar las claves de cuenta de almacenamiento. No administre las claves por su cuenta y evite interferir en los procesos de Key Vault.
  • Solo un único objeto de Key Vault debe administrar las claves de cuenta de almacenamiento. No permita la administración de claves desde varios objetos.
  • Regenere las claves solo con Key Vault. No regenere manualmente las claves de cuenta de almacenamiento.

Importante

La regeneración de la clave directamente en la cuenta de almacenamiento interrumpe la configuración de la cuenta de almacenamiento administrada y puede invalidar los tokens de SAS en uso y provocar una interrupción.

Nota:

Se recomienda usar el módulo Azure Az de PowerShell para interactuar con Azure. Consulte Instalación de Azure PowerShell para empezar. Para más información sobre cómo migrar al módulo Az de PowerShell, consulte Migración de Azure PowerShell de AzureRM a Az.

Id. de aplicación de la entidad de servicio

Un inquilino de Microsoft Entra proporciona a cada aplicación registrada una entidad de servicio. La entidad de servicio se usa como identificador de aplicación, que se utiliza durante la configuración de la autorización para acceder a otros recursos de Azure mediante RBAC de Azure.

Key Vault es una aplicación de Microsoft que previamente se ha registrado en todos los inquilinos de Microsoft Entra. Key Vault está registrado con el mismo identificador de aplicación en cada nube de Azure.

Inquilinos Nube Identificador de aplicación
Microsoft Entra ID Azure Government 7e7c393b-45d0-48b1-a35e-2905ddf8183c
Microsoft Entra ID Pública de Azure cfa8b339-82a2-471a-a3c9-0fc0be7a4093
Otros Any cfa8b339-82a2-471a-a3c9-0fc0be7a4093

Requisitos previos

Para completar esta guía, antes debe completar los pasos siguientes:

Administración de las claves de cuenta de almacenamiento

Conexión a la cuenta de Azure

Autentique la sesión de PowerShell mediante el cmdlet Connect-AzAccount.

Connect-AzAccount

Si tiene varias suscripciones de Azure, puede enumerarlas con el cmdlet Get-AzSubscription y especificar la suscripción que desea usar con el cmdlet Set-AzContext.

Set-AzContext -SubscriptionId <subscriptionId>

Configuración de variables

En primer lugar, establezca las variables que usarán los cmdlets de PowerShell en los pasos siguientes. Asegúrese de actualizar los marcadores de posición "YourResourceGroupName", "YourStorageAccountName" y "YourKeyVaultName", y establezca $keyVaultSpAppId en cfa8b339-82a2-471a-a3c9-0fc0be7a4093 (como se especificó anteriormente en Id. de aplicación de la entidad de servicio).

También usaremos los cmdlets Get-AzContext y Get-AzStorageAccount de Azure PowerShell para obtener el identificador de usuario y el contexto de la cuenta de Azure Storage.

$resourceGroupName = <YourResourceGroupName>
$storageAccountName = <YourStorageAccountName>
$keyVaultName = <YourKeyVaultName>
$keyVaultSpAppId = "cfa8b339-82a2-471a-a3c9-0fc0be7a4093"
$storageAccountKey = "key1" #(key1 or key2 are allowed)

# Get your User Id
$userId = (Get-AzContext).Account.Id

# Get a reference to your Azure storage account
$storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -StorageAccountName $storageAccountName

Nota:

Para la cuenta de almacenamiento clásica, use "primary" y "secondary" para $storageAccountKey
Use "Get-AzResource -Name 'ClassicStorageAccountName' -ResourceGroupName $resourceGroupName" en lugar de "Get-AzStorageAccount "para la cuenta de almacenamiento clásica

Proporcionar a Key Vault acceso a la cuenta de almacenamiento

Para que Key Vault tenga acceso y pueda administrar las claves de cuenta de almacenamiento, debe autorizar su acceso a la cuenta de almacenamiento. La aplicación Key Vault necesita permisos para mostrar y regenerar las claves de la cuenta de almacenamiento. Estos permisos se habilitan a través del rol integrado de Azure Rol de servicio de operador de claves de cuentas de almacenamiento.

Para asignar este rol a la entidad de servicio de Key Vault, que limita el ámbito a la cuenta de almacenamiento, use el cmdlet New-AzRoleAssignment de Azure PowerShell.

# Assign Azure role "Storage Account Key Operator Service Role" to Key Vault, limiting the access scope to your storage account. For a classic storage account, use "Classic Storage Account Key Operator Service Role."
New-AzRoleAssignment -ApplicationId $keyVaultSpAppId -RoleDefinitionName 'Storage Account Key Operator Service Role' -Scope $storageAccount.Id

Tras la correcta asignación del rol, debería ver una salida similar a la del siguiente ejemplo:

RoleAssignmentId   : /subscriptions/03f0blll-ce69-483a-a092-d06ea46dfb8z/resourceGroups/rgContoso/providers/Microsoft.Storage/storageAccounts/sacontoso/providers/Microsoft.Authorization/roleAssignments/189cblll-12fb-406e-8699-4eef8b2b9ecz
Scope              : /subscriptions/03f0blll-ce69-483a-a092-d06ea46dfb8z/resourceGroups/rgContoso/providers/Microsoft.Storage/storageAccounts/sacontoso
DisplayName        : Azure Key Vault
SignInName         :
RoleDefinitionName : storage account Key Operator Service Role
RoleDefinitionId   : 81a9662b-bebf-436f-a333-f67b29880f12
ObjectId           : 93c27d83-f79b-4cb2-8dd4-4aa716542e74
ObjectType         : ServicePrincipal
CanDelegate        : False

Si Key Vault ya se ha agregado al rol en la cuenta de almacenamiento, recibirá un error "La asignación de roles ya existe.". También puede comprobar la asignación de roles con la página "Control de acceso (IAM)" de la cuenta de almacenamiento en Azure Portal.

Concesión del permiso de cuenta de usuario a las cuentas de almacenamiento administradas

Use el cmdlet Set-AzKeyVaultAccessPolicy de Azure PowerShell para actualizar la directiva de acceso de Key Vault y conceder permisos de cuenta de almacenamiento a su cuenta de usuario.

# Give your user principal access to all storage account permissions, on your Key Vault instance

Set-AzKeyVaultAccessPolicy -VaultName $keyVaultName -UserPrincipalName $userId -PermissionsToStorage get, list, delete, set, update, regeneratekey, getsas, listsas, deletesas, setsas, recover, backup, restore, purge

Los permisos para las cuentas de almacenamiento no están disponibles en la página "Directivas de acceso" de la cuenta de almacenamiento en Azure Portal.

Adición de una cuenta de almacenamiento administrada a la instancia de Key Vault

Use el cmdlet Add-AzKeyVaultManagedStorageAccount de Azure PowerShell para crear una cuenta de almacenamiento administrada en la instancia de Key Vault. El modificador -DisableAutoRegenerateKey especifica que NO se deben regenerar las claves de la cuenta de almacenamiento.

# Add your storage account to your Key Vault's managed storage accounts

Add-AzKeyVaultManagedStorageAccount -VaultName $keyVaultName -AccountName $storageAccountName -AccountResourceId $storageAccount.Id -ActiveKeyName $storageAccountKey -DisableAutoRegenerateKey

Tras la correcta incorporación de la cuenta de almacenamiento sin regeneración de claves, debería ver una salida similar a la del siguiente ejemplo:

Id                  : https://kvcontoso.vault.azure.net:443/storage/sacontoso
Vault Name          : kvcontoso
AccountName         : sacontoso
Account Resource Id : /subscriptions/03f0blll-ce69-483a-a092-d06ea46dfb8z/resourceGroups/rgContoso/providers/Microsoft.Storage/storageAccounts/sacontoso
Active Key Name     : key1
Auto Regenerate Key : False
Regeneration Period : 90.00:00:00
Enabled             : True
Created             : 11/19/2018 11:54:47 PM
Updated             : 11/19/2018 11:54:47 PM
Tags                :

Habilitación de la regeneración de clave

Si desea que Key Vault regenere las claves de cuenta de almacenamiento periódicamente, puede usar el cmdlet Add-AzKeyVaultManagedStorageAccount de Azure PowerShell para establecer un período de regeneración. En el ejemplo siguiente se establece un período de regeneración de 30 días. Cuando es el momento de girar, Key Vault regenera la clave que no está activa y, a continuación, establece la clave recién creada como activa. La clave usada para emitir tokens de SAS es la clave activa.

$regenPeriod = [System.Timespan]::FromDays(30)

Add-AzKeyVaultManagedStorageAccount -VaultName $keyVaultName -AccountName $storageAccountName -AccountResourceId $storageAccount.Id -ActiveKeyName $storageAccountKey -RegenerationPeriod $regenPeriod

Tras la correcta incorporación de la cuenta de almacenamiento con regeneración de claves, debería ver una salida similar a la del siguiente ejemplo:

Id                  : https://kvcontoso.vault.azure.net:443/storage/sacontoso
Vault Name          : kvcontoso
AccountName         : sacontoso
Account Resource Id : /subscriptions/03f0blll-ce69-483a-a092-d06ea46dfb8z/resourceGroups/rgContoso/providers/Microsoft.Storage/storageAccounts/sacontoso
Active Key Name     : key1
Auto Regenerate Key : True
Regeneration Period : 30.00:00:00
Enabled             : True
Created             : 11/19/2018 11:54:47 PM
Updated             : 11/19/2018 11:54:47 PM
Tags                :

Tokens de firma de acceso compartido

También puede pedir a Key Vault que genere tokens de firma de acceso compartido. Una firma de acceso compartido ofrece acceso delegado a recursos en la cuenta de almacenamiento. Puede conceder a los clientes acceso a los recursos de su cuenta de almacenamiento sin compartir las claves de la cuenta. Una firma de acceso compartido le proporciona una forma segura de compartir los recursos de almacenamiento sin poner en peligro las claves de cuenta.

Los comandos de esta sección completan las acciones siguientes:

  • Establecer una definición de firma de acceso compartido de cuenta.
  • Establecer una definición de firma de acceso compartido de almacenamiento administrado de Key Vault en el almacén. La definición tiene el URI de plantilla del token de firma de acceso compartido que se creó. La definición tiene el tipo de firma de acceso compartido account y es válido durante N días.
  • Compruebe que la firma de acceso compartido se haya guardado en el almacén de claves como secreto.

Configuración de variables

En primer lugar, establezca las variables que usarán los cmdlets de PowerShell en los pasos siguientes. Asegúrese de actualizar los marcadores de posición <NombreDeLaCuentaDeAlmacenamiento> y <NombreDelAlmacénDeClaves>.

$storageAccountName = <YourStorageAccountName>
$keyVaultName = <YourKeyVaultName>

Definir una plantilla de definición de firma de acceso compartido

Key Vault usa la plantilla de definición de SAS a fin de generar tokens para las aplicaciones cliente.

Ejemplo de plantilla de definición de SAS:

$sasTemplate="sv=2018-03-28&ss=bfqt&srt=sco&sp=rw&spr=https"

Parámetros SAS de cuenta necesarios en la plantilla de definición de SAS para Key Vault

Parámetro de consulta SAS Descripción
SignedVersion (sv) Necesario. Especifica la versión del servicio de almacenamiento firmado que se va a usar para autorizar las solicitudes realizadas con esta SAS de cuenta. Debe establecerse en la versión del 5 de abril de 2015 o una posterior. Key Vault no admite versiones posteriores a la del 28 de marzo de 2018
SignedServices (ss) Necesario. Especifica los servicios firmados accesibles con la SAS de la cuenta. Los valores posibles son:

- Blob (b)
- Queue (q)
- Table (t)
- File (f)

Puede combinar valores para proporcionar acceso a más de un servicio. Por ejemplo, ss=bf especifica el acceso a los puntos de conexión de Blob y File.
SignedResourceTypes (srt) Necesario. Especifica los tipos de recursos firmados a los que se puede acceder con la SAS de cuenta.

- Servicio (s): acceso a las API de nivel de servicio (por ejemplo, Get/Set Service Properties, Get Service Stats, List Containers/Queues/Tables/Shares)
- Contenedor (c): acceso a las API de nivel de contenedor (por ejemplo, Create/Delete Container, Create/Delete Queue, Create/Delete Table, Create/Delete Share, List Blobs/Files and Directories)
- Objeto (o): acceso a las API de nivel de objeto para blobs, mensajes en cola, entidades de tabla y archivos (por ejemplo, Put Blob, Query Entity, Get Messages, Create File, etc.)

Puede combinar valores para proporcionar acceso a más de un tipo de recurso. Por ejemplo, srt=sc especifica el acceso a los recursos de servicio y contenedor.
SignedPermission (sp) Necesario. Especifica los permisos firmados para la SAS de cuenta. Los permisos solo son válidos si coinciden con el tipo de recurso firmado especificado; de lo contrario, se ignoran.

- Lectura (r): válido para todos los tipos de recursos firmados (Servicio, Contenedor y Objeto). Permite permisos de lectura para el tipo de recurso especificado.
- Escritura (w): válido para todos los tipos de recursos firmados (Servicio, Contenedor y Objeto). Admite permisos de escritura para el tipo de recurso especificado.
- Eliminación (d): válido para los tipos de recursos de contenedor y objeto, excepto para los mensajes de la cola.
- Eliminación permanente (y): válido solo para el tipo de recurso de objeto de Blob.
- Lista (l): válido solo para los tipos de recursos de servicio y contenedor.
- Adición (a): válido solo para los tipos de recursos de objeto siguientes: mensajes de cola, entidades de tabla y blobs en anexos.
- Creación (c): válido solo para los tipos de recursos de objeto siguientes: blobs y archivos. Los usuarios pueden crear blobs o archivos, pero no pueden sobrescribir los archivos o blobs existentes.
- Actualización (u): válido solo para los tipos de recursos de objeto siguientes: mensajes de cola y entidades de tabla.
- Proceso (p): válido solo para los tipos de recursos de objeto siguientes: mensajes de cola.
- Etiqueta (t): válido solo para el tipo de recurso de objeto siguiente: blobs. Permite operaciones de etiquetas de blob.
- Filtro (f): válido solo para el tipo de recurso de objeto siguiente: blob. Permite el filtrado por etiqueta de blob.
- Establecimiento de directiva de inmutabilidad (i): válido solo para el tipo de recurso de objeto siguiente: blob. Permite establecer o eliminar la directiva de inmutabilidad y la suspensión legal en un blob.
SignedProtocol (spr) Opcional. Especifica el protocolo que se permite para una solicitud realizada con la SAS de cuenta. Los valores posibles son tanto HTTPS como HTTP (https,http) o solo HTTPS (https). El valor predeterminado es https,http.

HTTP solo no es un valor permitido.

Para obtener más información sobre la SAS de cuenta, consulte Creación de una SAS de cuenta.

Nota:

Key Vault omite parámetros de duración como "Expiración firmada", "Inicio firmado" y parámetros introducidos después de la versión del 28 de marzo de 2018

Establecimiento de la definición de firma de acceso compartido en Key Vault

Use el cmdlet Set-AzKeyVaultManagedStorageSasDefinition de Azure PowerShell para crear una definición de firma de acceso compartido. Puede proporcionar el nombre que elija al parámetro -Name.

Set-AzKeyVaultManagedStorageSasDefinition -AccountName $storageAccountName -VaultName $keyVaultName -Name <YourSASDefinitionName> -TemplateUri $sasTemplate -SasType 'account' -ValidityPeriod ([System.Timespan]::FromDays(1))

Comprobación de la definición de firma de acceso compartido

Puede comprobar que la definición de la firma de acceso compartido se ha almacenado en el almacén de claves mediante el cmdlet Get-AzKeyVaultSecret de Azure PowerShell.

En primer lugar, busque la definición de la firma de acceso compartido en el almacén de claves.

Get-AzKeyVaultSecret -VaultName <YourKeyVaultName>

El secreto correspondiente a la definición de SAS tendrá estas propiedades:

Vault Name   : <YourKeyVaultName>
Name         : <SecretName>
...
Content Type : application/vnd.ms-sastoken-storage
Tags         :

Ahora puede usar el cmdlet Get-AzKeyVaultSecret con los parámetros VaultName y Name para ver el contenido del secreto.

$secretValueText = Get-AzKeyVaultSecret -VaultName <YourKeyVaultName> -Name <SecretName> -AsPlainText
Write-Output $secretValueText

La salida de este comando mostrará la cadena de definición de SAS.

Pasos siguientes