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 executeaz 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
kubectl
o . 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
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.
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
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:
- Siga as etapas para registrar o sinalizador de recurso KataCcIsolationPreview .
- Verifique se o cluster está executando o Kubernetes versão 1.25.0 e superior.
- Habilite a identidade da carga de trabalho no cluster se ainda não estiver.
Use o comando a seguir para habilitar Contêineres Confidenciais (visualização) criando um pool de nós para hospedá-lo.
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.
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.
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.
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
eMicrosoft.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
Instale o cluster Kafka no namespace kafka executando o seguinte comando:
kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafka
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
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
.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.
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 valorhttps://
do protocolo . O valor do espaço reservado do valor atual émyKeyVault.vault.azure.net
. Atualize o valor da variávelSkrClientMAAEndpoint
de ambiente pod com o valor deMAA_ENDPOINT
. Você pode encontrar o valor deMAA_ENDPOINT
executando o comandoecho $MAA_ENDPOINT
ou o comandoaz attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-
.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)
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 scriptsetup-key.sh
bash.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.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
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 dokafka-encryption-demo-pub.pem
qual foi criado na etapa anterior.Implante os
consumer
manifestos eproducer
YAML usando os arquivos salvos anteriormente.kubectl apply -f consumer.yaml
kubectl apply -f producer.yaml
Obtenha o endereço IP do serviço Web usando o seguinte comando:
kubectl get svc consumer -n kafka
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
Você também deve tentar executar o consumidor como um pod Kubernetes regular removendo o
skr container
ekata-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.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.
Azure Kubernetes Service