Activer une clé gérée par le client

Cet article est la deuxième partie d’une série de tutoriels qui en compte quatre. La première partie fournit une vue d’ensemble des clés gérées par le client, de leurs caractéristiques et des points à prendre en considération avant d’en activer une dans votre registre. Cet article vous guide tout au long des étapes d’activation d’une clé gérée par le client à l’aide d’Azure CLI, du portail Azure ou d’un modèle Azure Resource Manager.

Prérequis

Activer une clé gérée par le client à l’aide d’Azure CLI

Créer un groupe de ressources

Exécutez la commande az group create pour créer un groupe de ressources qui va contenir votre coffre de clés, votre registre de conteneurs et d’autres ressources nécessaires :

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

Créer une identité managée attribuée par l’utilisateur

Configurez une identité managée affectée par l’utilisateur pour le registre afin de pouvoir accéder au coffre de clés :

  1. Exécutez la commande az identity create pour créer l’identité managée :

    az identity create \
      --resource-group <resource-group-name> \
      --name <managed-identity-name>
    
  2. Dans la sortie de la commande, notez les valeurs id et principalId pour configurer l’accès au registre avec le coffre de clés :

    {
      "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. Par souci pratique, stockez les valeurs id et principalId dans des variables d’environnement :

    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)
    

Création d’un coffre de clés

  1. Exécutez la commande az keyvault create pour créer un coffre de clés dans lequel vous pouvez stocker une clé gérée par le client à des fins de chiffrement du registre.

  2. Par défaut, le nouveau coffre de clés active automatiquement le paramètre de suppression réversible. Pour éviter toute perte de données résultant de la suppression accidentelle de clés ou de coffres de clés, nous vous recommandons d’activer le paramètre de protection contre la suppression définitive :

    az keyvault create --name <key-vault-name> \
      --resource-group <resource-group-name> \
      --enable-purge-protection
    
  3. Pour plus de commodité, notez l’ID de ressource du coffre de clés et stockez la valeur dans des variables d’environnement :

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

Permettre aux services approuvés d’accéder au coffre de clés

Si le coffre de clés est sous la protection d’un pare-feu ou d’un réseau virtuel (point de terminaison privé), vous devez activer les paramètres réseau pour autoriser l’accès par les services Azure approuvés. Pour plus d’informations, consultez Configurer les paramètres de mise en réseau du Coffre de clés Azure.

Permettre aux identités managées d’accéder au coffre de clés

Il existe deux façons de permettre aux identités managées d’accéder à votre coffre de clés.

La première consiste à configurer la stratégie d’accès pour le coffre de clés et à définir des autorisations de clé pour l’accès à l’aide d’une identité managée affectée par l’utilisateur :

  1. Exécutez la commande az keyvault set policy. Passez la valeur principalID de la variable d’environnement précédemment créée et stockée.

  2. Définissez les autorisations de clé sur get, unwrapKey et wrapKey :

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

La deuxième façon consiste à utiliser le contrôle d’accès en fonction du rôle Azure (RBAC) pour attribuer des autorisations à l’identité managée affectée par l’utilisateur afin d’accéder au coffre de clés. Exécutez la commande az role assignment create et attribuez le rôle Key Vault Crypto Service Encryption User à une identité managée affectée par l’utilisateur :

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

