Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questo articolo viene usato il interfaccia della riga di comando di Azure per distribuire un cluster Servizio Azure Kubernetes (AKS) e configurare i contenitori riservati (anteprima) con un criterio di sicurezza generato automaticamente. Si distribuisce quindi un'applicazione come contenitore Riservato. Per altre informazioni, leggere Panoramica dei container riservati di AKS.
In generale, per iniziare a usare i contenitori riservati del servizio Azure Kubernetes sono necessari i passaggi seguenti.
- Distribuire o aggiornare un cluster AKS usando l'interfaccia della riga di comando di Azure.
- Aggiungi un'annotazione al file manifest YAML del pod per indicare che il pod usa Confidential Containers.
- Aggiungi un criterio di sicurezza al file manifest YAML del pod.
- Distribuisci la tua applicazione nell'elaborazione riservata.
Importante
A partire dal 30 novembre 2025, il servizio Azure Kubernetes non supporta più o fornisce aggiornamenti della sicurezza per Azure Linux 2.0. L'immagine del nodo Linux 2.0 di Azure è bloccata alla versione 202512.06.0. A partire dal 31 ottobre 2026, le immagini dei nodi verranno rimosse e non sarà possibile ridimensionare i pool di nodi. Eseguire la migrazione a una versione di Linux di Azure supportata aggiornando i pool di nodi a una versione di Kubernetes supportata o eseguendo la migrazione ad osSku AzureLinux3. Per altre informazioni, vedere il problema di ritiro di GitHub e l'annuncio di ritiro degli aggiornamenti di Azure. Per rimanere informati sugli annunci e sugli aggiornamenti, seguire le note di rilascio di AKS.
Prerequisiti
- L'ultima versione dell'interfaccia della riga di comando di Azure. Eseguire
az versionper trovare la versione ed eseguireaz upgradeper aggiornare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure. - L'ultima versione dell'
aks-previewestensione dell'interfaccia della riga di comando di Azure. - L'ultima versione dell'estensione
confcominterfaccia della riga di comando di Azure per Confidential Container.confcomè necessario per generare criteri di sicurezza. - Identità del carico di lavoro e credenziali di identità federate. Le credenziali dell'identità del carico di lavoro consentono alle applicazioni Kubernetes di accedere in modo sicuro alle risorse di Azure con un ID Microsoft Entra basato su account del servizio con annotazioni. Se non si ha familiarità con l'ID del carico di lavoro Microsoft Entra, vedere Panoramica dell'ID del carico di lavoro di Microsoft Entra e vedere il Funzionamento dell'identità del carico di lavoro con il servizio Azure Kubernetes.
- L'identità usata per creare il cluster dispone delle autorizzazioni minime adeguate. Per altre informazioni sull'accesso e l'identità per il servizio Azure Kubernetes, vedere Opzioni di accesso e identità per il servizio Azure Kubernetes (AKS).
- Per gestire un cluster Kubernetes, usare il client da riga di comando Kubernetes kubectl. Azure Cloud Shell include
kubectl. È possibile eseguire l'installazionekubectlin locale usando ilaz aks install-clicomando . - I contenitori riservati nel servizio Azure Kubernetes forniscono un contenitore open source sidecar per l'attestazione e la versione sicura della chiave. Il sidecar si integra con un servizio di gestione delle chiavi, ad esempio Azure Key Vault, per rilasciare una chiave al gruppo di contenitori dopo il completamento della convalida. La distribuzione di un modulo di protezione hardware (HSM) gestito di Azure Key Vault è facoltativa, ma consigliata per supportare l'integrità e l'attestazione a livello di contenitore. Vedere Effettuare il provisioning e attivare un modulo di protezione hardware gestito per distribuire un modulo di protezione hardware gestito.
Installare l'estensione aks-preview interfaccia della riga di comando di Azure
Importante
Le funzionalità di anteprima del servizio Azure Kubernetes sono disponibili in modalità self-service e con consenso esplicito. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime del servizio Azure Kubernetes sono parzialmente coperte dal supporto clienti con la massima diligenza possibile. Di conseguenza, queste funzionalità non sono destinate all'uso in ambienti di produzione. Per altre informazioni, vedere gli articoli di supporto seguenti:
Eseguire il comando seguente per installare l'estensione
aks-preview:az extension add --name aks-previewEseguire il comando seguente per eseguire l'aggiornamento alla versione più recente dell'estensione:
az extension update --name aks-preview
Installare l'estensione confcom interfaccia della riga di comando di Azure
Eseguire il comando seguente per installare l'estensione
confcom:az extension add --name confcomEseguire il comando seguente per eseguire l'aggiornamento alla versione più recente dell'estensione:
az extension update --name confcom
Registrare il flag di funzionalità KataCcIsolationPreview
Esegui il comando
az feature registerper registrare il flag della funzionalitàKataCcIsolationPreview, come mostrato nell'esempio seguente:az feature register --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"Attendere alcuni minuti prima che lo stato venga visualizzato Registrato. Eseguire il
az feature showcomando per verificare lo stato di registrazione:az feature show --namespace "Microsoft.ContainerService" --name "KataCcIsolationPreview"Quando lo stato mostra Registrato, eseguire il comando
az provider registerper aggiornare la registrazione del provider di risorse Microsoft.ContainerService:az provider register --namespace "Microsoft.ContainerService"
Creare un cluster con contenitori riservati abilitati
Creare un cluster AKS usando il comando
az aks create. Specificare i parametri seguenti:- --os-sku: AzureLinux. Solo lo SKU del sistema operativo Linux di Azure supporta questa funzionalità in questa versione di anteprima.
- --node-vm-size: va bene qualsiasi dimensione di VM di Azure che supporti la virtualizzazione annidata per VM figlio protette con AMD SEV-SNP. Ad esempio, macchine virtuali Standard_DC8as_cc_v5.
- --enable-workload-identity: consente di creare un ID dei carichi di lavoro di Microsoft Entra in modo che i pod possano usare un'identità Kubernetes.
- --enable-oidc-issuer: abilita l'autorità di certificazioneOpenID Connect (OIDC). Consente a un'Microsoft Entra ID o ad un'altra piattaforma di gestione degli accessi e identità del provider di servizi cloud di individuare le chiavi di firma pubblica del server API.
- --workload-runtime: specificare KataCcIsolation per abilitare la funzionalità Contenitori riservati nel pool di nodi.
az aks create --resource-group myResourceGroup --name myAKSCluster --os-sku AzureLinux --node-vm-size Standard_DC8as_cc_v5 --workload-runtime KataCcIsolation --node-count 1 --enable-oidc-issuer --enable-workload-identity --generate-ssh-keysDopo alcuni minuti, il comando termina e restituisce informazioni in formato JSON sul cluster.
Quando il cluster è pronto, ottenere le credenziali del cluster usando il
az aks get-credentialscomando .az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
Abilitare i contenitori riservati in un cluster esistente
Per usare questa funzionalità con un cluster del servizio Azure Kubernetes esistente, è necessario soddisfare i requisiti seguenti:
- Seguire questi passaggi per registrare il flag di funzionalità
KataCcIsolationPreview. - Abilitare l'identità del carico di lavoro nel cluster, se non lo è già.
Aggiungere un pool di nodi con contenitori riservati abilitati
Usare il comando seguente per abilitare i contenitori riservati (anteprima) creando un pool di nodi per ospitarlo.
Aggiungi un pool di nodi al cluster AKS usando il comando
az aks nodepool add. Specificare i parametri seguenti:- --resource-group: immettere il nome di un gruppo di risorse esistente in cui creare il cluster del servizio Azure Kubernetes.
- --cluster-name: immettere un nome univoco per il cluster del servizio Azure Kubernetes, ad esempio myAKSCluster.
- --name: immettere un nome univoco per il pool di nodi del cluster, ad esempio nodepool2.
-
--workload-runtime: specificare KataCcIsolation per abilitare la funzionalità nel pool di nodi. Insieme al
--workload-runtimeparametro , questi altri parametri soddisfano i requisiti seguenti. In caso contrario, il comando non riesce e segnala un problema con i parametri corrispondenti. - --os-sku: AzureLinux. Solo lo SKU del sistema operativo Linux di Azure supporta questa funzionalità in questa versione di anteprima.
- --node-vm-size: va bene qualsiasi dimensione di VM di Azure che supporti la virtualizzazione annidata per macchine virtuali figlio protette AMD SEV-SNP. Ad esempio, macchine virtuali Standard_DC8as_cc_v5.
L'esempio seguente aggiunge un pool di nodi utente a myAKSCluster con due nodi in nodepool2 in myResourceGroup:
az aks nodepool add --resource-group myResourceGroup --name nodepool2 --cluster-name myAKSCluster --node-count 2 --os-sku AzureLinux --node-vm-size Standard_DC8as_cc_v5 --workload-runtime KataCcIsolationIl comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.
Eseguire il
az aks updatecomando per riconciliare la configurazione del cluster dopo aver aggiunto il pool di nodi Contenitori riservati.az aks update --name myAKSCluster --resource-group myResourceGroupIl comando viene completato dopo pochi minuti e vengono restituite informazioni in formato JSON sul cluster.
Quando il cluster è pronto, ottenere le credenziali del cluster usando il
az aks get-credentialscomando .az aks get-credentials --resource-group myResourceGroup --name myAKSCluster
Distribuire e configurare l'identità del carico di lavoro
Prima di configurare l'accesso all'insieme di credenziali delle chiavi di Azure e al segreto e distribuire un'applicazione come contenitore riservato, è necessario completare la configurazione dell'identità del carico di lavoro.
Per configurare l'identità del carico di lavoro, seguire questa procedura descritta nell'articolo Distribuire e configurare l'identità del carico di lavoro :
- Recuperare l'URL dell'autorità di certificazione OIDC
- Creare un'identità gestita
- Creare un account del servizio Kubernetes
- Stabilire credenziali di identità federate
Importante
Per continuare questa esercitazione, impostare le variabili di ambiente dalla sezione Esportare le variabili di ambiente nell'articolo Distribuire e configurare l'identità del carico di lavoro . Impostare la variabile SERVICE_ACCOUNT_NAMESPACE su kafkaed eseguire il comando kubectl create namespace kafka prima di configurare l'identità del carico di lavoro.
Distribuire un'applicazione attendibile con kata-cc e un contenitore di attestazione
La procedura seguente consente di configurare la crittografia end-to-end per i messaggi Kafka usando le chiavi di crittografia gestite da Azure moduli di protezione hardware gestiti (HSM gestito). La chiave viene rilasciata solo quando il consumer Kafka viene eseguito all'interno di un contenitore riservato con un contenitore di provisioning del segreto di attestazione Azure inserito nel pod.
Questa configurazione si basa sui tre componenti seguenti:
- Cluster Kafka: un cluster Kafka semplice distribuito nello spazio dei nomi Kafka nel cluster.
- Kafka Producer: producer Kafka in esecuzione come pod Kubernetes vanilla che invia messaggi crittografati configurati dall'utente usando una chiave pubblica a un argomento Kafka.
- Consumer Kafka: un pod consumer di Kafka eseguito con il runtime kata-cc recupera la chiave privata da un contenitore sicuro per il rilascio delle chiavi per decrittografare i messaggi Kafka e visualizzarli in un'interfaccia web.
Per questa versione di anteprima, a scopo di test e valutazione, si consiglia di creare o utilizzare una risorsa Azure Key Vault di livello Premium esistente per supportare l'archiviazione delle chiavi in un modulo di sicurezza hardware (HSM). Non è consigliabile usare l'insieme di credenziali delle chiavi di produzione. Se non si ha un'istanza di Azure Key Vault, vedere Creare un insieme di credenziali delle chiavi usando l'interfaccia della riga di comando di Azure.
Concedere all'identità gestita creata in precedenza e all'account l'accesso all'insieme di credenziali delle chiavi. Assegnare ad entrambe le identità i ruoli di Key Vault Crypto Officer e Key Vault Crypto User di Azure RBAC.
Note
L'identità gestita è il valore assegnato alla variabile
USER_ASSIGNED_IDENTITY_NAME.Per aggiungere assegnazioni di ruoli, è necessario avere le autorizzazioni
Microsoft.Authorization/roleAssignments/writeeMicrosoft.Authorization/roleAssignments/delete, ad esempio Amministratore dell'accesso ai dati di Key Vault, Amministratore dell'accesso utenti o Proprietario.È necessario usare lo SKU Premium di Key Vault per supportare le chiavi protette dal modulo di protezione hardware.
Eseguire il comando seguente per impostare l'ambito:
AKV_SCOPE=$(az keyvault show --name <AZURE_AKV_RESOURCE_NAME> --query id --output tsv)Eseguire il comando seguente per assegnare il ruolo Crypto Officer di Key Vault.
az role assignment create --role "Key Vault Crypto Officer" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPEEseguire il comando seguente per assegnare il ruolo Crypto User di Key Vault.
az role assignment create --role "Key Vault Crypto User" --assignee "${USER_ASSIGNED_IDENTITY_NAME}" --scope $AKV_SCOPEInstallare il cluster Kafka nello spazio dei nomi kafka eseguendo il comando seguente:
kubectl create -f 'https://strimzi.io/install/latest?namespace=kafka' -n kafkaEseguire il comando seguente per applicare il file CR del cluster
kafka.kubectl apply -f https://strimzi.io/examples/latest/kafka/kafka-persistent-single.yaml -n kafkaPreparare la chiave di crittografia/decrittografia RSA usando lo script bash per il carico di lavoro da GitHub. Salvare il file come
setup-key.sh.Impostare la variabile
MAA_ENDPOINTdi ambiente con il nome di dominio completo dell'URI di attestazione eseguendo il comando seguente.export MAA_ENDPOINT="$(az attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-)"Controllare se il formato FQDN dell'URI di attestazione è corretto (il MAA_ENDPOINT non deve includere il prefisso "https://"):
echo $MAA_ENDPOINTNote
Per configurare l'attestazione di Microsoft Azure, vedere Avvio rapido: Configurare Attestazione di Azure con l'interfaccia della riga di comando di Azure.
Copiare il manifesto YAML seguente e salvarlo come
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-consumerNote
Aggiornare il valore per la variabile di ambiente
SkrClientAKVEndpointdel pod in modo che corrisponda all'URL dell'insieme di credenziali delle chiavi di Azure, escluso il valore del protocollohttps://. Il valore segnaposto del valore corrente èmyKeyVault.vault.azure.net. Aggiornare il valore per la variabileSkrClientMAAEndpointdi ambiente pod con il valore diMAA_ENDPOINT. È possibile trovare il valore diMAA_ENDPOINTeseguendo il comandoecho $MAA_ENDPOINTo il comandoaz attestation show --name "myattestationprovider" --resource-group "MyResourceGroup" --query 'attestUri' -o tsv | cut -c 9-.Generare i criteri di sicurezza per il manifesto YAML del consumer Kafka e ottenere l'hash dei criteri di sicurezza archiviati nella variabile
WORKLOAD_MEASUREMENTeseguendo il comando seguente:export WORKLOAD_MEASUREMENT=$(az confcom katapolicygen -y consumer.yaml --print-policy | base64 -d | sha256sum | cut -d' ' -f1)Per generare una coppia di chiavi asimmetriche RSA (chiavi pubbliche e private), eseguire lo script
setup-key.shusando il comando seguente. Il valore<Azure Key Vault URL>deve essere<your-unique-keyvault-name>.vault.azure.netexport MANAGED_IDENTITY=${USER_ASSIGNED_CLIENT_ID} bash setup-key.sh "kafka-encryption-demo" <Azure Key Vault URL>Note
Lo script
setup-key.shbash richiede la variabileMANAGED_IDENTITYdi ambiente .La chiave pubblica verrà salvata come
kafka-encryption-demo-pub.pemdopo l'esecuzione dello script bash.
Importante
Se viene visualizzato l'errore
ForbiddenByRbac, attendere fino a 24 ore. I servizi di back-end per le identità gestite memorizzano nella cache le informazioni per ogni URI della risorsa per un massimo di 24 ore. Per altre informazioni, vedere Troubleshoot Azure RBAC.Per verificare che le chiavi siano state caricate correttamente nell'insieme di credenziali delle chiavi, eseguire i comandi seguenti:
az account set --subscription <Subscription ID> az keyvault key list --vault-name <KeyVault Name> -o tableCopiare il manifesto YAML seguente e salvarlo come
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: 200mNote
Aggiornare il valore che inizia con
-----BEGIN PUBLIC KEY-----e termina con-----END PUBLIC KEY-----stringhe con il contenuto dakafka-encryption-demo-pub.pemcui è stato creato nel passaggio precedente.Distribuire i manifesti YAML
consumereproducerusando i file salvati in precedenza.kubectl apply -f consumer.yamlkubectl apply -f producer.yamlOttenere l'indirizzo IP del servizio Web usando il comando seguente:
kubectl get svc consumer -n kafkaCopiare e incollare l'indirizzo IP esterno del servizio consumer nel browser e osservare il messaggio decrittografato.
L'output del comando è simile all'esempio seguente:
Welcome to Confidential containers on AKS! Encrypted Kafka Message: Msg 1: Azure Confidential ComputingÈ anche consigliabile provare a eseguire il consumer come un normale pod Kubernetes rimuovendo la specifica
skr containerekata-cc runtime class. Poiché non si esegue il consumer con la classe di runtime kata-cc, non sono più necessari i criteri.Rimuovere l'intero criterio e osservare nuovamente i messaggi nel browser dopo la ridistribuzione del carico di lavoro. I messaggi vengono visualizzati come testo crittografato con codifica Base64 perché non è possibile recuperare la chiave di crittografia privata. La chiave non può essere recuperata perché il consumer non è più in esecuzione in un ambiente riservato e
skr containernon è presente, impedendo la decrittografia dei messaggi.
Pulire le risorse
Al termine della valutazione di questa funzionalità, elimina le risorse non necessarie per evitare addebiti di Azure. Se è stato distribuito un nuovo cluster come parte della valutazione o del test, è possibile eliminare il cluster usando il az aks delete comando .
az aks delete --resource-group myResourceGroup --name myAKSCluster
Se sono stati abilitati contenitori riservati (anteprima) in un cluster esistente, è possibile rimuovere i pod usando il kubectl delete pod comando .
kubectl delete pod <pod-name>
Passaggi successivi
Altre informazioni sugli host dedicati di Azure per i nodi con il cluster del servizio Azure Kubernetes per usare l'isolamento hardware e il controllo sugli eventi di manutenzione della piattaforma Azure.