Encriptar dados de implementação

Ao executar recursos Azure Container Instances (ACI) na cloud, o serviço ACI recolhe e mantém os dados relacionados com os contentores. O ACI encripta automaticamente estes dados quando são mantidos na cloud. Esta encriptação protege os seus dados para ajudar a cumprir os compromissos de segurança e conformidade da sua organização. O ACI também lhe dá a opção de encriptar estes dados com a sua própria chave, dando-lhe um maior controlo sobre os dados relacionados com as implementações do ACI.

Acerca da encriptação de dados do ACI

Os dados no ACI são encriptados e desencriptados com a encriptação AES de 256 bits. Está ativado para todas as implementações do ACI e não precisa de modificar a implementação ou os contentores para tirar partido desta encriptação. Isto inclui metadados sobre a implementação, variáveis de ambiente, chaves que estão a ser transmitidas para os seus contentores e registos persistentes após a paragem dos contentores para que possa continuar a vê-los. A encriptação não afeta o desempenho do grupo de contentores e não existe nenhum custo adicional para a encriptação.

Pode depender de chaves geridas pela Microsoft para a encriptação dos seus dados de contentor ou pode gerir a encriptação com as suas próprias chaves. A tabela seguinte compara estas opções:

Chaves geridas pela Microsoft Chaves geridas pelo cliente
Operações de encriptação/desencriptação Azure Azure
Armazenamento de chaves Arquivo de chaves da Microsoft Azure Key Vault
Responsabilidade de rotação de chaves Microsoft Cliente
Acesso à chave Apenas Microsoft Microsoft, Cliente

Este artigo analisa dois fluxos para encriptar dados com uma chave gerida pelo cliente:

  • Encriptar dados com uma chave gerida pelo cliente armazenada num Key Vault padrão do Azure
  • Encriptar dados com uma chave gerida pelo cliente armazenada numa Key Vault do Azure protegida pela rede com os Serviços Fidedignos ativados.

Encriptar dados com uma chave gerida pelo cliente armazenada num Key Vault padrão do Azure

Pré-requisitos

Criar Principal de Serviço para a ACI

O primeiro passo é garantir que o inquilino do Azure tem um principal de serviço atribuído para conceder permissões ao serviço Azure Container Instances.

Importante

Para executar o seguinte comando e criar um principal de serviço com êxito, confirme que tem permissões para criar principais de serviço no seu inquilino.

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

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

O resultado da execução deste comando deve mostrar-lhe um principal de serviço que foi configurado com "displayName": "Azure Container Instance Service".

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

  • confirme que tem permissões para o fazer no seu inquilino
  • verifique se já existe um principal de serviço no seu inquilino para implementar no ACI. Pode fazê-lo ao executar az ad sp show --id 6bb8e274-af5d-4df2-98a3-4fd78b4cafd9 e utilizar esse principal de serviço

Criar um recurso Key Vault

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

Para as propriedades do cofre de chaves, utilize 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 introduza um nome de grupo de recursos.
  • No menu pendente Localização, selecione uma localização.
  • Pode deixar as outras opções nas predefinições ou escolher com base em requisitos adicionais.

Importante

Ao utilizar chaves geridas pelo cliente para encriptar um modelo de implementação do ACI, recomenda-se que as duas propriedades seguintes sejam definidas no cofre de chaves, Eliminação Recuperável e Não Remover. Estas propriedades não estão ativadas por predefinição, mas podem ser ativadas com o PowerShell ou a CLI do Azure num cofre de chaves novo ou existente.

Gerar uma nova chave

Assim que o cofre de chaves for criado, navegue para o recurso no portal do Azure. No menu de navegação esquerdo do painel de recursos, em Definições, clique em Chaves. Na vista "Chaves", clique em "Gerar/Importar" para gerar uma nova chave. Utilize qualquer Nome exclusivo para esta chave e quaisquer outras preferências com base nos seus requisitos.

Gerar uma nova chave

Definir política de acesso

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

  • Assim que a chave tiver sido gerada, no painel de recursos do cofre de chaves, em Definições, clique em Políticas de Acesso.
  • Na página "Políticas de Acesso" do cofre de chaves, clique em Adicionar Política de Acesso.
  • Defina as Permissões de Chave para incluir permissões de chave Obter e Desembrulhar Conjunto de Chaves
  • Em Selecionar Principal, selecione Azure Container Instance Service
  • Clique em Adicionar na parte inferior

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

Nova política de acesso

Modificar o modelo de implementação JSON

Importante

A encriptação de dados de implementação com uma chave gerida pelo cliente está disponível na versão mais recente da API (2019-12-01) que está atualmente a ser implementada. Especifique esta versão da API no seu modelo de implementação. Se tiver problemas com esta situação, contacte o Suporte do Azure.

Assim que a chave do cofre de chaves e a política de acesso estiverem configuradas, adicione as seguintes propriedades ao modelo de implementação do ACI. Saiba mais sobre como implementar recursos do ACI com um modelo no Tutorial: Implementar um grupo de vários contentores com um modelo de Resource Manager.

  • Em resources, defina apiVersion como 2019-12-01.
  • Na secção de propriedades do grupo de contentores do modelo de implementação, adicione um encryptionProperties, que contém os seguintes valores:
    • vaultBaseUrl: o Nome DNS do cofre de chaves pode ser encontrado no painel de descrição geral do recurso do cofre de chaves no Portal
    • keyName: o nome da chave gerada anteriormente
    • keyVersion: a versão atual da chave. Pode encontrá-lo ao clicar na própria chave (em "Chaves" na secção Definições do recurso do cofre de chaves)
  • Nas propriedades do grupo de contentores, adicione uma sku propriedade com o valor Standard. A sku propriedade é necessária na versão de API 2019-12-01.

