Abilitare una chiave gestita dal cliente

Questo articolo è la seconda parte di una serie di esercitazioni in quattro parti. La prima parte offre una panoramica delle chiavi gestite dal cliente, delle relative funzionalità e delle considerazioni di cui tenere conto prima di abilitarne una nel registro. Questo articolo illustra la procedura per abilitare una chiave gestita dal cliente tramite l'interfaccia della riga di comando di Azure, il portale di Azure o un modello di Azure Resource Manager.

Prerequisiti

Abilitare una chiave gestita dal cliente tramite l'interfaccia della riga di comando di Azure

Creare un gruppo di risorse

Eseguire il comando az group create per creare un gruppo di risorse per contenere l'insieme di credenziali delle chiavi, il registro contenitori e le altre risorse richieste:

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

Creare un'identità gestita assegnata dall'utente

Configurare un'identità gestita assegnata dall'utente per il registro in modo che sia possibile accedere all'insieme di credenziali delle chiavi:

  1. Eseguire il comando az identity create per creare l'identità gestita:

    az identity create \
      --resource-group <resource-group-name> \
      --name <managed-identity-name>
    
  2. Nell'output del comando prendere nota dei valori id e principalId per configurare l'accesso al registro con l'insieme di credenziali delle chiavi:

    {
      "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. Per praticità, archiviare i variabili id e principalId nelle variabili di ambiente:

    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)
    

Creare un insieme di credenziali delle chiavi

  1. Eseguire il comando az keyvault create per creare un insieme di credenziali delle chiavi in cui archiviare una chiave gestita dal cliente per la crittografia del registro.

  2. Per impostazione predefinita, il nuovo insieme di credenziali delle chiavi abilita automaticamente l'impostazione di eliminazione temporanea. Per prevenire la perdita di dati dovuta all’eliminazione accidentale delle chiavi o degli insiemi di credenziali delle chiavi, è consigliabile abilitare l’impostazione di protezione dalla rimozione definitiva:

    az keyvault create --name <key-vault-name> \
      --resource-group <resource-group-name> \
      --enable-purge-protection
    
  3. Per praticità, prendere nota dell'ID risorsa dell'insieme di credenziali delle chiavi e archiviare il valore nelle variabili di ambiente:

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

Abilitare i servizi attendibili per accedere all'insieme di credenziali delle chiavi

Se l'insieme di credenziali delle chiavi è protetto con un firewall o una rete virtuale (endpoint privato), è necessario abilitare le impostazioni di rete per consentire l'accesso da parte dei servizi di Azure attendibili. Per altre informazioni, vedere Configurare le impostazioni di rete di Azure Key Vault.

Abilitare le identità gestite per l’accesso all'insieme di credenziali delle chiavi

Esistono due modi per consentire alle identità gestite di accedere all'insieme di credenziali delle chiavi.

La prima opzione consiste nel configurare i criteri di accesso per l'insieme di credenziali delle chiavi e impostare le autorizzazioni per l'accesso con un'identità gestita assegnata dall'utente:

  1. Eseguire il comando az keyvault set policy. Passare il valore della variabile di ambiente di principalID creata e archiviata in precedenza.

  2. Impostare le autorizzazioni per le chiavi su get, unwrapKey e wrapKey:

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

La seconda opzione consiste nell'usare il controllo degli accessi in base al ruolo (RBAC) di Azure per assegnare le autorizzazioni all'identità gestita assegnata dall'utente e accedere all'insieme di credenziali delle chiavi. Eseguire il comando az role assignment create e assegnare il ruolo Key Vault Crypto Service Encryption User a un'identità gestita assegnata dall'utente:

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

