Administración de claves de cuenta de almacenamiento con Key Vault y Azure PowerShell
Importante
Es recomendable usar la integración de Azure Storage con Azure Active Directory (Azure AD), el servicio de administración de acceso y de identidades basado en la nube de Microsoft. La integración de Azure AD 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). Azure AD 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 Azure AD 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 la solución siguiente solo cuando no sea posible la autenticación de Azure AD.
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
En este artículo se usa el módulo Az de PowerShell, que es el módulo de PowerShell que se recomienda para interactuar con Azure. Para empezar a trabajar con el módulo Az de PowerShell, consulte Instalación de Azure PowerShell. 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 Azure AD 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 Azure AD. Key Vault está registrado con el mismo identificador de aplicación en cada nube de Azure.
| Inquilinos | Nube | Identificador de aplicación |
|---|---|---|
| Azure AD | Azure Government | 7e7c393b-45d0-48b1-a35e-2905ddf8183c |
| Azure AD | Pública de Azure | cfa8b339-82a2-471a-a3c9-0fc0be7a4093 |
| Otros | Any | cfa8b339-82a2-471a-a3c9-0fc0be7a4093 |
Prerrequisitos
Para completar esta guía, antes debe completar los pasos siguientes:
- Instale el módulo de Azure PowerShell.
- Creación de un Almacén de claves
- Creación de una cuenta de almacenamiento de Azure. El nombre de la cuenta de almacenamiento solo debe contener letras minúsculas y números. El nombre debe tener entre 3 y 24 caracteres.
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 su identificador de usuario y el contexto de su 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
Tenga en cuenta que 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 tres 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. Solo se usa una de las claves para emitir tokens de SAS en cualquier momento. Esta es la clave activa.
$regenPeriod = [System.Timespan]::FromDays(3)
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 : 3.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.
- Crear un token de firma de acceso compartido de cuenta para los servicios Blob, File, Table y Queue. El token se crea para los tipos de recurso Servicio, Contenedor y Objeto. El token se crea con todos los permisos, a través de https, y con las fechas de inicio y finalización especificadas.
- 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
accounty 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 <YourStorageAccountName> y <YourKeyVaultName>.
También usaremos el cmdlet New-AzStorageContext de Azure PowerShell para obtener el contexto de su cuenta de Azure Storage.
$storageAccountName = <YourStorageAccountName>
$keyVaultName = <YourKeyVaultName>
$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -Protocol Https -StorageAccountKey Key1 #(or "Primary" for Classic Storage Account)
Creación de un token de firma de acceso compartido
Cree una definición de firma de acceso compartido mediante el cmdlet New-AzStorageAccountSASToken de Azure PowerShell.
$start = [System.DateTime]::Now.AddDays(-1)
$end = [System.DateTime]::Now.AddMonths(1)
$sasToken = New-AzStorageAccountSasToken -Service blob,file,Table,Queue -ResourceType Service,Container,Object -Permission "racwdlup" -Protocol HttpsOnly -StartTime $start -ExpiryTime $end -Context $storageContext
El valor de $sasToken tendrá un aspecto similar al siguiente.
?sv=2018-11-09&sig=5GWqHFkEOtM7W9alOgoXSCOJO%2B55qJr4J7tHQjCId9S%3D&spr=https&st=2019-09-18T18%3A25%3A00Z&se=2019-10-19T18%3A25%3A00Z&srt=sco&ss=bfqt&sp=racupwdl
Generación de una definición de firma de acceso compartido
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 $sasToken -SasType 'account' -ValidityPeriod ([System.Timespan]::FromDays(30))
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.
$secret = Get-AzKeyVaultSecret -VaultName <YourKeyVaultName> -Name <SecretName>
$ssPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secret.SecretValue)
try {
$secretValueText = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($ssPtr)
} finally {
[System.Runtime.InteropServices.Marshal]::ZeroFreeBSTR($ssPtr)
}
Write-Output $secretValueText
La salida de este comando mostrará la cadena de definición de SAS.