Cifrado de datos de implementación
Al ejecutar los recursos de Azure Container Instances (ACI) en la nube, el servicio ACI recopila y conserva los datos relacionados con los contenedores. ACI cifra automáticamente los datos cuando se guardan en la nube. Este cifrado protege los datos para cumplir los compromisos de cumplimiento y seguridad de la organización. ACI también ofrece la opción de cifrar estos datos con una clave propia, lo que proporciona un mayor control sobre los datos relacionados con las implementaciones de ACI.
Cifrado de datos de ACI
Los datos en ACI se cifran y descifran con el cifrado AES de 256 bits. Este está habilitado para todas las implementaciones de ACI y no es necesario modificar la implementación ni los contenedores para usarlo. Esta cobertura incluye los metadatos sobre la implementación, las variables de entorno, las claves que se pasan a los contenedores y los registros que se conservan después de detener los contenedores para que pueda verlos. El cifrado no afecta al rendimiento del grupo de contenedores y el cifrado no genera ningún costo adicional.
Puede confiar en las claves administradas por Microsoft para el cifrado de los datos de los contenedores, o puede administrar el cifrado con sus propias claves. En la siguiente tabla se comparan estas opciones:
Claves administradas por Microsoft | Claves administradas por el cliente | |
---|---|---|
Operaciones de cifrado y descifrado | Azure | Azure |
Almacenamiento de claves | Almacén de claves de Microsoft | Azure Key Vault |
Responsabilidad de la rotación de claves | Microsoft | Customer |
Acceso a la clave | Solo Microsoft | Microsoft, cliente |
En este artículo se examinan dos flujos para cifrar datos con una clave administrada por el cliente:
- Cifrado de datos con una clave administrada por el cliente almacenada en una instancia estándar de Azure Key Vault
- Cifre los datos con una clave administrada por el cliente almacenada en una instancia de Azure Key Vault protegida mediante la red con la opción Servicios de confianza habilitada.
Cifrado de datos con una clave administrada por el cliente almacenada en una instancia estándar de Azure Key Vault
Requisitos previos
Use el entorno de Bash en Azure Cloud Shell. Para más información, consulte Inicio rápido para Bash en Azure Cloud Shell.
Si prefiere ejecutar comandos de referencia de la CLI localmente, instale la CLI de Azure. Si utiliza Windows o macOS, considere la posibilidad de ejecutar la CLI de Azure en un contenedor Docker. Para más información, vea Ejecución de la CLI de Azure en un contenedor de Docker.
Si usa una instalación local, inicie sesión en la CLI de Azure mediante el comando az login. Siga los pasos que se muestran en el terminal para completar el proceso de autenticación. Para ver otras opciones de inicio de sesión, consulte Inicio de sesión con la CLI de Azure.
En caso de que se le solicite, instale las extensiones de la CLI de Azure la primera vez que la use. Para más información sobre las extensiones, consulte Uso de extensiones con la CLI de Azure.
Ejecute az version para buscar cuál es la versión y las bibliotecas dependientes que están instaladas. Para realizar la actualización a la versión más reciente, ejecute az upgrade.
Crear una entidad de servicio para ACI
El primer paso es asegurarse de que el inquilino de Azure tiene asignada una entidad de servicio para conceder permisos al servicio de Azure Container Instances.
Importante
Para ejecutar el siguiente comando y crear una entidad de servicio correctamente, confirme que tiene permisos para crear entidades de servicio en el inquilino.
El siguiente comando de la CLI configura la entidad de servicio de ACI en el entorno de Azure:
az ad sp create --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9
El resultado de la ejecución de este comando debe mostrar una entidad de servicio configurada con el valor "displayName": "servicio de instancia de contenedor de Azure".
En caso de que no pueda crear correctamente la entidad de servicio:
- confirme que tiene permisos para hacerlo en el inquilino
- compruebe si ya existe una entidad de servicio en el inquilino para la implementación en ACI. Para ello, ejecute
az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9
y use esa entidad de servicio en su lugar.
Creación de un recurso de Key Vault
Cree una instancia de Azure Key Vault mediante Azure Portal, la CLI de Azure o Azure PowerShell.
En el caso de las propiedades del almacén de claves, siga estas instrucciones:
- Nombre: se requiere un nombre único.
- Suscripción: Elija una suscripción.
- En Grupo de recursos, seleccione un grupo existente o cree uno y escriba un nombre para el grupo de recursos.
- En el menú desplegable Ubicación elija una ubicación.
- Puede dejar los valores predeterminados de las demás opciones o elegir otros en función de los requisitos adicionales.
Importante
Al usar claves administradas por el cliente para cifrar una plantilla de implementación de ACI, se recomienda establecer las dos propiedades siguientes en el almacén de claves, Eliminación temporal y No purgar. Estas propiedades no están habilitadas de forma predeterminada, pero se pueden habilitar mediante PowerShell o la CLI de Azure tanto en un almacén de claves nuevo como en uno existente.
Generar una nueva clave
Una vez creado el almacén de claves, navegue hasta el recurso en Azure Portal. En el menú de navegación izquierdo de la hoja de recursos, en Configuración, seleccione Claves. En la vista "Claves", seleccione "Generar/importar" para generar una nueva clave. Use cualquier nombre único para esta clave y establezca cualquier otra preferencia en función de sus necesidades.
Establecer la directiva de acceso
Cree una nueva directiva de acceso para permitir que el servicio ACI tenga acceso a la clave.
- Una vez que se genere la clave, en la hoja de recursos del almacén de claves, en Configuración, seleccione Directivas de acceso.
- En la página "Directivas de acceso" del almacén de claves, elija Agregar directiva de acceso.
- Establezca los Permisos de las claves para incluir las opciones Obtener y Desencapsular clave
- En Seleccionar la entidad de seguridad, seleccione Servicio Azure Container Instance.
- Seleccione Agregar en la parte inferior
La directiva de acceso debe mostrarse ahora en las directivas de acceso del almacén de claves.
Modificar la plantilla de implementación JSON
Importante
El cifrado de datos de implementación con una clave administrada por el cliente está disponible en la versión más reciente de la API (2019-12-01) que se está implementando actualmente. Especifique esta versión de API en la plantilla de implementación. Si tiene algún problema con este valor, póngase en contacto con el soporte técnico de Azure.
Una vez configuradas la clave del almacén de claves y la directiva de acceso, agregue las siguientes propiedades a la plantilla de implementación de ACI. Obtenga más información sobre la implementación de recursos de ACI con una plantilla en el Tutorial: Implementación de un grupo con varios contenedores con una plantilla de Resource Manager.
- En
resources
, establezcaapiVersion
en2019-12-01
. - En la sección Propiedades del grupo de contenedores de la plantilla de implementación, agregue un elemento
encryptionProperties
con los siguientes valores:vaultBaseUrl
: nombre DNS del almacén de claves, que se puede encontrar en la hoja de Información general del recurso de almacén de claves en el portalkeyName
: nombre de la clave generada anteriormente.keyVersion
: versión actual de la clave. Para encontrar este campo, vaya a la propia clave (en "Claves" en la sección Configuración del recurso de almacén de claves)
- En las propiedades del grupo de contenedores, agregue una propiedad
sku
con el valorStandard
. La propiedadsku
es obligatoria en la versión 2019-12-01 de la API.
El siguiente fragmento de plantilla muestra estas propiedades adicionales para cifrar los datos de implementación:
[...]
"resources": [
{
"name": "[parameters('containerGroupName')]",
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2019-12-01",
"location": "[resourceGroup().location]",
"properties": {
"encryptionProperties": {
"vaultBaseUrl": "https://example.vault.azure.net",
"keyName": "acikey",
"keyVersion": "xxxxxxxxxxxxxxxx"
},
"sku": "Standard",
"containers": {
[...]
}
}
}
]
A continuación se muestra una plantilla completa, adaptada a partir de la plantilla de Tutorial: Implementación de un grupo con varios contenedores con una plantilla de Resource Manager.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"containerGroupName": {
"type": "string",
"defaultValue": "myContainerGroup",
"metadata": {
"description": "Container Group name."
}
}
},
"variables": {
"container1name": "aci-tutorial-app",
"container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
"container2name": "aci-tutorial-sidecar",
"container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
},
"resources": [
{
"name": "[parameters('containerGroupName')]",
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2019-12-01",
"location": "[resourceGroup().location]",
"properties": {
"encryptionProperties": {
"vaultBaseUrl": "https://example.vault.azure.net",
"keyName": "acikey",
"keyVersion": "xxxxxxxxxxxxxxxx"
},
"sku": "Standard",
"containers": [
{
"name": "[variables('container1name')]",
"properties": {
"image": "[variables('container1image')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGb": 1.5
}
},
"ports": [
{
"port": 80
},
{
"port": 8080
}
]
}
},
{
"name": "[variables('container2name')]",
"properties": {
"image": "[variables('container2image')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGb": 1.5
}
}
}
}
],
"osType": "Linux",
"ipAddress": {
"type": "Public",
"ports": [
{
"protocol": "tcp",
"port": "80"
},
{
"protocol": "tcp",
"port": "8080"
}
]
}
}
}
],
"outputs": {
"containerIPv4Address": {
"type": "string",
"value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
}
}
}
Implementar los recursos
Si ha creado y editado el archivo de plantilla en el escritorio, puede cargarlo en el directorio de Cloud Shell si lo arrastra a dicho directorio.
Para crear un grupo de recursos, use el comando az group create.
az group create --name myResourceGroup --location eastus
Implemente la plantilla con el comando az deployment group create.
az deployment group create --resource-group myResourceGroup --template-file deployment-template.json
Al cabo de unos segundos, debe recibir una respuesta inicial de Azure. Una vez completada la implementación, todos los datos relacionados con Azure que conserva el servicio ACI se cifran con la clave proporcionada.
Cifrado de datos con una clave administrada por el cliente en una instancia de Azure Key Vault protegida mediante la red con la opción Servicios de confianza habilitada.
Creación de un recurso de Key Vault
Cree una instancia de Azure Key Vault mediante Azure Portal, la CLI de Azure o Azure PowerShell. Para empezar, no aplique ninguna limitación de red para que podamos agregar las claves necesarias al almacén. En los pasos posteriores, agregaremos limitaciones de red y habilitaremos servicios de confianza.
En el caso de las propiedades del almacén de claves, siga estas instrucciones:
- Nombre: se requiere un nombre único.
- Suscripción: Elija una suscripción.
- En Grupo de recursos, seleccione un grupo existente o cree uno y escriba un nombre para el grupo de recursos.
- En el menú desplegable Ubicación elija una ubicación.
- Puede dejar los valores predeterminados de las demás opciones o elegir otros en función de los requisitos adicionales.
Importante
Al usar claves administradas por el cliente para cifrar una plantilla de implementación de ACI, se recomienda establecer las dos propiedades siguientes en el almacén de claves, Eliminación temporal y No purgar. Estas propiedades no están habilitadas de forma predeterminada, pero se pueden habilitar mediante PowerShell o la CLI de Azure tanto en un almacén de claves nuevo como en uno existente.
Generar una nueva clave
Una vez creado el almacén de claves, navegue hasta el recurso en Azure Portal. En el menú de navegación izquierdo de la hoja de recursos, en Configuración, seleccione Claves. En la vista "Claves", elija "Generar/importar" para generar una nueva clave. Use cualquier nombre único para esta clave y establezca cualquier otra preferencia en función de sus necesidades. Asegúrese de capturar el nombre y la versión de la clave para los pasos posteriores.
Creación de una identidad administrada asignada por el usuario para un grupo de contenedores
Cree una identidad en la suscripción con el comando az identity create. Puede usar el mismo grupo de recursos empleado para crear el almacén de claves o uno diferente.
az identity create \
--resource-group myResourceGroup \
--name myACIId
Para utilizar la identidad en los pasos siguientes, use el comando az identity show para almacenar en variables los identificadores de la entidad de servicio y del recurso de la identidad.
# Get service principal ID of the user-assigned identity
spID=$(az identity show \
--resource-group myResourceGroup \
--name myACIId \
--query principalId --output tsv)
Establecer la directiva de acceso
Cree una directiva de acceso para permitir a la identidad asignada por el usuario acceder a su clave y desencapsularla la clave para cifrarla.
az keyvault set-policy \
--name mykeyvault \
--resource-group myResourceGroup \
--object-id $spID \
--key-permissions get unwrapKey
Modificación de los permisos de red de Azure Key Vault
Los siguientes comandos configuran una instancia de Azure Firewall para Azure Key Vault y permiten los servicios de confianza de Azure, como el acceso a ACI.
az keyvault update \
--name mykeyvault \
--resource-group myResourceGroup \
--default-action Deny
az keyvault update \
--name mykeyvault \
--resource-group myResourceGroup \
--bypass AzureServices
Modificar la plantilla de implementación JSON
Importante
El cifrado de los datos de implementación con una clave administrada por el cliente está disponible a partir de la versión 2022-09-01 de la API. La versión 2022-09-01 de la API solo está disponible a través de ARM o REST. Si tiene algún problema con este valor, póngase en contacto con el soporte técnico de Azure. Una vez configuradas la clave del almacén de claves y la directiva de acceso, agregue las siguientes propiedades a la plantilla de implementación de ACI. Obtenga más información sobre la implementación de recursos de ACI con una plantilla en el Tutorial: Implementación de un grupo con varios contenedores con una plantilla de Resource Manager.
- En
resources
, establezcaapiVersion
en2022-09-01
. - En la sección Propiedades del grupo de contenedores de la plantilla de implementación, agregue un elemento
encryptionProperties
con los siguientes valores:vaultBaseUrl
: nombre DNS del almacén de claves. Esta propiedad se puede encontrar en la hoja de información general del recurso de almacén de claves en el portalkeyName
: nombre de la clave generada anteriormente.keyVersion
: versión actual de la clave. Para encontrar esta propiedad, haga clic en la clave (debajo de "Claves" en la sección Configuración del recurso de almacén de claves)identity
: esta propiedad es el identificador URI del recurso de la instancia de Identidad administrada creada anteriormente
- En las propiedades del grupo de contenedores, agregue una propiedad
sku
con el valorStandard
. La propiedadsku
es obligatoria en la versión 2022-09-01 de la API. - En los recursos, agregue el objeto
identity
necesario para usar Identidad administrada con ACI, que contiene los siguientes valores:type
: el tipo de la identidad que se usa (asignada por el usuario o asignada por el sistema). Este caso se establece en "UserAssigned"userAssignedIdentities
: el resourceURI de la misma identidad asignada por el usuario usado en el objetoencryptionProperties
.
El siguiente fragmento de plantilla muestra estas propiedades adicionales para cifrar los datos de implementación:
[...]
"resources": [
{
"name": "[parameters('containerGroupName')]",
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2019-12-01",
"location": "[resourceGroup().location]",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
}
},
"properties": {
"encryptionProperties": {
"vaultBaseUrl": "https://example.vault.azure.net",
"keyName": "acikey",
"keyVersion": "xxxxxxxxxxxxxxxx",
"identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
},
"sku": "Standard",
"containers": {
[...]
}
}
}
]
A continuación se muestra una plantilla completa, adaptada a partir de la plantilla de Tutorial: Implementación de un grupo con varios contenedores con una plantilla de Resource Manager.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"containerGroupName": {
"type": "string",
"defaultValue": "myContainerGroup",
"metadata": {
"description": "Container Group name."
}
}
},
"variables": {
"container1name": "aci-tutorial-app",
"container1image": "mcr.microsoft.com/azuredocs/aci-helloworld:latest",
"container2name": "aci-tutorial-sidecar",
"container2image": "mcr.microsoft.com/azuredocs/aci-tutorial-sidecar"
},
"resources": [
{
"name": "[parameters('containerGroupName')]",
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2022-09-01",
"location": "[resourceGroup().location]",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {}
}
},
"properties": {
"encryptionProperties": {
"vaultBaseUrl": "https://example.vault.azure.net",
"keyName": "acikey",
"keyVersion": "xxxxxxxxxxxxxxxx",
"identity": "/subscriptions/XXXXXXXXXXXXXXXXXXXXXX/resourcegroups/XXXXXXXXXXXXXXXXXXXXXX/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId"
},
"sku": "Standard",
"containers": [
{
"name": "[variables('container1name')]",
"properties": {
"image": "[variables('container1image')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGb": 1.5
}
},
"ports": [
{
"port": 80
},
{
"port": 8080
}
]
}
},
{
"name": "[variables('container2name')]",
"properties": {
"image": "[variables('container2image')]",
"resources": {
"requests": {
"cpu": 1,
"memoryInGb": 1.5
}
}
}
}
],
"osType": "Linux",
"ipAddress": {
"type": "Public",
"ports": [
{
"protocol": "tcp",
"port": "80"
},
{
"protocol": "tcp",
"port": "8080"
}
]
}
}
}
],
"outputs": {
"containerIPv4Address": {
"type": "string",
"value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups/', parameters('containerGroupName'))).ipAddress.ip]"
}
}
}
Implementar los recursos
Si ha creado y editado el archivo de plantilla en el escritorio, puede cargarlo en el directorio de Cloud Shell si lo arrastra a dicho directorio.
Para crear un grupo de recursos, use el comando az group create.
az group create --name myResourceGroup --location eastus
Implemente la plantilla con el comando az deployment group create.
az deployment group create --resource-group myResourceGroup --template-file deployment-template.json
Al cabo de unos segundos, debe recibir una respuesta inicial de Azure. Una vez completada la implementación, todos los datos relacionados con Azure que conserva el servicio ACI se cifran con la clave proporcionada.