Creare una chiave e ottenere l'ID chiave

  1. Eseguire il comando az keyvault key create per creare una chiave nell’insieme di credenziali delle chiavi:

    az keyvault key create \
      --name <key-name> \
      --vault-name <key-vault-name>
    
  2. Nell'output del comando prendere nota dell'ID chiave (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. Per praticità, archiviare il formato scelto per l'ID chiave nella variabile di ambiente $keyID. È possibile usare un ID chiave con o senza una versione.

Rotazione delle chiavi

È possibile scegliere la rotazione manuale o automatica delle chiavi.

La crittografia di un registro con una chiave gestita dal cliente con una versione della chiave consentirà solo la rotazione manuale delle chiavi nel Registro Azure Container. In questo esempio viene archiviata la proprietà kid della chiave:

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

La crittografia di un registro con una chiave gestita dal cliente senza una versione della chiave consentirà la rotazione automatica delle chiavi e il conseguente rilevamento di una nuova versione della chiave in Azure Key Vault. In questo esempio viene rimossa la versione dalla proprietà kid della chiave:

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

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

Creare un registro con la chiave gestita dal cliente

  1. Eseguire il comando az acr create per creare un registro nel livello di servizio Premium e abilitare la chiave gestita dal cliente.

  2. Passare i valori dell'ID identità gestita (id) e dell'ID chiave (kid) archiviati nelle variabili di ambiente nei passaggi precedenti:

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

Visualizzare lo stato della crittografia

Eseguire il comando az acr encryption show per visualizzare lo stato della crittografia del registro con una chiave gestita dal cliente:

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

A seconda della chiave usata per crittografare il registro, l'output è simile al seguente:

{
  "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"
}

Abilitare una chiave gestita dal cliente tramite il portale di Azure

Creare un'identità gestita assegnata dall'utente

Creare un'identità gestita assegnata dall'utente per le risorse di Azure nel portale di Azure.

  1. Seguire la procedura per creare un'identità assegnata dall'utente.

  2. Salvare il nome dell'identità per usarlo nei passaggi successivi.

Screenshot che mostra le opzioni per la creazione di un'identità assegnata dall'utente nel portale di Azure.

Creare un insieme di credenziali delle chiavi

  1. Seguire la procedura descritta in Guida introduttiva: Creare un insieme di credenziali delle chiavi tramite il portale di Azure.

  2. Quando si crea un insieme di credenziali delle chiavi per una chiave gestita dal cliente, nella scheda Informazioni di base abilitare l'impostazione Protezione da rimozione definitiva. Questa impostazione consente di prevenire la perdita di dati a causa dell’eliminazione accidentale di chiavi o insiemi di credenziali delle chiavi.

    Screenshot che mostra le opzioni per la creazione di un insieme di credenziali delle chiavi nel portale di Azure.

Abilitare i servizi attendibili per l’accesso all'insieme di credenziali delle chiavi

Se l'insieme di credenziali delle chiavi è protetto con un firewall o una rete virtuale (endpoint privato), abilitare l'impostazione di rete per consentire l'accesso da parte dei servizi di Azure attendibili. Per altre informazioni, vedere Configurare le impostazioni di rete di Azure Key Vault.

Abilitare le identità gestite per l’accesso all'insieme di credenziali delle chiavi

Esistono due modi per consentire alle identità gestite di accedere all'insieme di credenziali delle chiavi.

La prima opzione consiste nel configurare i criteri di accesso per l'insieme di credenziali delle chiavi e impostare le autorizzazioni per l'accesso con un'identità gestita assegnata dall'utente:

  1. Passare all'insieme di credenziali delle chiavi.
  2. Selezionare Impostazioni>Criteri di accesso > +Aggiungi un criterio di accesso.
  3. Selezionare Autorizzazioni chiave e quindi selezionare Recupera, Annulla il wrapping della chiave ed Esegui il wrapping della chiave.
  4. In Selezionare un'entità selezionare il nome della risorsa dell'identità gestita assegnata dall'utente.
  5. Seleziona Aggiungi e quindi Salva.

Screenshot che mostra le opzioni per la creazione di un criterio di accesso dell'insieme di credenziali delle chiavi.

L'altra opzione consiste nell'assegnare il ruolo Controllo degli accessi in base al ruolo Key Vault Crypto Service Encryption User all'identità gestita assegnata dall'utente nell'ambito dell'insieme di credenziali delle chiavi. Per la procedura dettagliata, vedere Assegnare ruoli di Azure usando il portale di Azure.

Creazione di una chiave

Creare una chiave nell'insieme di credenziali delle chiavi e usarla per crittografare il registro. Seguire questa procedura per selezionare una versione di chiave specifica come chiave gestita dal cliente. Potrebbe anche essere necessario creare una chiave prima di creare il registro se l'accesso all'insieme di credenziali delle chiavi è limitato a un endpoint privato o a reti selezionate.

  1. Passare all'insieme di credenziali delle chiavi.
  2. Selezionare Impostazioni>Chiavi.
  3. Selezionare +Genera/Importa e immettere un nome univoco per la chiave.
  4. Accettare i rimanenti valori predefiniti e quindi selezionare Crea.
  5. Dopo la creazione, selezionare la chiave e quindi selezionare la versione corrente. Copiare l'identificatore della chiave per la versione della chiave.

Creare un registro contenitori

  1. Selezionare Crea una risorsa>Contenitori>Registro Container.
  2. Nella scheda Informazioni di base selezionare o creare un gruppo di risorse e quindi immettere un nome per il registro. In SKU selezionare Premium.
  3. Nella scheda Crittografia, selezionare Abilitata in Chiave gestita dal cliente.
  4. In Identità selezionare l'identità gestita creata.
  5. In Crittografia scegliere una delle opzioni seguenti:
    • Scegliere Seleziona dall’insieme di credenziali delle chiavie quindi selezionare un insieme di credenziali delle chiavi e una chiave esistenti oppure selezionare Crea nuovo. La chiave selezionata è senza versione e abilita la rotazione automatica delle chiavi.
    • Selezionare Invio URI chiave e specificare l'identificatore di una chiave esistente. È possibile specificare un URI della chiave con versione (per una chiave che deve essere ruotata manualmente) o un URI di chiave senza versione (che abilita la rotazione automatica delle chiavi). Vedere la sezione precedente per la procedura di creazione di una chiave.
  6. Selezionare Rivedi e crea.
  7. Selezionare Crea per distribuire l'istanza del registro.

Screenshot che mostra le opzioni per la creazione di un registro crittografato nel portale di Azure.

Visualizzare lo stato della crittografia

Per visualizzare lo stato della crittografia del registro nel portale, passare al registro. In Impostazioni selezionare Crittografia.

Abilitare una chiave gestita dal cliente tramite un modello di Resource Manager

È anche possibile usare un modello di Resource Manager per creare un registro contenitori e abilitare la crittografia con una chiave gestita dal cliente:

  1. Copiare il contenuto seguente di un modello di Resource Manager in un nuovo file e salvarlo con il nome 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. Seguire i passaggi delle sezioni precedenti per creare le risorse seguenti:

    • Insieme di credenziali delle chiavi, identificato dal nome
    • Insieme di credenziali delle chiavi, identificato dall'ID chiave
  3. Eseguire il comando az deployment group create seguente per creare il registro usando il file di modello precedente. Se indicato, specificare un nuovo nome per il registro e un nome di identità gestita assegnato dall'utente, nonché un nome per l'insieme di credenziali delle chiavi e l'ID chiave creati.

    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. Per visualizzare lo stato della crittografia del registro, eseguire il comando az acr encryption show:

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

Passaggi successivi

Passare all'articolo successivo per informazioni dettagliate sulla rotazione delle chiavi gestite dal cliente, l'aggiornamento delle versioni delle chiavi e la revoca di una chiave gestita dal cliente.