Partilhar via


Encriptar dados de implementação

Quando você executa recursos de Instâncias de Contêiner do Azure (ACI) na nuvem, o serviço ACI coleta e persiste dados relacionados aos seus contêineres. O ACI criptografa automaticamente esses dados quando eles persistem na nuvem. Essa criptografia protege seus dados para ajudar a cumprir os compromissos de segurança e conformidade da sua organização. O ACI também oferece a opção de criptografar esses dados com sua própria chave, oferecendo maior controle sobre os dados relacionados às implantações do ACI.

Encriptação de dados ACI

Os dados no ACI são criptografados e descriptografados usando criptografia AES de 256 bits. Ele 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 sendo passadas para seus contêineres e logs persistentes 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 há mais custos para a criptografia.

Você pode confiar em chaves gerenciadas pela Microsoft para a criptografia de seus dados de contêiner ou pode gerenciar a criptografia com suas próprias chaves. A tabela a seguir compara essas opções:

Chaves geridas pela Microsoft Chaves geridas pelo cliente
Operações de encriptação/desencriptação Azure Azure
Armazenamento de chaves Armazenamento de chaves da Microsoft Azure Key Vault
Responsabilidade pela rotação de chaves Microsoft Cliente
Chave de acesso Apenas 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 Cofre de Chaves do Azure padrão
  • Criptografe dados com uma chave gerenciada pelo cliente armazenada em um Cofre de Chaves do Azure protegido pela rede com os Serviços Confiáveis habilitados.

Criptografar dados com uma chave gerenciada pelo cliente armazenada em um Cofre de Chaves do Azure padrão

Pré-requisitos

  • Use o ambiente Bash no Azure Cloud Shell. Para obter mais informações, consulte Guia de início rápido para Bash no Azure Cloud Shell.

  • Se preferir executar comandos de referência da CLI localmente, instale a CLI do Azure. Se estiver a utilizar o Windows ou macOS, considere executar a CLI do Azure num contentor Docker. Para obter mais informações, consulte Como executar a CLI do Azure em um contêiner do Docker.

    • Se estiver a utilizar uma instalação local, inicie sessão no CLI do Azure ao utilizar o comando az login. Para concluir o processo de autenticação, siga os passos apresentados no seu terminal. Para outras opções de entrada, consulte Entrar com a CLI do Azure.

    • Quando solicitado, instale a extensão da CLI do Azure na primeira utilização. Para obter mais informações sobre as extensões, veja Utilizar extensões com o CLI do Azure.

    • Execute o comando az version para localizar a versão e as bibliotecas dependentes instaladas. Para atualizar para a versão mais recente, execute o comando az upgrade.

Criar entidade de serviço para 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 comando da CLI a seguir configura a controladora de armazenamento 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 configurada com "displayName": "Azure Container Instance Service".

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

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

Criar um recurso do Cofre da Chave

Crie um Cofre da Chave do Azure usando o portal do Azure, a CLI do Azure ou o Azure PowerShell.

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

  • Nome: é necessário um nome exclusivo.
  • Subscrição: selecione uma subscrição.
  • Em Grupo de Recursos, escolha um grupo de recursos existente ou crie um novo e insira um nome de grupo de recursos.
  • No menu pendente Localização, selecione uma localização.
  • 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 ACI, é recomendável que as duas propriedades a seguir sejam definidas no cofre de chaves, Exclusão suave e Não limpar. Essas propriedades não sã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 da chave for criado, navegue até o recurso no portal do Azure. No menu de navegação esquerdo da folha de recursos, em Configurações, selecione Teclas. Na visualização de "Chaves", selecione "Gerar/Importar" para gerar uma nova chave. Use qualquer Nome exclusivo para essa chave e quaisquer outras preferências com base em suas necessidades.

Gerar uma nova chave

Definir política de acesso

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

  • Assim que a chave for gerada, volte à 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 política de acesso.
  • Defina as Permissões de Chave para incluir Obter e Desembrulhar ChaveDefinir permissões de chave
  • Para Selecionar Principal, selecione Serviço de Instância de Contêiner do Azure
  • Selecione Adicionar na parte inferior

A política de acesso deve agora 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 (2019-12-01) que está sendo implementada atualmente. Especifique essa versão da API em seu modelo de implantação. Se você tiver algum problema com isso, entre em contato com o Suporte do Azure.