Créer une clé et obtenir l’ID de la clé

  1. Exécutez la commande az keyvault key create pour créer une clé dans le coffre de clés :

    az keyvault key create \
      --name <key-name> \
      --vault-name <key-vault-name>
    
  2. Dans la sortie de la commande, notez l’ID de la clé (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. Pour des raisons pratiques, stockez le format que vous choisissez pour l’ID de la clé dans la variable d’environnement $keyID. Vous pouvez utiliser un ID de clé avec ou sans version.

Rotation des clés

Vous pouvez choisir une rotation manuelle ou automatique des clés.

Le chiffrement d’un registre à l’aide d’une clé gérée par le client qui possède une version de clé autorise uniquement une rotation manuelle des clés dans Azure Container Registry. Cet exemple stocke la propriété kid de la clé :

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

Le chiffrement d’un registre avec une clé gérée par le client en omettant une version de clé permet une rotation de clé automatique pour détecter une nouvelle version de clé dans Azure Key Vault. Cet exemple supprime la version de la propriété kid de la clé :

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

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

Créer un registre avec une clé gérée par le client

  1. Exécutez la commande az acr create pour créer un registre dans le niveau de service Premium et activer la clé gérée par le client.

  2. Passez les valeurs de l’ID de l’identité managée (id) et de l’ID de la clé (kid) stockées dans les variables d’environnement aux étapes précédentes :

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

Afficher l’état de chiffrement

Exécutez la commande az acr encryption show pour montrer l’état du chiffrement du registre avec une clé gérée par le client :

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

Selon la clé utilisée pour chiffrer le registre, la sortie est similaire à celle-ci :

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

Activer une clé gérée par le client à l’aide du portail Azure

Créer une identité managée attribuée par l’utilisateur

Pour créer une identité managée affectée par l’utilisateur pour des ressources Azure dans le portail Azure :

  1. Suivez les étapes permettant de créer une identité affectée par l’utilisateur.

  2. Enregistrez le nom de l’identité pour l’utiliser dans les étapes ultérieures.

Capture d’écran des options de création d’une identité affectée par l’utilisateur dans le portail Azure.

Création d’un coffre de clés

  1. Suivez les étapes décrites dans Démarrage rapide : Créer un coffre de clés à l’aide du portail Azure.

  2. Quand vous créez un coffre de clés pour une clé gérée par le client, sous l’onglet Informations de base, activez le paramètre Protection contre la suppression définitive. Ce paramètre permet d’empêcher toute perte de données suite à une suppression accidentelle de clés ou coffres de clés.

    Capture d’écran des options de création d’un coffre de clés dans le portail Azure.

Permettre aux services approuvés d’accéder au coffre de clés

Si le coffre de clés est sous la protection d’un pare-feu ou d’un réseau virtuel (point de terminaison privé), activez le paramètre réseau pour autoriser l’accès par les services Azure approuvés. Pour plus d’informations, consultez Configurer les paramètres de mise en réseau du Coffre de clés Azure.

Permettre aux identités managées d’accéder au coffre de clés

Il existe deux façons de permettre aux identités managées d’accéder à votre coffre de clés.

La première consiste à configurer la stratégie d’accès pour le coffre de clés et à définir des autorisations de clé pour l’accès à l’aide d’une identité managée affectée par l’utilisateur :

  1. Accédez à votre coffre de clés.
  2. Sélectionnez Paramètres>Stratégies d’accès > +Ajouter une stratégie d’accès.
  3. Sélectionnez Autorisations de clé, puis Obtenir, Ne pas inclure la clé et Inclure la clé.
  4. Dans Sélectionner le principal, sélectionnez le nom de ressource de votre identité managée affectée par l’utilisateur.
  5. Sélectionnez Ajouter, puis sélectionnez Enregistrer.

Capture d’écran des options de création d’une stratégie d’accès au coffre de clés.

Une autre option consiste à attribuer le rôle RBAC Key Vault Crypto Service Encryption User à l’identité managée affectée par l’utilisateur au niveau de l’étendue du coffre de clés. Pour connaître les étapes détaillées, consultez Attribuer des rôles Azure à l’aide du portail Azure.

Créer une clé

Créez une clé dans le coffre de clés et utilisez-la pour chiffrer le registre. Procédez comme suit si vous souhaitez sélectionner une version de clé spécifique comme clé gérée par le client. Vous devrez peut-être également créer une clé avant de créer le registre si l’accès au coffre de clés est limité à un point de terminaison privé ou à des réseaux sélectionnés.

  1. Accédez à votre coffre de clés.
  2. Sélectionnez Paramètres>Clés.
  3. Sélectionnez +Générer/Importer et entrez un nom unique pour la clé.
  4. Acceptez les valeurs par défaut restantes, puis sélectionnez Créer.
  5. Après la création, sélectionnez la clé, puis sélectionnez la version actuelle. Copiez l’identificateur de clé pour la version de clé.

Créer un registre de conteneur

  1. Sélectionnez Créer une ressource>Conteneurs>Container Registry.
  2. Sous l’onglet Informations de base, sélectionnez ou créez un groupe de ressources, puis entrez un nom de registre. Dans Référence (SKU) , sélectionnez Premium.
  3. Sous l’onglet Chiffrement, pour Clé gérée par le client, sélectionnez Activée.
  4. Pour Identité, sélectionnez l’identité managée que vous avez créée.
  5. Pour Chiffrement, choisissez l’une des options suivantes :
    • Choisissez Sélectionner dans le coffre de clés, puis sélectionnez un coffre de clés et une clé existants, ou sélectionnez Créer. La clé que vous sélectionnez est non versionnée et permet la rotation automatique des clés.
    • SélectionnezEntrez l’URI de clé, et fournissez une clé existante à l’identificateur. Vous pouvez fournir un URI de clé versionné (pour une clé dont la rotation doit être manuelle) ou un URI de clé non versionné (qui permet une rotation automatique des clés). Consultez la section précédente pour connaître les étapes de création d’une clé.
  6. Sélectionnez Revoir + créer.
  7. Sélectionnez Créer pour déployer l’instance du registre.

Capture d’écran montrant les options de création d’un registre chiffré dans le portail Azure.

Montrer l’état de chiffrement

Pour voir l’état de chiffrement de votre registre dans le portail, accédez à votre registre. Sous Paramètres, sélectionnez Chiffrement.

Activer une clé gérée par le client à l’aide d’un modèle Resource Manager

Vous pouvez utiliser un modèle Resource Manager pour créer un registre de conteneurs et activer le chiffrement avec une clé gérée par le client :

  1. Copiez le contenu suivant d’un modèle Resource Manager dans un nouveau fichier, puis enregistrez-le dans 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. Suivez les étapes décrites dans les sections précédentes pour créer les ressources suivantes :

    • Coffre de clés, identifié par un nom
    • Clé de coffre de clés, identifiée par un ID de clé
  3. Exécutez la commande az deployment group create pour créer le registre à l’aide du fichier de modèle précédent. Lorsque cela est indiqué, fournissez un nouveau nom de registre et un nom d’identité managée affectée par l’utilisateur, ainsi que le nom et l’ID de clé du coffre de clés que vous avez créé.

    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. Exécutez la commandeaz acr encryption show pour montrer l’état de chiffrement du registre :

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

Étapes suivantes

Passez à l’article suivant pour découvrir la rotation des clés gérées par le client, la mise à jour des versions de clé et la révocation d’une clé gérée par le client.