O fragmento de modelo seguinte mostra estas propriedades adicionais para encriptar os dados de implementaçã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": {
                [...]
            }
        }
    }
]

Segue-se um modelo completo, adaptado a partir do modelo no Tutorial: Implementar um grupo de vários contentores com um modelo de 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]"
    }
  }
}

Implementar os seus recursos

Se criou e editou o ficheiro de modelo no seu ambiente de trabalho, pode carregá-lo para o seu diretório Cloud Shell ao arrastar o ficheiro para o mesmo.

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. Assim que a implementação for concluída, todos os dados relacionados com a mesma persistentes pelo serviço ACI serão encriptados com a chave que forneceu.

Encriptar dados com uma chave gerida pelo cliente numa rede protegida pelo Azure Key Vault com os Serviços Fidedignos ativados

Criar um recurso Key Vault

Crie um Key Vault do Azure com portal do Azure, CLI do Azure ou Azure PowerShell. Para começar, não aplique quaisquer limitações de rede para que possamos adicionar as chaves necessárias ao cofre. Nos passos seguintes, vamos adicionar limitações de rede e ativar serviços fidedignos.

Para as propriedades do cofre de chaves, utilize 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 introduza um nome de grupo de recursos.
  • No menu pendente Localização, selecione uma localização.
  • Pode deixar as outras opções nas predefinições ou escolher com base em requisitos adicionais.

Importante

Ao utilizar chaves geridas pelo cliente para encriptar um modelo de implementação do ACI, recomenda-se que as duas propriedades seguintes sejam definidas no cofre de chaves, Eliminação Recuperável e Não Remover. Estas propriedades não estão ativadas por predefinição, mas podem ser ativadas com o PowerShell ou a CLI do Azure num cofre de chaves novo ou existente.

Gerar uma nova chave

Assim que o cofre de chaves for criado, navegue para o recurso no portal do Azure. No menu de navegação esquerdo do painel de recursos, em Definições, clique em Chaves. Na vista de "Chaves", clique em "Gerar/Importar" para gerar uma nova chave. Utilize qualquer Nome exclusivo para esta chave e quaisquer outras preferências com base nos seus requisitos. Certifique-se de que captura o nome e a versão da chave para os passos subsequentes.

Captura de ecrã a mostrar as principais definições de criação, PNG.

Criar uma identidade gerida atribuída pelo utilizador para o grupo de contentores

Crie uma identidade na sua subscrição com o comando az identity create . Pode utilizar o mesmo grupo de recursos utilizado para criar o cofre de chaves ou utilizar outro.

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

Para utilizar a identidade nos seguintes passos, utilize o comando az identity show para armazenar o ID do principal de serviço da identidade e o ID do 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 nova política de acesso para permitir que a identidade atribuída pelo utilizador aceda e desembrulha a sua chave para fins 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 seguintes comandos configuram um Azure Firewall para o seu Key Vault do Azure e permitem o acesso dos Serviços Fidedignos do Azure, como o ACI.

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

Modificar o modelo de implementação JSON

Importante

A encriptação de dados de implementação com uma chave gerida 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 através do ARM ou rest. Se tiver algum problema com isto, contacte o Suporte do Azure. Assim que a chave do cofre de chaves e a política de acesso estiverem configuradas, adicione as seguintes propriedades ao modelo de implementação do ACI. Saiba mais sobre como implementar recursos do ACI com um modelo no Tutorial: Implementar um grupo de vários contentores com um modelo de Resource Manager.

  • Em resources, defina apiVersion como 2022-09-01.
  • Na secção de propriedades do grupo de contentores do modelo de implementação, adicione um encryptionProperties, que contém os seguintes valores:
    • vaultBaseUrl: o Nome DNS do cofre de chaves. Isto pode ser encontrado no painel de descrição geral do recurso do cofre de chaves no Portal
    • keyName: o nome da chave gerada anteriormente
    • keyVersion: a versão atual da chave. Isto pode ser encontrado clicando na própria chave (em "Chaves" na secção Definições do recurso do cofre de chaves)
    • identity: este é o URI de recurso da instância de Identidade Gerida criada anteriormente
  • Nas propriedades do grupo de contentores, adicione uma sku propriedade com o valor Standard. A sku propriedade é necessária na versão 2022-09-01 da API.
  • Em recursos, adicione o identity objeto necessário para utilizar a Identidade Gerida com o ACI, que contém os seguintes valores:
    • type: o tipo de identidade que está a ser utilizada (atribuída pelo utilizador ou atribuída pelo sistema). Este caso será definido como "UserAssigned"
    • userAssignedIdentities: o resourceURI da mesma identidade atribuída pelo utilizador utilizada acima no encryptionProperties objeto.

O fragmento de modelo seguinte mostra estas propriedades adicionais para encriptar dados de implementaçã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": {
                [...]
            }
        }
    }
]

Segue-se um modelo completo, adaptado a partir do modelo no Tutorial: Implementar um grupo de vários contentores com um modelo de 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]"
    }
  }
}

Implementar os seus recursos

Se criou e editou o ficheiro de modelo no seu ambiente de trabalho, pode carregá-lo para o seu diretório Cloud Shell ao arrastar o ficheiro para o mesmo.

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. Assim que a implementação for concluída, todos os dados relacionados com a mesma persistentes pelo serviço ACI serão encriptados com a chave que forneceu.