Criptografar dados de implantação

Ao executar recursos de ACI (Instâncias de Contêiner do Azure) na nuvem, o serviço de ACI coleta e mantém os dados relacionados aos seus contêineres. A ACI criptografa esses dados automaticamente quando eles são persistidos na nuvem. Essa criptografia protege seus dados e ajuda a atender aos compromissos de conformidade e segurança de sua organização. A ACI também oferece a opção de criptografar esses dados com sua chave, proporcionando a você maior controle sobre os dados relacionados às implantações da ACI.

Sobre a criptografia de dados do ACI

Os dados na ACI são criptografados e descriptografados usando a criptografia AES de 256 bits. Esse recurso está habilitado para todas as implantações de ACI e você não precisa modificar sua implantação ou contêineres para aproveitar essa criptografia. Isso inclui metadados sobre a implantação, as variáveis de ambiente, as chaves que estão sendo passadas para seus contêineres e os logs persistiram depois que os contêineres são interrompidos para que você possa vê-los. A criptografia não afeta o desempenho do grupo de contêineres, e não há nenhum custo adicional para a criptografia.

Você pode contar com as chaves gerenciadas pela Microsoft para a criptografia dos seus dados do contêiner ou pode gerenciar a criptografia com as próprias chaves. A seguinte tabela compara estas opções:

Chaves gerenciadas pela Microsoft Chaves gerenciadas pelo cliente
Operações de criptografia/descriptografia Azure Azure
Armazenamento de chave Repositório de chaves da Microsoft Cofre de Chave do Azure
Responsabilidade de rotação de chave Microsoft Cliente
Acesso à chave Somente Microsoft Microsoft, Cliente

Este artigo analisa dois fluxos para criptografar dados com uma chave gerenciada pelo cliente:

  • Criptografar dados com uma chave gerenciada pelo cliente armazenada em um Azure Key Vault padrão
  • Criptografe dados com uma chave gerenciada pelo cliente armazenada em um Azure Key Vault protegido pela rede com Serviços Confiáveis habilitados.

Criptografar dados com uma chave gerenciada pelo cliente armazenada em um Azure Key Vault padrão

Pré-requisitos

Criar uma entidade de serviço para o ACI

A primeira etapa é garantir que seu locatário do Azure tenha uma entidade de serviço atribuída para conceder permissões ao serviço de Instâncias de Contêiner do Azure.

Importante

Para executar o comando a seguir e criar uma entidade de serviço com êxito, confirme se você tem permissões para criar entidades de serviço em seu locatário.

O seguinte comando da CLI configurará o SP ACI em seu ambiente do Azure:

az ad sp create --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9

A saída da execução deste comando deve mostrar uma entidade de serviço que foi configurada com "displayName": "Serviço de Instância de Contêiner do Azure".

Caso você não consiga criar a entidade de serviço com êxito:

  • confirme se você tem permissões para fazer isso em seu locatário
  • verifique se já existe uma entidade de serviço em seu locatário para implantar na ACI. Você pode fazer isso executando az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9 e usando essa entidade de serviço em vez disso

Crie um recurso do Key Vault

Crie um Azure Key Vault usando o portal do Azure, a CLI do Azure ou o Azure PowerShell.

Para ver as propriedades do cofre de chaves, use as seguintes diretrizes:

  • Name: um nome exclusivo é necessário.
  • Assinatura: Escolha uma assinatura.
  • Em Grupo de Recursos: selecione um grupo de recursos existente ou crie e insira um nome para o grupo de recursos.
  • No menu suspenso Local, escolha um local.
  • Você pode deixar as outras opções para seus padrões ou escolher com base em requisitos adicionais.

Importante

Ao usar chaves gerenciadas pelo cliente para criptografar um modelo de implantação de ACI, é recomendável que as duas propriedades a seguir sejam definidas no cofre de chaves, Exclusão Temporária e Não Limpar. Essas propriedades não estão habilitadas por padrão, mas podem ser habilitadas usando o PowerShell ou a CLI do Azure em um cofre de chaves novo ou existente.

Gerar uma nova chave

Depois que o cofre de chaves for criado, navegue até o recurso no portal do Azure. No menu de navegação à esquerda da folha de recursos, em Configurações, clique em Chaves. Na exibição de "Chaves", clique em "Gerar/Importar" para gerar uma nova chave. Use qualquer nome exclusivo para essa chave e outras preferências com base em seus requisitos.

