Partilhar via


Implantar um cluster AKS com contêineres confidenciais e uma política padrão

Neste artigo, você usa a CLI do Azure para implantar um cluster do Serviço Kubernetes do Azure (AKS) e configurar Contêineres Confidenciais (visualização) com uma política de segurança padrão. Em seguida, você implanta um aplicativo como um contêiner confidencial. Para saber mais, leia a visão geral dos Contêineres Confidenciais AKS.

Em geral, começar a usar os Contêineres Confidenciais do AKS envolve as seguintes etapas.

  • Implantar ou atualizar um cluster AKS usando a CLI do Azure
  • Adicione uma anotação ao manifesto YAML do pod para marcar o pod como sendo executado como um contêiner confidencial
  • Adicionar uma política de segurança ao manifesto YAML do pod
  • Permitir a aplicação da política de segurança
  • Implante seu aplicativo em computação confidencial

Pré-requisitos

  • A CLI do Azure versão 2.44.1 ou posterior. Execute az --version para localizar a versão e execute az upgrade para atualizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

  • A aks-preview extensão da CLI do Azure versão 0.5.169 ou posterior.

  • A confcom extensão da CLI do Azure de Contêiner Confidencial 0.3.3 ou posterior. confcomé necessário para gerar uma política de segurança.

  • Registre o Preview recurso em sua assinatura do Azure.

  • O AKS suporta Contentores Confidenciais (pré-visualização) na versão 1.25.0 e superior.

  • Uma identidade de carga de trabalho e uma credencial de identidade federada. A credencial de identidade de carga de trabalho permite que os aplicativos Kubernetes acessem os recursos do Azure com segurança com uma ID do Microsoft Entra com base em contas de serviço anotadas. Se você não estiver familiarizado com o ID de Carga de Trabalho do Microsoft Entra, consulte a Visão geral do ID de Carga de Trabalho do Microsoft Entra e analise como a Identidade da Carga de Trabalho funciona com o AKS.

  • A identidade que você está usando para criar seu cluster tem as permissões mínimas apropriadas. Para obter mais informações sobre acesso e identidade para AKS, consulte Opções de acesso e identidade para o Serviço Kubernetes do Azure (AKS).

  • Para gerenciar um cluster Kubernetes, use o kubectl do cliente de linha de comando Kubernetes. O Azure Cloud Shell vem com kubectlo . Você pode instalar o kubectl localmente usando o comando az aks install-cli .

  • Contêineres confidenciais no AKS fornecem um contêiner de código aberto sidecar para atestado e liberação segura de chaves. O sidecar integra-se com um KMS (Serviço de Gerenciamento de Chaves), como o Azure Key Vault, para liberar uma chave para o grupo de contêineres após a conclusão da validação. A implantação de um HSM (Módulo de Segurança de Hardware) gerenciado pelo Azure Key Vault é opcional, mas recomendada para dar suporte à integridade e ao atestado no nível do contêiner. Consulte Provisionar e ativar um HSM gerenciado para implantar o HSM gerenciado.

Instalar a extensão aks-preview da CLI do Azure

Importante

Os recursos de visualização do AKS estão disponíveis em uma base de autosserviço e opt-in. As visualizações prévias são fornecidas "como estão" e "conforme disponíveis" e são excluídas dos contratos de nível de serviço e da garantia limitada. As visualizações do AKS são parcialmente cobertas pelo suporte ao cliente com base no melhor esforço. Como tal, estas funcionalidades não se destinam a utilização em produção. Para obter mais informações, consulte os seguintes artigos de suporte:

Para instalar a extensão aks-preview, execute o seguinte comando:

az extension add --name aks-preview

Execute o seguinte comando para atualizar para a versão mais recente da extensão lançada:

az extension update --name aks-preview

Instalar a extensão confcom Azure CLI

Para instalar a extensão confcom, execute o seguinte comando:

az extension add --name confcom

Execute o seguinte comando para atualizar para a versão mais recente da extensão lançada:

az extension update --name confcom

Registrar o sinalizador de recurso KataCcIsolationPreview

Registre o KataCcIsolationPreview sinalizador de recurso usando o comando az feature register , conforme mostrado no exemplo a seguir:

az feature register --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"

Leva alguns minutos para que o status mostre Registrado. Verifique o status do registro usando o comando az feature show :

az feature show --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"

Quando o status refletir Registrado, atualize o registro do provedor de recursos Microsoft.ContainerService usando o comando az provider register :

az provider register --namespace "Microsoft.ContainerService"

Implantar um novo cluster

  1. Crie um cluster AKS usando o comando az aks create e especificando os seguintes parâmetros:

    • --os-sku: AzureLinux. Apenas o Azure Linux os-sku suporta esta funcionalidade nesta versão de pré-visualização.
    • --node-vm-size: Qualquer tamanho de VM do Azure que seja uma VM de geração 2 e ofereça suporte a trabalhos de virtualização aninhada. Por exemplo, Standard_DC8as_cc_v5 VMs.
    • --enable-workload-identity: Permite criar um ID de carga de trabalho do Microsoft Entra permitindo que os pods usem uma identidade do Kubernetes.
    • --enable-oidc-issuer: Habilita o emissor OpenID Connect (OIDC). Ele permite que um ID do Microsoft Entra ou outra plataforma de gerenciamento de identidade e acesso do provedor de nuvem descubra as chaves de assinatura públicas do servidor de API.

    O exemplo a seguir atualiza o cluster chamado myAKSCluster e cria um único pool de nós do sistema no myResourceGroup:

    az aks create --resource-group myResourceGroup --name myAKSCluster --kubernetes-version <1.25.0 and above> --os-sku AzureLinux --node-vm-size Standard_DC4as_cc_v5 --node-count 1 --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys
    

    Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster. O cluster criado na etapa anterior tem um único pool de nós. Na próxima etapa, adicionamos um segundo pool de nós ao cluster.

  2. Quando o cluster estiver pronto, obtenha as credenciais do cluster usando o comando az aks get-credentials .

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    
  3. Adicione um pool de nós de usuário a myAKSCluster com dois nós em nodepool2 no myResourceGroup usando o comando az aks nodepool add. Especifique os parâmetros seguintes:

    • --workload-runtime: especifique KataCcIsolation para habilitar o recurso Contêineres Confidenciais no pool de nós. Com este parâmetro, estes outros parâmetros devem satisfazer os seguintes requisitos: Caso contrário, o comando falhará e relatará um problema com o(s) parâmetro(s) correspondente(s).
    • --os-sku: AzureLinux. Apenas o Azure Linux os-sku suporta esta funcionalidade nesta versão de pré-visualização.
    • --node-vm-size: Qualquer tamanho de VM do Azure que seja uma VM de geração 2 e ofereça suporte a trabalhos de virtualização aninhada. Por exemplo, Standard_DC8as_cc_v5 VMs.
    az aks nodepool add --resource-group myResourceGroup --name nodepool2 --cluster-name myAKSCluster --node-count 2 --os-sku AzureLinux --node-vm-size Standard_DC4as_cc_v5 --workload-runtime KataCcIsolation
    

Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.

Implantar em um cluster existente

Para usar esse recurso com um cluster AKS existente, os seguintes requisitos devem ser atendidos:

Use o comando a seguir para habilitar Contêineres Confidenciais (visualização) criando um pool de nós para hospedá-lo.

  1. Adicione um pool de nós ao seu cluster AKS usando o comando az aks nodepool add . Especifique os parâmetros seguintes:

    • --resource-group: Insira o nome de um grupo de recursos existente para criar o cluster AKS.
    • --cluster-name: Insira um nome exclusivo para o cluster AKS, como myAKSCluster.
    • --name: insira um nome exclusivo para o pool de nós de clusters, como nodepool2.
    • --workload-runtime: especifique KataCcIsolation para habilitar o recurso no pool de nós. Juntamente com o --workload-runtime parâmetro, estes outros parâmetros devem satisfazer os seguintes requisitos: Caso contrário, o comando falhará e relatará um problema com o(s) parâmetro(s) correspondente(s).
    • --os-sku: AzureLinux. Apenas o Azure Linux os-sku suporta esta funcionalidade nesta versão de pré-visualização.
    • --node-vm-size: Qualquer tamanho de VM do Azure que seja uma VM de geração 2 e ofereça suporte a trabalhos de virtualização aninhada. Por exemplo, Standard_DC8as_cc_v5 VMs.

    O exemplo a seguir adiciona um pool de nós de usuário a myAKSCluster com dois nós em nodepool2 no myResourceGroup:

    az aks nodepool add --resource-group myResourceGroup --name nodepool2 –-cluster-name myAKSCluster --node-count 2 --os-sku AzureLinux --node-vm-size Standard_DC4as_cc_v5 --workload-runtime KataCcIsolation
    

    Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.

  2. Execute o comando az aks update para habilitar Contêineres Confidenciais (visualização) no cluster.

    az aks update --name myAKSCluster --resource-group myResourceGroup
    

    Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.

  3. Quando o cluster estiver pronto, obtenha as credenciais do cluster usando o comando az aks get-credentials .

    az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
    

