Habilitar uma chave gerenciada pelo cliente

Este artigo é a segunda parte de uma série de tutoriais de quatro partes. A parte um, fornece uma visão geral das chaves gerenciadas pelo cliente, seus recursos e considerações antes de habilitar uma em seu Registro. Este artigo mostra como habilitar uma chave gerenciada pelo cliente usando a CLI do Azure, o portal do Azure ou um modelo do Azure Resource Manager.

Pré-requisitos

Habilitar uma chave gerenciada pelo cliente usando a CLI do Azure

Criar um grupo de recursos

Se necessário, execute o comando az group create para criar um grupo de recursos para criar o cofre de chaves, o Registro de contêiner e outros recursos necessários:

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

Criar uma identidade gerenciada atribuída ao usuário

Configure uma identidade gerenciada atribuída pelo usuário para o Registro para que você possa acessar o cofre de chaves:

  1. Execute o comando az identity create para criar uma identidade gerenciada:

    az identity create \
      --resource-group <resource-group-name> \
      --name <managed-identity-name>
    
  2. Na saída do comando, anote os valores id e principalId para configurar o acesso ao Registro com o cofre de chaves:

    {
      "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. Para sua conveniência, armazene os valores id e principalId em variáveis de 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)
    

Criar um cofre de chave

  1. Execute o comando az keyvault create para criar um cofre de chaves no qual você possa armazenar uma chave gerenciada pelo cliente para a criptografia do Registro.

  2. Por padrão, o novo cofre de chaves habilita automaticamente a configuração de exclusão temporária. Para evitar a perda de dados por exclusões acidentais de chave ou cofre de chaves, recomendamos habilitar também a configuração de proteção contra limpeza:

    az keyvault create --name <key-vault-name> \
      --resource-group <resource-group-name> \
      --enable-purge-protection
    
  3. Para conveniência, anote a ID do recurso do cofre de chaves e armazene o valor em variáveis de ambiente:

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

Habilitar serviços confiáveis para acessar o cofre de chaves

Se o cofre de chaves estiver protegido com um firewall ou uma rede virtual (ponto de extremidade privado), você deverá habilitar as configurações de rede para permitir o acesso por serviços confiáveis do Azure. Para obter mais informações, confira Definir configurações de rede do Azure Key Vault.

Habilitar identidades gerenciadas para acessar o cofre de chaves

Há duas maneiras de habilitar identidades gerenciadas para acessar seu cofre de chaves.

A primeira opção é configurar a política de acesso para o cofre de chaves e definir permissões de chave para acessar com uma identidade gerenciada atribuída pelo usuário:

  1. Execute o comando az keyvault set policy. Passe o valor de variável de ambiente criado e armazenado anteriormente de principalID.

  2. Defina permissões de chave para 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
    
    

A segunda opção é usar o RBAC (controle de acesso baseado em função) do Azure para atribuir permissões à identidade gerenciada atribuída pelo usuário e acessar o cofre de chaves. Execute o comando az role assignment create e atribua a função Key Vault Crypto Service Encryption User a uma identidade gerenciada atribuída pelo usuário:

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

Criar uma chave e obter a ID da chave

  1. Execute o comando az keyvault key create para criar uma chave no cofre de chaves:

    az keyvault key create \
      --name <key-name> \
      --vault-name <key-vault-name>
    
  2. Na saída do comando, anote a ID da chave, (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 sua conveniência, armazene o formato escolhido para a ID de chave na variável de ambiente $keyID. Você pode usar uma ID de chave com ou sem versão.

Alteração de chaves

Você pode escolher a rotação manual ou automática de chaves.

Criptografar um Registro com uma chave gerenciada pelo cliente com uma versão de chave só permitirá rotação manual de chaves no Registro de Contêiner do Azure. Este exemplo armazena a propriedade kid da chave:

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

Criptografar um Registro com uma chave gerenciada pelo cliente omitindo uma versão de chave permitirá que a rotação automática de chaves detecte uma nova versão de chave no Azure Key Vault. Este exemplo remove a versão da propriedade kid da chave:

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

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

Criar um Registro com uma chave gerenciada pelo cliente

  1. Execute o comando az acr create para criar um Registro na camada de serviço Premium e habilitar a chave gerenciada pelo cliente.

  2. Passe os valores da ID da identidade gerenciada (id) e da ID da chave (kid) armazenados nas variáveis de ambiente nas etapas anteriores:

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

Mostrar o status de criptografia

Execute o comando az acr encryption show para mostrar o status da criptografia do Registro com uma chave gerenciada pelo cliente:

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

Dependendo da chave usada para criptografar o Registro, a saída será semelhante a:

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

Habilitar uma chave gerenciada pelo cliente usando o portal do Azure

Criar uma identidade gerenciada atribuída ao usuário

Para criar uma identidade gerenciada atribuída pelo usuário para os recursos do Azure no portal do Azure:

  1. Siga as etapas para criar uma identidade atribuída pelo usuário.

  2. Salve o nome da identidade para usá-lo em etapas posteriores.

Captura de tela das opções para criar uma identidade atribuída pelo usuário no portal do Azure.

Criar um cofre de chave

  1. Siga as etapas no Início Rápido: criar um cofre de chaves usando o portal do Azure.

  2. Ao criar um cofre de chaves para uma chave gerenciada pelo cliente, na guia Informações Básicas, habilite as configurações de Proteção contra limpeza. Essa configuração ajuda a evitar a perda de dados de exclusão acidental de chaves ou cofres de chaves.

    Captura de tela das opções para criar um cofre de chaves no portal do Azure.

Habilitar serviços confiáveis para acessar o cofre de chaves

Se o cofre de chaves estiver protegido com um firewall ou uma rede virtual (ponto de extremidade privado), habilite a configuração de rede para permitir o acesso por serviços confiáveis do Azure. Para obter mais informações, confira Definir configurações de rede do Azure Key Vault.

Habilitar identidades gerenciadas para acessar o cofre de chaves

Há duas maneiras de habilitar identidades gerenciadas para acessar seu cofre de chaves.

A primeira opção é configurar a política de acesso para o cofre de chaves e definir permissões de chave para acessar com uma identidade gerenciada atribuída pelo usuário:

  1. Acesse seu cofre de chaves.
  2. Selecione Configurações>Políticas de acesso > +Adicionar política de acesso.
  3. Selecione Permissões de chave e Obter, Desencapsular Chave e Encapsular Chave.
  4. Em Selecionar entidade de segurança, selecione o nome do recurso da identidade gerenciada atribuída ao usuário.
  5. Selecione Adicionar e depois Salvar.

Captura de tela das opções para criar uma política de acesso do cofre de chaves.

A outra opção é atribuir a função RBAC Key Vault Crypto Service Encryption User à identidade gerenciada atribuída pelo usuário no escopo do cofre de chaves. Para obter etapas detalhadas, confira Atribuir funções do Azure usando o portal do Azure.

Criar uma chave

Crie uma chave no cofre de chaves e use-a para criptografar o Registro. Siga estas etapas se deseja selecionar uma versão de chave específica como uma chave gerenciada pelo cliente. Talvez você também precise criar uma chave antes de criar o Registro se o acesso ao cofre de chaves for restrito a um ponto de extremidade privado ou a redes selecionadas.

  1. Acesse seu cofre de chaves.
  2. Selecione Configurações>Chaves.
  3. Selecione +Gerar/Importar e insira um nome exclusivo para a chave.
  4. Aceite os valores padrão restantes e selecione Criar.
  5. Depois de criada, selecione a chave e selecione a versão atual. Copie o Identificador de chave para a versão de chave.

Criar um registro de contêiner

  1. Selecione Criar um recurso>Contêineres>Registro de Contêiner.
  2. Na guia Informações Básicas, selecione ou crie um grupo de recursos e insira o nome do Registro. Em SKU, selecione Premium.
  3. Na guia Criptografia, em Chave gerenciada pelo cliente, selecione Habilitada.
  4. Para Identidade, escolha a identidade gerenciada que você criou.
  5. Para Criptografia, escolha uma das seguintes opções:
    • Escolha Selecionar do Key Vault e selecione um cofre de chaves e chave existentes ou Criar outro. A chave selecionada não tem controle de versão e habilita a rotação de chaves automática.
    • Selecione Inserir URI da chavee forneça o identificador de uma chave existente. Você pode fornecer um URI de chave com controle de versão (para uma chave que deve ser girada manualmente) ou um URI de chave sem controle de versão (que habilita a rotação de chaves automática). Consulte a seção anterior para ver as etapas de criação de chaves.
  6. Selecione Examinar + criar.
  7. Escolha Criar para implantar a instância do Registro.

Captura de tela que mostra as opções para criar um Registro criptografado no portal do Azure.

Mostrar o status de criptografia

Para ver o status de criptografia do Registro no portal, navegue até o Registro. Em Configurações, selecione Criptografia.

Habilitar uma chave gerenciada pelo cliente usando um modelo do Resource Manager

Você pode usar um modelo do Resource Manager para criar um Registro de contêiner e habilitar a criptografia com uma chave gerenciada pelo cliente:

  1. Copie o seguinte conteúdo de um modelo do Resource Manager para um novo arquivo e salve-o 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 as etapas das seções anteriores para criar os seguintes recursos:

    • Cofre de chaves, identificado pelo nome
    • Chave do cofre de chaves, identificada pela ID da chave
  3. Execute o comando az deployment group create para criar o Registro usando o arquivo de modelo anterior. Quando indicado, forneça um novo nome de Registro e um nome de identidade gerenciada atribuída pelo usuário, bem como o nome do cofre de chaves e a ID da chave que você criou.

    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. Execute o comando az acr encryption show para mostrar o status de criptografia do Registro:

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

Próximas etapas

Avance para o próximo artigo para ver como é feita a rotação de chaves gerenciadas pelo cliente, a atualização de versões de chave e a revogação de uma chave gerenciada pelo cliente.