Habilitación de una clave administrada por el cliente

Este artículo es la segunda parte de una serie de tutoriales de cuatro partes. La primera parte ofrece una introducción a las claves administradas por el cliente, sus características y las consideraciones a tener en cuenta antes de habilitar una en su registro. Este artículo le guía a través de los pasos para habilitar una clave administrada por el cliente mediante la CLI de Azure, el Azure Portal o una plantilla de Azure Resource Manager.

Requisitos previos

Habilitación de una clave administrada por el cliente mediante la CLI de Azure

Crear un grupo de recursos

Ejecute el comando az group create para crear un grupo de recursos que contendrá su almacén de claves, el registro de contenedores y otros recursos necesarios:

az group create --name <resource-group-name> --location <location>

Crear una identidad administrada asignada por el usuario

Configure una identidad administrada asignada por el usuario para el registro para que pueda acceder al almacén de claves:

  1. Ejecute el comando az identity create para crear la identidad administrada:

    az identity create \
      --resource-group <resource-group-name> \
      --name <managed-identity-name>
    
  2. En el resultado del comando, tome nota de los valores id y principalId para configurar el acceso al registro con el almacén de claves:

    {
      "clientId": "xxxx2bac-xxxx-xxxx-xxxx-192cxxxx6273",
      "clientSecretUrl": "https://control-eastus.identity.azure.net/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myresourcegroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myidentityname/credentials?tid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&oid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&aid=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myresourcegroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myresourcegroup",
      "location": "eastus",
      "name": "myidentityname",
      "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "resourceGroup": "myresourcegroup",
      "tags": {},
      "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  3. Por comodidad, almacena los valores id y principalId en variables de entorno:

    identityID=$(az identity show --resource-group <resource-group-name> --name <managed-identity-name> --query 'id' --output tsv)
    
    identityPrincipalID=$(az identity show --resource-group <resource-group-name> --name <managed-identity-name> --query 'principalId' --output tsv)
    

Creación de un Almacén de claves

  1. Ejecute el comando az keyvault create para crear un almacén de claves donde pueda almacenar una clave administrada por el cliente para el cifrado del registro.

  2. De forma predeterminada, el nuevo almacén de claves habilita automáticamente la configuración de eliminación temporal. Para evitar la pérdida de datos por el borrado accidental de claves o almacenes de claves, se recomienda activar el ajuste de protección de purga:

    az keyvault create --name <key-vault-name> \
      --resource-group <resource-group-name> \
      --enable-purge-protection
    
  3. Para mayor comodidad, tome nota del id. de recurso del almacén de claves y almacene el valor en variables de entorno:

    keyvaultID=$(az keyvault show --resource-group <resource-group-name> --name <key-vault-name> --query 'id' --output tsv)
    

Habilitación de los servicios de confianza para acceder al almacén de claves

Si el almacén de claves está protegido con un firewall o una red virtual (punto de conexión privado), debe habilitar la configuración de red para permitir el acceso mediante servicios de confianza de Azure. Para más información, vea Configuración de redes de Azure Key Vault.

Habilitación de identidades administradas para acceder al almacén de claves

Hay dos maneras de permitir que las identidades administradas accedan al almacén de claves.

La primera opción es configurar la política de acceso para el almacén de claves y establecer los permisos de las claves para el acceso con una identidad administrada asignada por el usuario:

  1. Ejecute el comando az keyvault set policy. Pase el valor de la variable de entorno previamente creada y almacenada de principalID.

  2. Establezca los permisos de clave en get, unwrapKeyy wrapKey:

    az keyvault set-policy \
      --resource-group <resource-group-name> \
      --name <key-vault-name> \
      --object-id $identityPrincipalID \
      --key-permissions get unwrapKey wrapKey
    
    

La segunda opción es usar el control de acceso basado en rol (RBAC) de Azure para asignar permisos a la identidad administrada asignada por el usuario y acceder al almacén de claves. Ejecute el comando az role assignment create y asigne el rol Key Vault Crypto Service Encryption User a una identidad administrada asignada por el usuario:

az role assignment create --assignee $identityPrincipalID \
  --role "Key Vault Crypto Service Encryption User" \
  --scope $keyvaultID

Crear una clave y obtener el identificador de la clave

  1. Ejecute el comando az keyvault key create para crear una clave en el almacén de claves:

    az keyvault key create \
      --name <key-name> \
      --vault-name <key-vault-name>
    
  2. En el resultado del comando, tome nota del identificador de la clave (kid):

    [...]
      "key": {
        "crv": null,
        "d": null,
        "dp": null,
        "dq": null,
        "e": "AQAB",
        "k": null,
        "keyOps": [
          "encrypt",
          "decrypt",
          "sign",
          "verify",
          "wrapKey",
          "unwrapKey"
        ],
        "kid": "https://mykeyvault.vault.azure.net/keys/mykey/<version>",
        "kty": "RSA",
    [...]
    
  3. Para mayor comodidad, guarde el formato que elija para el identificador de la clave en la variable de entorno $keyID. Puede usar un identificador de clave con o sin versión.

Rotación de claves

Puede elegir la rotación manual o automática de claves.

El cifrado de un registro con una clave administrada por el cliente que tiene una versión de la clave permitirá únicamente la rotación manual de la clave en Azure Container Registry. En este ejemplo se almacena la propiedad kid de la clave:

keyID=$(az keyvault key show \
  --name <keyname> \
  --vault-name <key-vault-name> \
  --query 'key.kid' --output tsv)

Al cifrar un registro con una clave administrada por el cliente mediante la omisión de una versión de clave se habilitará la rotación automática de claves para detectar una nueva versión de clave en Azure Key Vault. En este ejemplo se quita la versión de la propiedad kid de la clave:

keyID=$(az keyvault key show \
  --name <keyname> \
  --vault-name <key-vault-name> \
  --query 'key.kid' --output tsv)

keyID=$(echo $keyID | sed -e "s/\/[^/]*$//")

Creación de un registro con una clave administrada por el cliente

  1. Ejecute el comando az acr create para crear un registro en el nivel de servicio Premium y habilitar la clave administrada por el cliente.

  2. Pase los valores de identificación de la identidad administrada (id) y de la clave (kid) almacenados en las variables de entorno en los pasos anteriores:

    az acr create \
      --resource-group <resource-group-name> \
      --name <container-registry-name> \
      --identity $identityID \
      --key-encryption-key $keyID \
      --sku Premium
    

Presentación del estado de cifrado

Ejecute el comando az acr encryption show para mostrar el estado del cifrado del registro con una clave administrada por el cliente:

az acr encryption show --name <container-registry-name>

Según la clave que se use para encriptar el registro, el resultado es similar:

{
  "keyVaultProperties": {
    "identity": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "keyIdentifier": "https://myvault.vault.azure.net/keys/myresourcegroup/abcdefg123456789...",
    "keyRotationEnabled": true,
    "lastKeyRotationTimestamp": xxxxxxxx
    "versionedKeyIdentifier": "https://myvault.vault.azure.net/keys/myresourcegroup/abcdefg123456789...",
  },
  "status": "enabled"
}

Habilitación de una clave administrada por el cliente mediante el Azure Portal

Crear una identidad administrada asignada por el usuario

Para crea una identidad administrada para recursos de Azure asignada por el usuario en Azure Portal.

  1. Siga los pasos para crear una identidad asignada por el usuario.

  2. Guarde el nombre de la identidad para usarlo en pasos posteriores.

Captura de pantalla de las opciones para crear una identidad asignada al usuario en el Azure Portal.

Creación de un Almacén de claves

  1. Siga los pasos de Inicio rápido: Creación de un almacén de claves mediante Azure Portal.

  2. Al crear un almacén de claves para una clave administrada por el cliente, en la pestaña Datos básicos, habilite el valor Protección de purga. Esta configuración ayuda a evitar la pérdida de datos de la eliminación accidental de claves o almacenes de claves.

    Captura de pantalla de las opciones para crear un almacén de claves en el Azure Portal.

Habilitación de los servicios de confianza para acceder al almacén de claves

Si el almacén de claves está protegido con un firewall o una red virtual (punto de conexión privado), habilite la configuración de red para permitir el acceso mediante servicios de confianza de Azure. Para más información, vea Configuración de redes de Azure Key Vault.

Habilitación de identidades administradas para acceder al almacén de claves

Hay dos maneras de permitir que las identidades administradas accedan al almacén de claves.

La primera opción es configurar la política de acceso para el almacén de claves y establecer los permisos de las claves para el acceso con una identidad administrada asignada por el usuario:

  1. Vaya al almacén de claves
  2. Seleccione Configuración>Directivas de acceso > +Agregar directiva de acceso.
  3. Seleccione Permisos de clave y luego seleccione Obtener, Desajustar clave y Encapsular clave.
  4. En Seleccionar la entidad de seguridad, seleccione el nombre de recurso de la identidad administrada asignada por el usuario.
  5. Seleccione Agregar y después seleccione Guardar.

Captura de pantalla de las opciones para crear una política de acceso al almacén de claves.

La otra opción es asignar el rol RBAC Key Vault Crypto Service Encryption User a la identidad administrada asignada por el usuario en el ámbito del almacén de claves. Para asignar roles, consulte Asignación de roles de Azure mediante Azure Portal.

Crear una clave

Cree una clave en el almacén de claves y úsela para cifrar el registro. Siga estos pasos si desea seleccionar una versión de clave específica como clave administrada por el cliente. También es posible que tenga que crear una clave antes de crear el registro si el acceso al almacén de claves está restringido a un punto de conexión privado o a redes seleccionadas.

  1. Vaya al almacén de claves
  2. Seleccione Configuración>Claves.
  3. Seleccione +Generar o importar y escriba un nombre único para la clave.
  4. Acepte el resto de los valores predeterminados y, a continuación, seleccione Crear.
  5. Tras la creación, seleccione la clave y, después, la versión actual. Copie el identificador de clave de la versión de la clave.

Creación de un Registro de contenedor

  1. Seleccione Crear un recurso>Contenedores>Registro de contenedor.
  2. En la pestaña Datos básicos, seleccione o cree un grupo de recursos y, a continuación, escriba un nombre de registro. En SKU, seleccione Premium.
  3. En la pestaña Cifrado, para Clave administrada por el cliente, seleccione Habilitado.
  4. En Identidad, seleccione la identidad administrada que ha creado.
  5. Para el Cifrado, elija una de las siguientes opciones:
    • Seleccione Seleccionar del almacén de claves y, a continuación, seleccione un almacén de claves y una clave existentes o seleccione Crear nuevo. La clave que se selecciona no está versionada y permite la rotación automática de la clave.
    • Seleccione Escribir el URI de la clave y proporcione el identificador de una clave existente. Puede proporcionar un URI de clave versionada (para una clave que debe rotarse manualmente) o un URI de clave no versionada (que permite la rotación automática de la clave). Consulte la sección anterior para ver los pasos para crear una clave.
  6. Seleccione Revisar + crear.
  7. Seleccione Crear para implementar la instancia del registro.

Captura de pantalla que muestra las opciones para crear un registro cifrado en el Azure Portal.

Mostrar el estado de cifrado

Para ver el estado de cifrado del registro en el portal, vaya al registro. En Configuración, seleccione Cifrado.

Habilitar una clave administrada por el cliente mediante una plantilla de Resource Manager

Puede usar una plantilla del Resource Manager para crear un registro de contenedores y habilitar el cifrado con una clave administrada por el cliente:

  1. Copie el siguiente contenido de una plantilla del Resource Manager en un nuevo archivo y guárdelo como CMKtemplate.json:

    {
      "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      "parameters": {
        "vault_name": {
          "defaultValue": "",
          "type": "String"
        },
        "registry_name": {
          "defaultValue": "",
          "type": "String"
        },
        "identity_name": {
          "defaultValue": "",
          "type": "String"
        },
        "kek_id": {
          "type": "String"
        }
      },
      "variables": {},
      "resources": [
        {
          "type": "Microsoft.ContainerRegistry/registries",
          "apiVersion": "2019-12-01-preview",
          "name": "[parameters('registry_name')]",
          "location": "[resourceGroup().location]",
          "sku": {
            "name": "Premium",
            "tier": "Premium"
          },
          "identity": {
            "type": "UserAssigned",
            "userAssignedIdentities": {
              "[resourceID('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]": {}
            }
          },
          "dependsOn": [
            "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]"
          ],
          "properties": {
            "adminUserEnabled": false,
            "encryption": {
              "status": "enabled",
              "keyVaultProperties": {
                "identity": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name')), '2018-11-30').clientId]",
                "KeyIdentifier": "[parameters('kek_id')]"
              }
            },
            "networkRuleSet": {
              "defaultAction": "Allow",
              "virtualNetworkRules": [],
              "ipRules": []
            },
            "policies": {
              "quarantinePolicy": {
                "status": "disabled"
              },
              "trustPolicy": {
                "type": "Notary",
                "status": "disabled"
              },
              "retentionPolicy": {
                "days": 7,
                "status": "disabled"
              }
            }
          }
        },
        {
          "type": "Microsoft.KeyVault/vaults/accessPolicies",
          "apiVersion": "2018-02-14",
          "name": "[concat(parameters('vault_name'), '/add')]",
          "dependsOn": [
            "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name'))]"
          ],
          "properties": {
            "accessPolicies": [
              {
                "tenantId": "[subscription().tenantId]",
                "objectId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', parameters('identity_name')), '2018-11-30').principalId]",
                "permissions": {
                  "keys": [
                    "get",
                    "unwrapKey",
                    "wrapKey"
                  ]
                }
              }
            ]
          }
        },
        {
          "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
          "apiVersion": "2018-11-30",
          "name": "[parameters('identity_name')]",
          "location": "[resourceGroup().location]"
        }
      ]
    }
    
  2. Siga los pasos de las secciones anteriores para crear los siguientes recursos:

    • Almacén de claves, identificado por nombre
    • Clave del almacén de claves, identificada por identificador de clave
  3. Ejecute el comando az deployment group create para crear el registro con el archivo de plantilla anterior. Cuando se le indique, proporcione un nuevo nombre de registro y un nombre de identidad administrada asignada por el usuario, junto con el nombre del almacén de claves y el identificador de claves que ha creado.

    az deployment group create \
      --resource-group <resource-group-name> \
      --template-file CMKtemplate.json \
      --parameters \
        registry_name=<registry-name> \
        identity_name=<managed-identity> \
        vault_name=<key-vault-name> \
        key_id=<key-vault-key-id>
    
  4. Ejecute el comando az acr encryption show para que muestre el estado de cifrado del registro:

    az acr encryption show --name <registry-name>
    

Pasos siguientes

Pase al siguiente artículo para recorrer las claves administradas por el cliente, actualizar las versiones de clave y revocar una clave administrada por el cliente.