Criptografar dados de implantação

Quando você executa recursos das ACIs (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 automaticamente esses dados quando eles persistem 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.

Criptografia de dados de 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. Essa cobertura inclui metadados sobre a implantação, variáveis de ambiente, chaves passadas para seus contêineres e logs persistiram depois que os contêineres são interrompidos para que você ainda possa vê-los. A criptografia não afeta o desempenho do grupo de contêineres e não gera custos adicionais.

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.

Para configurar o SP ACI em seu ambiente do Azure, execute o seguinte comando da CLI:

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

Depois da execução, a saída desse comando deve mostrar uma entidade de serviço 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 sucesso:

  • 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, selecione Chaves. Na exibição de "Chaves", selecione "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.

  • Após a geração da chave, na folha de recursos do cofre de chaves, em Configurações, selecione Políticas de Acesso.
  • Na página "Políticas de Acesso" do cofre de chaves, escolha 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
  • Selecione 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, encontrado na folha 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. Esse campo pode ser encontrado ao acessar a 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 adicionarmos 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, selecione Chaves. Na exibição de "Chaves", escolha "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. Essa propriedade pode ser encontrada 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. Essa propriedade pode ser encontrada ao clicar na chave em si (em "Chaves" na seção de Configurações do recurso do cofre de chaves)
    • identity: essa propriedade é 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, é definido como "UserAssigned"
    • userAssignedIdentities: o resourceURI da mesma identidade atribuída pelo usuário usada 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.