Gerar uma nova chave

Definir política de acesso

Crie uma nova política de acesso para permitir que o serviço de ACI acesse sua Chave.

  • Depois que a chave tiver sido gerada, na folha de recursos do cofre de chaves, em Configurações, clique em Políticas de Acesso.
  • Na página "Políticas de Acesso" do cofre de chaves, clique em Adicionar a Política de Acesso.
  • Defina as Permissões de Chave para incluir Obter e Desencapsular chaveDefinir permissões de chave
  • Para Selecionar a Entidade de Segurança, selecione Serviço de Instância de Contêiner do Azure
  • Clique em Adicionar na parte inferior

A política de acesso agora deve aparecer nas políticas de acesso do cofre de chaves.

Nova política de acesso

Modificar seu modelo de implantação JSON

Importante

A criptografia de dados de implantação com uma chave gerenciada pelo cliente está disponível na versão mais recente da API (12/01/2019) que está sendo distribuída no momento. Especifique essa versão de API em seu modelo de implantação. Se você tiver problemas com isso, entre em contato com o suporte do Azure.

Depois que a chave do Cofre de Chaves e a política de acesso forem configuradas, adicione as propriedades a seguir ao modelo de implantação da ACI. Saiba mais sobre a implantação de recursos da ACI com um modelo no Tutorial: Implantar um grupo de vários contêineres usando um modelo do Resource Manager.

  • Em resources, defina apiVersion como 2019-12-01.
  • Na seção propriedades do grupo de contêineres do modelo de implantação, adicione um encryptionProperties, que contém os seguintes valores:
    • vaultBaseUrl: o Nome DNS do cofre de chaves pode ser encontrado na folha de visão geral do recurso do cofre de chaves no Portal
    • keyName: o nome da chave gerada anteriormente
    • keyVersion: a versão atual da chave. É possível encontrá-lo ao clicar na chave em si (em "Chaves" na seção de Configurações do recurso do cofre de chaves)
  • Nas propriedades do grupo de contêineres, adicione uma propriedade sku com o valor Standard. A propriedade sku é necessária na versão de API 2019-12-01.

O seguinte trecho de código de modelo mostra essas propriedades adicionais para criptografar os dados de implantação:

[...]
"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 seguir está um modelo completo, adaptado do modelo em Tutorial: Implantar um grupo de vários contêineres usando um modelo do 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]"
    }
  }
}

Implantar seus recursos

Se você criou e editou o arquivo de modelo em sua área de trabalho, é possível carregá-lo em seu diretório Cloud Shell arrastando o arquivo para ele.

Crie um grupo de recursos com o comando az group create.

az group create --name myResourceGroup --location eastus

Implante o modelo com o comando az deployment group create.

az deployment group create --resource-group myResourceGroup --template-file deployment-template.json

Em alguns segundos, você deverá receber uma resposta inicial do Azure. Depois que a implantação for concluída, todos os dados relacionados a ela persistidos pelo serviço de ACI serão criptografados com a chave que você forneceu.

Criptografar dados com uma chave gerenciada pelo cliente em um Azure Key Vault protegido pela rede com os Serviços Confiáveis habilitados

Crie um recurso do Key Vault

Crie um Azure Key Vault usando o portal do Azure, a CLI do Azure ou o Azure PowerShell. Para começar, não aplique nenhuma limitação de rede para que possamos adicionar as chaves necessárias ao cofre. Nas etapas subsequentes, adicionaremos limitações de rede e habilitaremos serviços confiáveis.

Para ver as propriedades do cofre de chaves, use as seguintes diretrizes:

  • Name: um nome exclusivo é necessário.
  • Assinatura: Escolha uma assinatura.
  • Em Grupo de Recursos: selecione um grupo de recursos existente ou crie e insira um nome para o grupo de recursos.
  • No menu suspenso Local, escolha um local.
  • Você pode deixar as outras opções para seus padrões ou escolher com base em requisitos adicionais.

Importante

Ao usar chaves gerenciadas pelo cliente para criptografar um modelo de implantação de ACI, é recomendável que as duas propriedades a seguir sejam definidas no cofre de chaves, Exclusão Temporária e Não Limpar. Essas propriedades não estão habilitadas por padrão, mas podem ser habilitadas usando o PowerShell ou a CLI do Azure em um cofre de chaves novo ou existente.

Gerar uma nova chave

