Tutorial: Preparar uma implantação para um contêiner confidencial em instâncias de contêiner do Azure

Em Instâncias de Contêiner do Azure, você pode usar contêineres confidenciais na plataforma sem servidor para executar aplicativos de contêiner em um ambiente de execução confiável (TEE) baseado em hardware e atestado. Esse recurso pode ajudar a proteger os dados em uso e fornece criptografia na memória por meio da Paginação Aninhada Segura.

Neste tutorial, irá aprender a:

  • Crie um modelo do Azure Resource Manager (modelo ARM) para um grupo de contêineres confidencial.
  • Gere uma política de aplicação de computação confidencial (CCE).
  • Implante o grupo de contêineres confidenciais no Azure.

Pré-requisitos

Para concluir este tutorial, você deve satisfazer os seguintes requisitos:

  • CLI do Azure: Você deve ter a CLI do Azure versão 2.44.1 ou posterior instalada em seu computador local. Para encontrar a sua versão, execute az --version. Se precisar de instalar ou atualizar, veja Instalar a CLI do Azure.

  • Extensão confcom da CLI do Azure: você deve ter a versão 0.30+ da extensão confcom da CLI do Azure instalada para gerar políticas de imposição de computação confidenciais.

    az extension add -n confcom
    
  • Docker: Você precisa do Docker instalado localmente. O Docker oferece pacotes que configuram o ambiente do Docker no macOS, no Windows e no Linux.

    Este tutorial pressupõe uma compreensão básica dos principais conceitos do Docker, como contêineres, imagens de contêiner e comandos básicos docker . Para um manual de noções básicas do Docker e do contentor, veja a descrição geral do Docker.

Importante

Como o Azure Cloud Shell não inclui o daemon do Docker, você deve instalar a CLI do Azure e o Docker Engine em seu computador local para concluir este tutorial. Você não pode usar o Azure Cloud Shell para este tutorial.

Criar um modelo ARM para um grupo de contêineres de Instâncias de Contêiner

Neste tutorial, você implanta um aplicativo Hello World que gera um relatório de atestado de hardware. Você começa criando um modelo ARM com um recurso de grupo de contêineres para definir as propriedades deste aplicativo. Em seguida, use esse modelo ARM com as ferramentas de confcom da CLI do Azure para gerar uma política de CCE para atestado.

Este tutorial usa este modelo ARM como exemplo. Para exibir o código-fonte deste aplicativo, consulte Azure Container Instances Confidential Hello World.

O modelo de exemplo adiciona duas propriedades à definição de recurso Instâncias de Contêiner para tornar o grupo de contêineres confidencial:

  • sku: Permite que você selecione entre implantações de grupo de contêineres confidenciais e padrão. Se você não adicionar essa propriedade ao recurso, o grupo de contêineres será uma implantação padrão.
  • confidentialComputeProperties: Permite que você passe uma política CCE personalizada para atestado de seu grupo de contêineres. Se você não adicionar esse objeto ao recurso, os componentes de software executados no grupo de contêineres não serão validados.

Nota

O ccePolicy parâmetro em confidentialComputeProperties está em branco. Você irá preenchê-lo depois de gerar a política posteriormente no tutorial.

