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. Esta cobertura inclui metadados sobre a implantação, variáveis de ambiente, chaves que são passadas para os seus contêineres e logs que são persistidos após os contêineres serem 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 gerenciadas 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 na 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 você estiver executando no Windows ou macOS, considere executar a CLI do Azure em um contêiner do 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 az version para descobrir a versão e as bibliotecas dependentes que estão instaladas. Para atualizar para a versão mais recente, execute az upgrade.

Criar principal de serviço para ACI

A primeira etapa é garantir que o seu Azure tenant tenha um principal de serviço atribuído para conceder permissões ao serviço Azure Container Instances.

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 um principal de serviço configurado com "displayName": "Azure Container Instance Service".

Caso não consiga criar o principal 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 em vez disso.

Criar um recurso do Azure Key Vault

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

Para as propriedades do seu 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 suspenso Local, selecione um local.
  • Você pode deixar as outras opções nos seus valores padrão ou escolher com base em requisitos adicionais.

Importante

Quando se utilizam chaves geridas pelo cliente para criptografar um modelo de implantação ACI, recomenda-se que as duas propriedades seguintes sejam definidas no cofre de chaves, Eliminação suave e Não expurgar. 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

Após o cofre de chaves ser 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 consultando a própria chave (em "Chaves" na secção Configurações do recurso do seu 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]"
    }
  }
}

Desdobre 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

Implemente o modelo predefinido 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 as propriedades do seu 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 suspenso Localização, escolha uma localização.
  • Você pode manter as outras opções nos seus valores padrão ou escolher com base em requisitos adicionais.

Importante

Ao usar chaves geridas pelo cliente para criptografar um modelo de implementação ACI, é recomendável que as seguintes duas propriedades sejam definidas no cofre de chaves: Eliminação suave e Não purgar. 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

Assim que o cofre de chaves for criado, navegue até ao 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 utilizar a identidade nos passos seguintes, utilize o comando az identity show para guardar nas variáveis o ID da entidade de serviço e o ID do recurso associados à identidade.

# 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 utilizador aceda e desencapsule a sua chave de encriptação.

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 repositório de chaves. Esta propriedade pode ser encontrada no painel 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]"
    }
  }
}

Desdobre os 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

Implemente 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.