Creación de una aplicación administrada de Azure que implementa la cuenta de almacenamiento cifrada con una clave administrada por el cliente
En este artículo se describe cómo crear una aplicación administrada de Azure que implemente una cuenta de almacenamiento cifrada con una clave administrada por el cliente. La cuenta de almacenamiento, Cosmos DB y Azure Database for Postgres admiten el cifrado de datos en reposo mediante claves administradas por el cliente o claves administradas por Microsoft. Puede usar su propia clave de cifrado para proteger los datos de la cuenta de almacenamiento. Cuando se especifica una clave administrada por el cliente, esa clave se usa para proteger y controlar el acceso a la clave que cifra los datos. Las claves administradas por el cliente ofrecen más flexibilidad para administrar controles de acceso.
Requisitos previos
- Una cuenta de Azure con una suscripción activa y permisos para recursos de Microsoft Entra, como usuarios, grupos o entidades de servicio. Antes de comenzar, si no tiene una cuenta, cree una gratuita.
- Visual Studio Code con la extensión Herramientas de Azure Resource Manager más reciente. En el caso de los archivos de Bicep, instale la extensión de Bicep para Visual Studio Code.
- Instale la versión más reciente de Azure PowerShell o la CLI de Azure.
- Familiarícese con cómo crear e implementar una definición de catálogo de servicios.
Identidades administradas
La configuración de una clave administrada por el cliente para una cuenta de almacenamiento implementada por la aplicación administrada como un recurso dentro del grupo de recursos administrados requiere una identidad administrada asignada por el usuario. Esta identidad administrada asignada por el usuario se puede usar para conceder a la aplicación administrada acceso a otros recursos existentes. Para aprender a configurar la aplicación administrada con una identidad administrada asignada por el usuario, vaya a Aplicación administrada de Azure con identidad administrada.
La aplicación puede tener dos tipos de identidades:
- Una identidad administrada asignada por el sistema está asignada a la aplicación y se elimina si se elimina la aplicación. Una aplicación solo puede tener una identidad administrada asignada por el sistema.
- Una identidad administrada asignada por el usuario es un recurso de Azure independiente que puede asignarse a la aplicación. Una aplicación puede tener varias identidades administradas asignadas por el usuario.
Para implementar una cuenta de almacenamiento en el grupo de recursos administrados de la aplicación administrada que se cifra con claves de cliente desde el almacén de claves existente, se requiere más configuración. La identidad administrada configurada con su aplicación administrada necesita el control de acceso basado en roles Operador de identidad administrada de Azure integrado sobre la identidad administrada que tiene acceso al almacén de claves. Para más detalles, vaya al rol de Operador de identidad administrada.
Creación de un almacén de claves con protección de purga
- Inicie sesión en Azure Portal.
- En el menú de Azure Portal o en la página principal, seleccione Crear un recurso.
- En el cuadro de búsqueda, escriba Key Vault.
- En la lista de resultados, seleccione Key Vault.
- En la sección Key Vault, seleccione Crear.
- En la sección Crear almacén de claves, proporcione la siguiente información:
- Suscripción: seleccione su suscripción.
- Grupo de recursos: seleccione Crear nuevo y escriba un nombre como demo-cmek-rg.
- Nombre: se requiere un nombre único, como demo-keyvault-cmek.
- Región: seleccione una ubicación, como Este de EE. UU.
- Plan de tarifa: seleccione Estándar en la lista desplegable.
- Protección de purga: seleccione Habilitar protección de purga.
- Seleccione Siguiente y vaya a la pestaña Directiva de acceso.
- Configuración de acceso: seleccione Control de acceso basado en rol de Azure.
- Acepte los valores predeterminados del resto de opciones.
- Seleccione Revisar + crear.
- Confirme que la configuración es correcta y seleccione Crear.
Una vez que la implementación se haya realizado correctamente, seleccione Ir al recurso. En la pestaña Información general , tome nota de las siguientes propiedades:
- Nombre del almacén: en el ejemplo, el nombre del almacén es demo-keyvault-cmek. Este nombre se usará en otros pasos.
- URI del almacén: en el ejemplo, el URI del almacén es
https://demo-keyvault-cmek.vault.azure.net/
.
Crear una identidad administrada asignada por el usuario
Para crear una identidad administrada asignada por el usuario, la cuenta requiere la asignación del rol Colaborador de identidades administradas.
- En el cuadro de búsqueda, escriba Identidades administradas.
- En Servicios, seleccione Identidades administradas.
- Seleccione Crear y escriba los valores siguientes en la pestaña Aspectos básicos:
- Suscripción: seleccione su suscripción.
- Grupo de recursos: seleccione el grupo de recursos demo-cmek-rg que creó en los pasos anteriores.
- Región: selecciona una región, como Este de EE. UU.
- Nombre: especifique el nombre de la identidad administrada asignada por el usuario, demokeyvaultmi.
- Seleccione Revisar + crear.
- Una vez que se muestre Validación superada, seleccione Crear.
Una vez que la implementación se haya realizado correctamente, seleccione Ir al recurso.
Crear asignaciones de roles
Debe crear dos asignaciones de roles para el almacén de claves. Para más detalles, consulte Asignar roles de Azure usando Azure Portal.
Concesión del permiso de clave en el almacén de claves a la identidad administrada
Cree una asignación de roles para la identidad administrada demokeyvaultmi del almacén de claves para encapsular y desencapsular claves.
- Vaya al almacén de claves demo-cmek-keyvault.
- Seleccione Access Control (IAM) .
- Seleccione Agregar>Agregar asignación de roles.
- Asigne el siguiente rol:
- Rol: Usuario de cifrado del servicio de cifrado del almacén de claves
- Asignar acceso a: Identidad administrada
- Miembro: demokeyvaultmi
- Seleccione Revisar y asignar para ver su configuración.
- Seleccione Revisar y asignar para crear la asignación del rol.
Creación de una asignación de rol para la cuenta
Cree otra asignación de rol para que la cuenta pueda crear una nueva clave en el almacén de claves.
- Asigne el siguiente rol:
- Rol: Agente criptográfico de Key Vault
- Asignar acceso a: Usuario, grupo o entidad de servicio
- Miembro: la cuenta de Microsoft Entra
- Seleccione Revisar y asignar para ver su configuración.
- Seleccione Revisar y asignar para crear la asignación del rol.
Puede verificar la asignación de roles del almacén de claves en Control de acceso (IAM)>Asignación de roles.
Crear una clave
Debe crear una clave que use el almacén de claves para cifrar una cuenta de almacenamiento.
- Vaya a su almacén de claves, demo-cmek-keyvault.
- Seleccione Claves.
- Seleccione Generar o importar.
- En la página Crear una clave, seleccione los siguientes valores:
- Opciones: Generar
- Nombre: demo-cmek-llave
- Acepte los valores predeterminados para las demás opciones.
- Seleccione Crear.
Anote el valor de la clave. Lo usará cuando implemente la aplicación administrada.
Creación de una identidad administrada asignada por el usuario para la aplicación administrada
Cree una identidad administrada asignada por el usuario para usarla como identidad administrada para la aplicación administrada.
- En el cuadro de búsqueda, escriba Identidades administradas.
- En Servicios, seleccione Identidades administradas.
- Seleccione Crear.
- Suscripción: seleccione su suscripción.
- Grupo de recursos: seleccione el grupo de recursos demo-cmek-rg.
- Región: selecciona una región, como Este de EE. UU.
- Nombre: especifique el nombre de la identidad administrada asignada por el usuario, demomanagedappmi.
- Seleccione Revisar + crear.
- Una vez que se muestre Validación superada, seleccione Crear.
Una vez que la implementación se haya realizado correctamente, seleccione Ir al recurso.
Asignación de permisos de rol a la identidad administrada
Asigne el rol Operador de identidad administrada a la identidad administrada en el ámbito de la identidad administrada asignada por el usuario denominada demokeyvaultmi.
- Vaya a la identidad administrada asignada por el usuario denominada demokeyvaultmi.
- Seleccione Control de acceso (IAM).
- Seleccione Agregar>Agregar asignación de roles para abrir la página Agregar asignación de roles.
- Asigne el siguiente rol.
- Rol: Operador de identidad administrada
- Asignar acceso a: Identidad administrada
- Miembro: demomanagedappmi
- Seleccione Revisar y asignar para ver su configuración.
- Seleccione Revisar y asignar para crear la asignación del rol.
Puede verificar la asignación de rol para demokeyvaultmi en Control de acceso (IAM)>Asignación de roles.
Plantilla de aplicación administrada de ejemplo
Cree una aplicación administrada que implemente una cuenta de almacenamiento en un grupo de recursos administrado y use una clave del almacén de claves existente para cifrar los datos de la cuenta de almacenamiento.
Para publicar una aplicación administrada en el catálogo de servicios, debe realizar las siguientes tareas:
- Cree el archivo creatUIDefinition.json desde el ejemplo de este artículo. La plantilla define los elementos de la interfaz de usuario del portal al implementar la aplicación administrada.
- Cree una plantilla de Azure Resource Manager denominada mainTemplate.json mediante la conversión del archivo Bicep de este artículo a JSON. La plantilla define los recursos que se implementarán con la aplicación administrada.
- Cree un paquete .zip que contenga los archivos JSON necesarios: createUiDefinition.json y mainTemplate.json.
- Implemente la definición de aplicación administrada para que esté disponible en el catálogo de servicios. Para más información, vaya a Inicio rápido: Creación y publicación de una definición de aplicación administrada por Azure.
Creación de una plantilla createUiDefinition.json
La plantilla siguiente crea una identidad administrada asignada por el usuario para la aplicación administrada. En este ejemplo, deshabilitamos la identidad administrada asignada por el sistema porque necesitamos que nuestra identidad administrada asignada por el usuario se configure de antemano con los permisos de Operador de identidad administrada sobre la identidad administrada del almacén de claves.
- Cree un nuevo archivo en Visual Studio Code llamado creatUIDefinition.json.
- Copie y pegue el código siguiente en el archivo.
- Guarde el archivo.
{
"$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
"handler": "Microsoft.Azure.CreateUIDef",
"version": "0.1.2-preview",
"parameters": {
"basics": [],
"steps": [
{
"name": "managedApplicationSetting",
"label": "Application Settings",
"subLabel": {
"preValidation": "Configure your application settings and Managed Identity for the application",
"postValidation": "Done"
},
"bladeTitle": "Application Settings - Config",
"elements": [
{
"name": "appIdentity",
"type": "Microsoft.ManagedIdentity.IdentitySelector",
"label": "Managed Identity Configuration for the Application (Needs Managed Identity Operator permissions over KV Managed Identity).",
"toolTip": {
"systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
"userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
},
"defaultValue": {
"systemAssignedIdentity": "Off"
},
"options": {
"hideSystemAssignedIdentity": true,
"hideUserAssignedIdentity": false,
"readOnlySystemAssignedIdentity": true
},
"visible": true
}
]
},
{
"name": "configuration",
"type": "Microsoft.Common.Section",
"label": "Configuration",
"elements": [
{
"name": "cmek",
"type": "Microsoft.Common.Section",
"label": "Customer Managed Encryption Key (CMEK)",
"elements": [
{
"name": "cmekEnable",
"type": "Microsoft.Common.CheckBox",
"label": "Enable CMEK",
"toolTip": "Enable to provide a CMEK",
"constraints": {
"required": false
}
},
{
"name": "cmekKeyVaultUrl",
"type": "Microsoft.Common.TextBox",
"label": "Key Vault URL",
"toolTip": "Specify the CMEK Key Vault URL",
"defaultValue": "",
"constraints": {
"required": "[steps('configuration').cmek.cmekEnable]",
"regex": ".*",
"validationMessage": "The value must not be empty."
},
"visible": "[steps('configuration').cmek.cmekEnable]"
},
{
"name": "cmekKeyName",
"type": "Microsoft.Common.TextBox",
"label": "Key Name",
"toolTip": "Specify the key name from your key vault.",
"defaultValue": "",
"constraints": {
"required": "[steps('configuration').cmek.cmekEnable]",
"regex": ".*",
"validationMessage": "The value must not be empty."
},
"visible": "[steps('configuration').cmek.cmekEnable]"
},
{
"name": "cmekKeyIdentity",
"type": "Microsoft.ManagedIdentity.IdentitySelector",
"label": "Managed Identity Configuration for Key Vault Access",
"toolTip": {
"systemAssignedIdentity": "Enable system assigned identity to grant the managed application access to additional existing resources.",
"userAssignedIdentity": "Add user assigned identities to grant the managed application access to additional existing resources."
},
"defaultValue": {
"systemAssignedIdentity": "Off"
},
"options": {
"hideSystemAssignedIdentity": true,
"hideUserAssignedIdentity": false,
"readOnlySystemAssignedIdentity": true
},
"visible": "[steps('configuration').cmek.cmekEnable]"
}
],
"visible": true
}
]
}
],
"outputs": {
"location": "[location()]",
"managedIdentity": "[steps('managedApplicationSetting').appIdentity]",
"cmekConfig": {
"kvUrl": "[if(empty(steps('configuration').cmek.cmekKeyVaultUrl), '', steps('configuration').cmek.cmekKeyVaultUrl)]",
"keyName": "[if(empty(steps('configuration').cmek.cmekKeyName), '', steps('configuration').cmek.cmekKeyName)]",
"identityId": "[if(empty(steps('configuration').cmek.cmekKeyIdentity), '', steps('configuration').cmek.cmekKeyIdentity)]"
}
}
}
}
Creación de una plantilla mainTemplate.json
El siguiente archivo Bicep es el código fuente de mainTemplate.json. La plantilla usa la identidad administrada asignada por el usuario definida en el archivo createUiDefinition.json .
- Cree un nuevo archivo en Visual Studio Code denominado mainTemplate.bicep.
- Copie y pegue el código siguiente en el archivo.
- Guarde el archivo.
param cmekConfig object = {
kvUrl: ''
keyName: ''
identityId: {}
}
@description('Specify the Azure region to place the application definition.')
param location string = resourceGroup().location
/////////////////////////////////
// Common Resources Configuration
/////////////////////////////////
var commonproperties = {
name: 'cmekdemo'
displayName: 'Common Resources'
storage: {
sku: 'Standard_LRS'
kind: 'StorageV2'
accessTier: 'Hot'
minimumTlsVersion: 'TLS1_2'
}
}
var identity = items(cmekConfig.identityId.userAssignedIdentities)[0].key
resource storage 'Microsoft.Storage/storageAccounts@2022-05-01' = {
name: '${commonproperties.name}${uniqueString(resourceGroup().id)}'
location: location
sku: {
name: commonproperties.storage.sku
}
kind: commonproperties.storage.kind
identity: cmekConfig.identityId
properties: {
accessTier: commonproperties.storage.accessTier
minimumTlsVersion: commonproperties.storage.minimumTlsVersion
encryption: {
identity: {
userAssignedIdentity: identity
}
services: {
blob: {
enabled: true
}
table: {
enabled: true
}
file: {
enabled: true
}
}
keySource: 'Microsoft.Keyvault'
keyvaultproperties: {
keyname: '${cmekConfig.keyName}'
keyvaulturi: '${cmekConfig.kvUrl}'
}
}
}
}
Use PowerShell o la CLI de Azure para compilar el archivo mainTemplate.json . Vaya al directorio donde guardó el archivo Bicep y ejecute el comando build
.
bicep build mainTemplate.bicep
Después de convertir el archivo Bicep en JSON, el archivo mainTemplate.json debe coincidir con el ejemplo siguiente. Puede tener valores diferentes en las propiedades de metadata
para version
y templateHash
.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"metadata": {
"_generator": {
"name": "bicep",
"version": "0.16.2.56959",
"templateHash": "1234567891234567890"
}
},
"parameters": {
"cmekConfig": {
"type": "object",
"defaultValue": {
"kvUrl": "",
"keyName": "",
"identityId": {}
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Specify the Azure region to place the application definition."
}
}
},
"variables": {
"commonproperties": {
"name": "cmekdemo",
"displayName": "Common Resources",
"storage": {
"sku": "Standard_LRS",
"kind": "StorageV2",
"accessTier": "Hot",
"minimumTlsVersion": "TLS1_2"
}
},
"identity": "[items(parameters('cmekConfig').identityId.userAssignedIdentities)[0].key]"
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2022-05-01",
"name": "[format('{0}{1}', variables('commonproperties').name, uniqueString(resourceGroup().id))]",
"location": "[parameters('location')]",
"sku": {
"name": "[variables('commonproperties').storage.sku]"
},
"kind": "[variables('commonproperties').storage.kind]",
"identity": "[parameters('cmekConfig').identityId]",
"properties": {
"accessTier": "[variables('commonproperties').storage.accessTier]",
"minimumTlsVersion": "[variables('commonproperties').storage.minimumTlsVersion]",
"encryption": {
"identity": {
"userAssignedIdentity": "[variables('identity')]"
},
"services": {
"blob": {
"enabled": true
},
"table": {
"enabled": true
},
"file": {
"enabled": true
}
},
"keySource": "Microsoft.Keyvault",
"keyvaultproperties": {
"keyname": "[format('{0}', parameters('cmekConfig').keyName)]",
"keyvaulturi": "[format('{0}', parameters('cmekConfig').kvUrl)]"
}
}
}
}
]
}
Implementación de la aplicación administrada
Una vez creada la definición del catálogo de servicios, puede implementar la aplicación administrada. Para más información, vaya a Inicio rápido: Implementación de una aplicación administrada de catálogo de servicios.
Durante la implementación, se usan las identidades administradas asignadas por el usuario, el nombre del almacén de claves, la dirección URL del almacén de claves, el nombre de clave del almacén de claves. El archivo createUiDefinition.json crea la interfaz usuario.
Por ejemplo, en una implementación del portal, en la pestaña Configuración de la aplicación, agregue demomanagedappmi.
En la pestaña Configuración, habilite la clave administrada por el cliente y agregue la identidad administrada asignada por el usuario para el almacén de claves, demokeyvaultmi. También se especifica la dirección URL del almacén de claves y el nombre de clave del almacén de claves que ha creado.
Comprobar la implementación
Una vez completada la implementación, puede comprobar la asignación de identidad de la aplicación administrada. La identidad administrada asignada por el usuario demomanagedappmi se asigna a la aplicación administrada.
- Vaya al grupo de recursos donde implementó la aplicación administrada.
- En Configuración>Identidad seleccione Asignada por el usuario (versión preliminar).
También puede comprobar la cuenta de almacenamiento que implementó la aplicación administrada. La pestaña Cifrado muestra la clave demo-cmek-key y el identificador de recurso de la identidad administrada asignada por el usuario.
- Vaya al grupo de recursos administrado donde se implementa la cuenta de almacenamiento de la aplicación administrada.
- En Seguridad y redes, seleccione Cifrado.
Pasos siguientes
- Para más información sobre el cifrado de almacenamiento, vaya a Claves administradas por el cliente para el cifrado de Azure Storage.
- Para más información sobre la identidad administrada asignada por el usuario con permisos para acceder a la clave en el almacén de claves, vaya a Configuración de claves administradas por el cliente en el mismo inquilino para una cuenta de almacenamiento existente.