Use seu editor de texto preferido para salvar este modelo ARM em sua máquina local como template.json.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "name": {
        "type": "string",
        "defaultValue": "helloworld",
        "metadata": {
          "description": "Name for the container group"
        }
      },
      "location": {
        "type": "string",
        "defaultValue": "North Europe",
        "metadata": {
          "description": "Location for all resources."
        }
      },
      "image": {
        "type": "string",
        "defaultValue": "mcr.microsoft.com/aci/aci-confidential-helloworld:v1",
        "metadata": {
          "description": "Container image to deploy. Should be of the form repoName/imagename:tag for images stored in public Docker Hub, or a fully qualified URI for other registries. Images from private registries require additional registry credentials."
        }
      },
      "port": {
        "type": "int",
        "defaultValue": 80,
        "metadata": {
          "description": "Port to open on the container and the public IP address."
        }
      },
      "cpuCores": {
        "type": "int",
        "defaultValue": 1,
        "metadata": {
          "description": "The number of CPU cores to allocate to the container."
        }
      },
      "memoryInGb": {
        "type": "int",
        "defaultValue": 1,
        "metadata": {
          "description": "The amount of memory to allocate to the container in gigabytes."
        }
      },
      "restartPolicy": {
        "type": "string",
        "defaultValue": "Never",
        "allowedValues": [
          "Always",
          "Never",
          "OnFailure"
        ],
        "metadata": {
          "description": "The behavior of Azure runtime if container has stopped."
        }
      }
    },
    "resources": [
      {
        "type": "Microsoft.ContainerInstance/containerGroups",
        "apiVersion": "2023-05-01",
        "name": "[parameters('name')]",
        "location": "[parameters('location')]",
        "properties": {
          "confidentialComputeProperties": {
            "ccePolicy": ""
          },
          "containers": [
            {
              "name": "[parameters('name')]",
              "properties": {
                "image": "[parameters('image')]",
                "ports": [
                  {
                    "port": "[parameters('port')]",
                    "protocol": "TCP"
                  }
                ],
                "resources": {
                  "requests": {
                    "cpu": "[parameters('cpuCores')]",
                    "memoryInGB": "[parameters('memoryInGb')]"
                  }
                }
              }
            }
          ],
          "sku": "Confidential",
          "osType": "Linux",
          "restartPolicy": "[parameters('restartPolicy')]",
          "ipAddress": {
            "type": "Public",
            "ports": [
              {
                "port": "[parameters('port')]",
                "protocol": "TCP"
              }
            ]
          }
        }
      }
    ],
    "outputs": {
      "containerIPv4Address": {
        "type": "string",
        "value": "[reference(resourceId('Microsoft.ContainerInstance/containerGroups', parameters('name'))).ipAddress.ip]"
      }
    }
  }

Criar uma política de CCE personalizada

Com o modelo ARM que você criou e a extensão confcom da CLI do Azure, você pode gerar uma política de CCE personalizada. A política CCE é usada para atestado. A ferramenta usa o modelo ARM como uma entrada para gerar a política. A política impõe as imagens de contêiner, variáveis de ambiente, montagens e comandos específicos, que podem ser validados quando o grupo de contêineres é iniciado. Para obter mais informações sobre a extensão confcom da CLI do Azure, consulte a documentação no GitHub.

  1. Para gerar a política CCE, execute o seguinte comando usando o modelo ARM como entrada:

    az confcom acipolicygen -a .\template.json --print-policy
    

    Quando este comando terminar, uma cadeia de caracteres Base64 gerada como saída deve aparecer no seguinte formato. Essa cadeia de caracteres é a política de CCE que você copia e cola em seu modelo ARM como o valor da ccePolicy propriedade.

    cGFja2FnZSBwb2xpY3kKCmFwaV9zdm4gOj0gIjAuOS4wIgoKaW1wb3J0IGZ1dHVyZS5rZXl3b3Jkcy5ldmVyeQppbXBvcnQgZnV0dXJlLmtleXdvcmRzLmluCgpmcmFnbWVudHMgOj0gWwpdCgpjb250YWluZXJzIDo9IFsKICAgIHsKICAgICAgICAiY29tbWFuZCI6IFsiL3BhdXNlIl0sCiAgICAgICAgImVudl9ydWxlcyI6IFt7InBhdHRlcm4iOiAiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogdHJ1ZX0seyJwYXR0ZXJuIjogIlRFUk09eHRlcm0iLCAic3RyYXRlZ3kiOiAic3RyaW5nIiwgInJlcXVpcmVkIjogZmFsc2V9XSwKICAgICAgICAibGF5ZXJzIjogWyIxNmI1MTQwNTdhMDZhZDY2NWY5MmMwMjg2M2FjYTA3NGZkNTk3NmM3NTVkMjZiZmYxNjM2NTI5OTE2OWU4NDE1Il0sCiAgICAgICAgIm1vdW50cyI6IFtdLAogICAgICAgICJleGVjX3Byb2Nlc3NlcyI6IFtdLAogICAgICAgICJzaWduYWxzIjogW10sCiAgICAgICAgImFsbG93X2VsZXZhdGVkIjogZmFsc2UsCiAgICAgICAgIndvcmtpbmdfZGlyIjogIi8iCiAgICB9LApdCmFsbG93X3Byb3BlcnRpZXNfYWNjZXNzIDo9IHRydWUKYWxsb3dfZHVtcF9zdGFja3MgOj0gdHJ1ZQphbGxvd19ydW50aW1lX2xvZ2dpbmcgOj0gdHJ1ZQphbGxvd19lbnZpcm9ubWVudF92YXJpYWJsZV9kcm9wcGluZyA6PSB0cnVlCmFsbG93X3VuZW5jcnlwdGVkX3NjcmF0Y2ggOj0gdHJ1ZQoKCm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQp1bm1vdW50X2RldmljZSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQptb3VudF9vdmVybGF5IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnVubW91bnRfb3ZlcmxheSA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpjcmVhdGVfY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfaW5fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmV4ZWNfZXh0ZXJuYWwgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2h1dGRvd25fY29udGFpbmVyIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNpZ25hbF9jb250YWluZXJfcHJvY2VzcyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV9tb3VudCA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpwbGFuOV91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmdldF9wcm9wZXJ0aWVzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CmR1bXBfc3RhY2tzIDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJ1bnRpbWVfbG9nZ2luZyA6PSB7ICJhbGxvd2VkIiA6IHRydWUgfQpsb2FkX2ZyYWdtZW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnNjcmF0Y2hfbW91bnQgOj0geyAiYWxsb3dlZCIgOiB0cnVlIH0Kc2NyYXRjaF91bm1vdW50IDo9IHsgImFsbG93ZWQiIDogdHJ1ZSB9CnJlYXNvbiA6PSB7ImVycm9ycyI6IGRhdGEuZnJhbWV3b3JrLmVycm9yc30K
    
  2. Salve as alterações na cópia local do modelo ARM.