Configurar contentor

Antes de configurar o acesso ao Cofre da Chave do Azure e ao segredo e implantar um aplicativo como um contêiner Confidencial, você precisa concluir a configuração da identidade da carga de trabalho.

Para configurar a identidade da carga de trabalho, execute as seguintes etapas descritas no artigo Implantar e configurar a identidade da carga de trabalho:

  • Recuperar o URL do emissor OIDC
  • Criar uma identidade gerenciada
  • Criar conta de serviço do Kubernetes
  • Estabelecer credencial de identidade federada

Importante

Você precisa definir as variáveis de ambiente na seção Exportar variáveis ambientais no artigo Implantar e configurar identidade de carga de trabalho para continuar concluindo este tutorial. Lembre-se de definir a variável SERVICE_ACCOUNT_NAMESPACE como kafka, e execute o comando kubectl create namespace kafka antes de configurar a identidade da carga de trabalho.

Implante um aplicativo confiável com kata-cc e contêiner de atestado

As etapas a seguir configuram a criptografia de ponta a ponta para mensagens Kafka usando chaves de criptografia gerenciadas pelo mHSM (Managed Hardware Security Modules ) do Azure. A chave só é liberada quando o consumidor Kafka é executado dentro de um contêiner confidencial com um contêiner de provisionamento secreto de atestado do Azure injetado no pod.

Esta configuração baseia-se nos seguintes quatro componentes:

  • Cluster Kafka: um cluster Kafka simples implantado no namespace Kafka no cluster.
  • Kafka Producer: Um produtor Kafka rodando como um pod Kubernetes baunilha que envia mensagens criptografadas configuradas pelo usuário usando uma chave pública para um tópico Kafka.
  • Kafka Consumer: Um pod de consumidor Kafka rodando com o tempo de execução kata-cc, equipado com um contêiner de liberação de chave segura para recuperar a chave privada para descriptografar mensagens Kafka e renderizar as mensagens para a interface do usuário da web.

Para esta versão de visualização, recomendamos para fins de teste e avaliação criar ou usar um recurso de camada Premium existente do Azure Key Vault para dar suporte ao armazenamento de chaves em um módulo de segurança de hardware (HSM). Não recomendamos o uso do cofre da chave de produção. Se você não tiver um Cofre de Chaves do Azure, consulte Criar um cofre de chaves usando a CLI do Azure.

  1. Conceda à identidade gerenciada que você criou anteriormente e à sua conta acesso ao cofre de chaves. Atribua ambas as identidades as funções Key Vault Crypto Officer e Key Vault Crypto User Azure RBAC.

    Nota

    • A identidade gerenciada é o valor atribuído à USER_ASSIGNED_IDENTITY_NAME variável.

    • Para adicionar atribuições de função, você deve ter Microsoft.Authorization/roleAssignments/write e Microsoft.Authorization/roleAssignments/delete permissões, como Administrador de Acesso a Dados do Cofre de Chaves, Administrador de Acesso de Usuário ou Proprietário.

    • Você deve usar o Key Vault Premium SKU para suportar chaves protegidas por HSM.

    Execute o seguinte comando para definir o escopo:

    AKV_SCOPE=$(az keyvault show --name <AZURE_AKV_RESOURCE_NAME> --query id --output tsv)
    

    Execute o seguinte comando para atribuir a função Key Vault Crypto Officer .

    az role assignment create --role "Key Vault Crypto Officer" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
    

    Execute o seguinte comando para atribuir a função Key Vault Crypto User .

    az role assignment create --role "Key Vault Crypto User" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPE
    
  2. Instale o cluster Kafka no namespace kafka executando o seguinte comando:

    kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
    
  3. Execute o seguinte comando para aplicar o arquivo CR do kafka cluster.

    kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafka
    
  4. Prepare a chave de criptografia/descriptografia RSA usando o script bash para a carga de trabalho do GitHub. Guarde o ficheiro como setup-key.sh.

  5. Defina a MAA_ENDPOINT variável de ambiente com o FQDN do URI Attest executando o seguinte comando.

    export MAA_ENDPOINT="$(az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-)"
    

    Verifique se o FQDN do URI do Attest está no formato correto (o MAA_ENDPOINT não deve incluir o prefixo "https://"):

    echo $MAA_ENDPOINT
    

    Nota

    Para configurar o Atestado do Microsoft Azure, consulte Guia de início rápido: configurar o Atestado do Azure com a CLI do Azure.

  6. Copie o seguinte manifesto YAML e salve-o como consumer.yaml.

    apiVersion: v1
    kind: Pod
    metadata:
      name: kafka-golang-consumer
      namespace: kafka
      labels:
        azure.workload.identity/use: "true"
        app.kubernetes.io/name: kafka-golang-consumer
    spec:
      serviceAccountName: workload-identity-sa
      runtimeClassName: kata-cc-isolation
      containers:
        - image: "mcr.microsoft.com/aci/skr:2.7"
          imagePullPolicy: Always
          name: skr
          env:
            - name: SkrSideCarArgs
              value: ewogICAgImNlcnRjYWNoZSI6IHsKCQkiZW5kcG9pbnRfdHlwZSI6ICJMb2NhbFRISU0iLAoJCSJlbmRwb2ludCI6ICIxNjkuMjU0LjE2OS4yNTQvbWV0YWRhdGEvVEhJTS9hbWQvY2VydGlmaWNhdGlvbiIKCX0gIAp9
          command:
            - /bin/skr
          volumeMounts:
            - mountPath: /opt/confidential-containers/share/kata-containers/reference-info-base64
              name: endor-loc
        - image: "mcr.microsoft.com/acc/samples/kafka/consumer:1.0"
          imagePullPolicy: Always
          name: kafka-golang-consumer
          env:
            - name: SkrClientKID
              value: kafka-encryption-demo
            - name: SkrClientMAAEndpoint
              value: sharedeus2.eus2.test.attest.azure.net
            - name: SkrClientAKVEndpoint
              value: "myKeyVault.vault.azure.net"
            - name: TOPIC
              value: kafka-demo-topic
          command:
            - /consume
          ports:
            - containerPort: 3333
              name: kafka-consumer
          resources:
            limits:
              memory: 1Gi
              cpu: 200m
      volumes:
        - name: endor-loc
          hostPath:
            path: /opt/confidential-containers/share/kata-containers/reference-info-base64
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: consumer
      namespace: kafka
    spec:
      type: LoadBalancer
      selector:
        app.kubernetes.io/name: kafka-golang-consumer
      ports:
        - protocol: TCP
          port: 80
          targetPort: kafka-consumer
    

    Nota

    Atualize o valor da variável SkrClientAKVEndpoint de ambiente pod para corresponder à URL do seu Cofre da Chave do Azure, excluindo o valor https://do protocolo . O valor do espaço reservado do valor atual é myKeyVault.vault.azure.net. Atualize o valor da variável SkrClientMAAEndpoint de ambiente pod com o valor de MAA_ENDPOINT. Você pode encontrar o valor de MAA_ENDPOINT executando o comando echo $MAA_ENDPOINT ou o comando az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-.

  7. Gere a política de segurança para o manifesto YAML do consumidor Kafka e obtenha o hash da política de segurança armazenada na WORKLOAD_MEASUREMENT variável executando o seguinte comando:

    export WORKLOAD_MEASUREMENT=$(az confcom katapolicygen -y consumer.yaml --print-policy | base64 -d | sha256sum | cut -d' ' -f1)
    
  8. Para gerar um par de chaves assimétricas RSA (chaves pública e privada), execute o setup-key.sh script usando o seguinte comando. O <Azure Key Vault URL> valor deve ser <your-unique-keyvault-name>.vault.azure.net

    export MANAGED_IDENTITY=${USER_ASSIGNED_CLIENT_ID}
    bash setup-key.sh "kafka-encryption-demo" <Azure Key Vault URL>
    

    Nota

    • A variável MANAGED_IDENTITY de ambiente é exigida pelo script setup-key.shbash.

    • A chave pública será salva após kafka-encryption-demo-pub.pem a execução do script bash.

    Importante

    Se você receber o erro ForbiddenByRbac, talvez seja necessário aguardar até 24 horas, pois os serviços de back-end para identidades gerenciadas mantêm um cache por URI de recurso por até 24 horas. Consulte também: Solucionar problemas do Azure RBAC.

  9. Para verificar se as chaves foram carregadas com êxito no cofre de chaves, execute os seguintes comandos:

    az account set --subscription <Subscription ID>
    az keyvault key list --vault-name <KeyVault Name> -o table
    
  10. Copie o seguinte manifesto YAML e salve-o como producer.yaml.

    apiVersion: v1
    kind: Pod
    metadata:
      name: kafka-producer
      namespace: kafka
    spec:
      containers:
        - image: "mcr.microsoft.com/acc/samples/kafka/producer:1.0"
          name: kafka-producer
          command:
            - /produce
          env:
            - name: TOPIC
              value: kafka-demo-topic
            - name: MSG
              value: "Azure Confidential Computing"
            - name: PUBKEY
              value: |-
                -----BEGIN PUBLIC KEY-----
                MIIBojAN***AE=
                -----END PUBLIC KEY-----
          resources:
            limits:
              memory: 1Gi
              cpu: 200m
    

    Nota

    Atualize o valor que começa com -----BEGIN PUBLIC KEY----- e termina com -----END PUBLIC KEY----- cadeias de caracteres com o conteúdo a partir do kafka-encryption-demo-pub.pem qual foi criado na etapa anterior.

  11. Implante os consumer manifestos e producer YAML usando os arquivos salvos anteriormente.

    kubectl apply -f consumer.yaml
    
    kubectl apply -f producer.yaml
    
  12. Obtenha o endereço IP do serviço Web usando o seguinte comando:

    kubectl get svc consumer -n kafka
    
  13. Copie e cole o endereço IP externo do serviço ao consumidor no seu navegador e observe a mensagem desencriptada.

    O exemplo a seguir é semelhante à saída do comando:

    Welcome to Confidential Containers on AKS!
    Encrypted Kafka Message:
    Msg 1: Azure Confidential Computing
    
  14. Você também deve tentar executar o consumidor como um pod Kubernetes regular removendo o skr container e kata-cc runtime class spec. Como você não está executando o consumidor com a classe de tempo de execução kata-cc, não precisa mais da política.

  15. Remova toda a política e observe as mensagens novamente no navegador após reimplantar a carga de trabalho. As mensagens aparecem como texto cifrado codificado em base64 porque a chave de criptografia privada não pode ser recuperada. A chave não pode ser recuperada porque o consumidor não está mais executando em um ambiente confidencial e a está faltando, impedindo a skr container descriptografia das mensagens.

Limpeza

Quando terminar de avaliar esse recurso, para evitar cobranças do Azure, limpe seus recursos desnecessários. Se você implantou um novo cluster como parte de sua avaliação ou teste, poderá excluí-lo usando o comando az aks delete .

az aks delete --resource-group myResourceGroup --name myAKSCluster

Se você ativou Contêineres Confidenciais (visualização) em um cluster existente, poderá remover o(s) pod(s) usando o comando kubectl delete pod .

kubectl delete pod pod-name

Próximos passos

  • Saiba mais sobre os hosts dedicados do Azure para nós com seu cluster AKS para usar o isolamento de hardware e o controle sobre eventos de manutenção da plataforma Azure.