Depois que a chave do cofre de chaves e a política de acesso estiverem configuradas, adicione as seguintes propriedades ao seu modelo de implantação ACI. Saiba mais sobre como implantar recursos ACI com um modelo no Tutorial: Implantar um grupo de vários contêineres usando um modelo do Gerenciador de Recursos.

  • Em resources, defina apiVersion como 2019-12-01.
  • Na seção de 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 seu cofre de chaves, que 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. Este campo pode ser encontrado entrando na própria chave (em "Chaves" na seção Configurações do seu recurso do cofre de chaves)
  • Nas propriedades do grupo de contêineres, adicione uma sku propriedade com valor Standard. A sku propriedade é necessária na versão da API 2019-12-01.

O trecho de modelo a seguir mostra essas propriedades adicionais para criptografar 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 Gerenciador de Recursos.

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

Implante seus recursos

Se você criou e editou o arquivo de modelo em sua área de trabalho, poderá carregá-lo para o diretório do 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

Dentro de alguns segundos, deverá receber uma resposta inicial do Azure. Quando a implantação for concluída, todos os dados relacionados a ela persistidos pelo serviço ACI serão criptografados com a chave fornecida.

Criptografar dados com uma chave gerenciada pelo cliente em um Cofre de Chaves do Azure protegido pela rede com Serviços Confiáveis habilitados

Criar um recurso do Cofre da Chave

Crie um Cofre da Chave do Azure 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, adicionamos limitações de rede e habilitamos serviços confiáveis.

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

  • Nome: é necessário um nome exclusivo.
  • Subscrição: selecione uma subscrição.
  • Em Grupo de Recursos, escolha um grupo de recursos existente ou crie um novo e insira um nome de grupo de recursos.
  • No menu pendente Localização, selecione uma localização.
  • 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 ACI, é recomendável que as duas propriedades a seguir sejam definidas no cofre de chaves, Exclusão suave e Não limpar. Essas propriedades não sã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 da chave for criado, navegue até o recurso no portal do Azure. No menu de navegação esquerdo da folha de recursos, em Configurações, selecione Teclas. Na visualização de "Chaves", escolha "Gerar/Importar" para gerar uma nova chave. Use qualquer Nome exclusivo para essa chave e quaisquer outras preferências com base em suas necessidades. 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 chaves, 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 o ID da entidade de serviço e o ID do recurso da identidade 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 nova política de acesso para permitir que a identidade atribuída pelo usuário acesse e desembrulhe 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 Cofre de Chaves do Azure e permitem o Azure Trusted Services, como acesso ACI.

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 da API 2022-09-01 ou mais recente. A versão da API 2022-09-01 só está disponível via ARM ou REST. Se você tiver algum problema com isso, entre em contato com o Suporte do Azure. Depois que a chave do cofre de chaves e a política de acesso estiverem configuradas, adicione as seguintes propriedades ao seu modelo de implantação ACI. Saiba mais sobre como implantar recursos ACI com um modelo no Tutorial: Implantar um grupo de vários contêineres usando um modelo do Gerenciador de Recursos.

  • Em resources, defina apiVersion como 2022-09-01.
  • Na seção de 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 da chave. Esta propriedade pode ser encontrada na folha de visão geral do recurso de cofre de chaves no Portal
    • keyName: o nome da chave gerada anteriormente
    • keyVersion: a versão atual da chave. Esta propriedade pode ser encontrada clicando na própria chave (em "Chaves" na seção Configurações do recurso do cofre de chaves)
    • identity: esta propriedade é o URI de recurso da instância de Identidade Gerenciada criada anteriormente
  • Nas propriedades do grupo de contêineres, adicione uma sku propriedade com valor Standard. A sku propriedade é necessária na versão da API 2022-09-01.
  • Em recursos, adicione o objeto necessário para usar a identity Identidade Gerenciada com ACI, que contém os seguintes valores:
    • type: o tipo de identidade que está sendo usada (atribuída pelo usuário ou atribuída pelo sistema). Este caso é definido como "UserAssigned"
    • userAssignedIdentities: o resourceURI da mesma identidade atribuída pelo usuário usada no encryptionProperties objeto.

O trecho de modelo a seguir mostra essas propriedades adicionais para criptografar 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 Gerenciador de Recursos.

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

Implante seus recursos

Se você criou e editou o arquivo de modelo em sua área de trabalho, poderá carregá-lo para o diretório do 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

Dentro de alguns segundos, deverá receber uma resposta inicial do Azure. Quando a implantação for concluída, todos os dados relacionados a ela persistidos pelo serviço ACI serão criptografados com a chave fornecida.