Depois que o cofre de chaves for criado, navegue até o recurso no portal do Azure. No menu de navegação à esquerda da folha de recursos, em Configurações, clique em Chaves. Na exibição de "Chaves", clique em "Gerar/Importar" para gerar uma nova chave. Use qualquer nome exclusivo para essa chave e outras preferências com base em seus requisitos. Certifique-se de capturar o nome e a versão da chave para as etapas subsequentes.

Captura de tela das configurações de criação de chave, PNG.

Criar uma identidade gerenciada atribuída pelo usuário para seu grupo de contêineres

Crie uma identidade em sua assinatura usando o comando az identity create. Você pode usar o mesmo grupo de recursos usado para criar o cofre de chaves ou usar um diferente.

az identity create \
  --resource-group myResourceGroup \
  --name myACIId

Para usar a identidade nas etapas a seguir, use o comando az identity show para armazenar a ID da entidade de serviço da identidade e a ID de recurso em variáveis.

# Get service principal ID of the user-assigned identity
spID=$(az identity show \
  --resource-group myResourceGroup \
  --name myACIId \
  --query principalId --output tsv)

Definir política de acesso

Crie uma política de acesso para permitir que a identidade atribuída pelo usuário acesse e descreva sua chave para fins de criptografia.

az keyvault set-policy \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --object-id $spID \
    --key-permissions get unwrapKey

Modificar as permissões de rede do Azure Key Vault

Os comandos a seguir configuram um Firewall do Azure para seu Azure Key Vault e permitem que os Serviços Confiáveis do Azure, como a ACI, acessem.

az keyvault update \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --default-action Deny
az keyvault update \
    --name mykeyvault \
    --resource-group myResourceGroup \
    --bypass AzureServices

Modificar seu modelo de implantação JSON

Importante

A criptografia de dados de implantação com uma chave gerenciada pelo cliente está disponível na versão 2022-09-01 da API ou mais recente. A versão 2022-09-01 da API só está disponível via ARM ou REST. Se você tiver problemas com isso, entre em contato com o suporte do Azure. Depois que a chave do Cofre de Chaves e a política de acesso forem configuradas, adicione as propriedades a seguir ao modelo de implantação da ACI. Saiba mais sobre a implantação de recursos da ACI com um modelo no Tutorial: Implantar um grupo de vários contêineres usando um modelo do Resource Manager.

  • Em resources, defina apiVersion como 2022-09-01.
  • Na seção propriedades do grupo de contêineres do modelo de implantação, adicione um encryptionProperties, que contém os seguintes valores:
    • vaultBaseUrl: o nome DNS de seu cofre de chaves. Ele pode ser encontrado na folha de visão geral do recurso do cofre de chaves no Portal
    • keyName: o nome da chave gerada anteriormente
    • keyVersion: a versão atual da chave. É possível encontrá-lo ao clicar na chave em si (em "Chaves" na seção de Configurações do recurso do cofre de chaves)
    • identity: este é o URI do recurso da instância da Identidade Gerenciada criada anteriormente
  • Nas propriedades do grupo de contêineres, adicione uma propriedade sku com o valor Standard. A propriedade sku é necessária na versão 2022-09-01 da API.
  • Em recursos, adicione o objeto identity necessário para usar a Identidade Gerenciada com a ACI, que contém os seguintes valores:
    • type: o tipo da identidade que está sendo usada (atribuída pelo usuário ou atribuída pelo sistema). Nesse caso, será definido como "UserAssigned"
    • userAssignedIdentities: o resourceURI da mesma identidade atribuída pelo usuário usada acima no objeto encryptionProperties.

O seguinte trecho de código de modelo mostra essas propriedades adicionais para criptografar os dados de implantação:

[...]
"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 seguir está um modelo completo, adaptado do modelo em Tutorial: Implantar um grupo de vários contêineres usando um modelo do 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]"
    }
  }
}

Implantar seus recursos

Se você criou e editou o arquivo de modelo em sua área de trabalho, é possível carregá-lo em seu diretório Cloud Shell arrastando o arquivo para ele.

Crie um grupo de recursos com o comando az group create.

az group create --name myResourceGroup --location eastus

Implante o modelo com o comando az deployment group create.

az deployment group create --resource-group myResourceGroup --template-file deployment-template.json

Em alguns segundos, você deverá receber uma resposta inicial do Azure. Depois que a implantação for concluída, todos os dados relacionados a ela persistidos pelo serviço de ACI serão criptografados com a chave que você forneceu.