Implementar o modelo

Nas etapas a seguir, você usa o portal do Azure para implantar o modelo. Você também pode usar o Azure PowerShell, a CLI do Azure ou a API REST. Para saber mais sobre outros métodos de implantação, consulte Implantar modelos.

  1. Selecione o botão Implantar no Azure para entrar no Azure e iniciar uma implantação de Instâncias de Contêiner.

    Button to deploy the Resource Manager template to Azure.

  2. Selecione Crie o seu próprio modelo no editor.

    Screenshot of the button for building your own template in the editor.

    O modelo JSON que aparece está principalmente em branco.

  3. Selecione Carregar arquivo e carregar template.json, que você modificou adicionando a política CCE nas etapas anteriores.

    Screenshot of the button for loading a file.

  4. Selecione Guardar.

  5. Selecione ou insira os seguintes valores:

    • Subscrição: selecione uma subscrição do Azure.
    • Grupo de recursos: selecione Criar novo, insira um nome exclusivo para o grupo de recursos e selecione OK.
    • Nome: aceite o nome gerado para a instância ou insira um nome.
    • Localização: Selecione uma localização para o grupo de recursos. Escolha uma região onde os contêineres confidenciais são suportados. Exemplo: Norte da Europa.
    • Imagem: Aceite o nome da imagem padrão. Esta imagem Linux de exemplo exibe um atestado de hardware.

    Aceite os valores padrão para as propriedades restantes e selecione Revisar + criar.

    Screenshot of details for a custom ARM template deployment.

  6. Reveja os termos e condições. Se concordar, selecione Concordo com os termos e condições descritos acima.

  7. Aguarde até que a notificação Implantação bem-sucedida seja exibida. Ele confirma que você criou a instância com êxito.

    Screenshot of a portal notification for successful deployment.

Rever os recursos implementados

Nas etapas a seguir, você usa o portal do Azure para revisar as propriedades da instância do contêiner. Você também pode usar uma ferramenta como a CLI do Azure.

  1. No portal, procure Instâncias de Contêiner e selecione a instância de contêiner que você criou.

  2. Na página Visão geral, observe o status da instância e seu endereço IP.

    Screenshot of the overview page for a container group instance.

  3. Quando o status da instância estiver em execução, vá para o endereço IP no navegador.

    Screenshot of a browser view of an app deployed via Azure Container Instances.

    A presença do relatório de atestado abaixo do logotipo das Instâncias de Contêiner do Azure confirma que o contêiner está sendo executado em hardware que dá suporte a um TEE.

    Se você implantar em hardware que não suporta um TEE (por exemplo, escolhendo uma região onde Instâncias de contêiner confidenciais não está disponível), nenhum relatório de atestado será exibido.

Agora que você implantou um grupo de contêineres confidenciais em Instâncias de Contêiner, pode saber mais sobre como as políticas são aplicadas: