Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Important
Azure Container Instances (ACI)-Vorschaufeatures sind auf Self-Service-, Opt-In-Basis verfügbar. Vorschaufunktionen werden „wie besehen“ und „wie verfügbar“ bereitgestellt und sind von den Service Level Agreements (SLAs) sowie der eingeschränkten Garantie ausgenommen. ACI-Vorschaufunktionen werden vom Kundensupport nur teilweise und im Rahmen des Möglichen abgedeckt. Daher werden Vorschaufunktionen für Produktionsworkloads nicht empfohlen und können vor der allgemeinen Verfügbarkeit (GA) geändert werden.
Eine Enklave ist eine separate vertrauliche Umgebung, die neben einer vertraulichen Containergruppe ausgeführt wird. Ihre vertrauliche Containergruppe ist die übergeordnete Containergruppe. Aus der übergeordneten Containergruppe können Sie bei Bedarf einen Enclave-Pod starten. Der Enklave-Pod wird in einer eigenen hardwarebasierten vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) mit einer eigenen CCE-Richtlinie (confidential computing enforcement) ausgeführt.
Verwenden Sie eine Enklave, um den empfindlichsten Teil Ihrer Anwendung von der restlichen Anwendung zu isolieren. Sie können z. B. Code, der Schlüssel oder entschlüsselte Daten verarbeitet, in einem Enklaven-Pod ausführen und die restliche Anwendung in der übergeordneten Containergruppe beibehalten.
In diesem Artikel wird erläutert, wie Enklaven funktionieren. Außerdem wird gezeigt, wie Sie Enklavenressourcen anfordern, einen Enklaven-Pod starten, Container darin ausführen und mit ihm kommunizieren.
Funktionsweise von Enklaven
Eine Enklave hat folgende Komponenten:
| Component | Description |
|---|---|
| Übergeordnete Containergruppe | Eine Containergruppe mit der Confidential SKU und einer enclaveProfile Eigenschaft. Das Enklavenprofil reserviert CPU und Arbeitsspeicher für den Enklaven-Pod. |
| Enclave pod | Eine separate AMD SEV-SNP-Hilfsprogramm-VM zum Ausführen eines oder mehrerer Linux-Container. Die übergeordnete Containergruppe startet zur Laufzeit den Enclave Pod. |
hpodctl |
Ein Befehlszeilentool, das in einem Container der übergeordneten Containergruppe ausgeführt wird. Er verwaltet den Enclave-Pod, seine Container und seine Port-Weiterleitungen. |
Der Enclave-Flow hat die folgenden Schritte:
- Sie stellen eine übergeordnete Containergruppe bereit. Die
enclaveProfileEigenschaft reserviert CPU und Arbeitsspeicher für den Enklaven-Pod. - Ein Container in der übergeordneten Containergruppe führt
hpodctl run-podmit einer CCE-Richtlinie für den Enklaven-Pod aus. - Azure Container Instances überprüft, ob die Anforderung den reservierten Ressourcen entspricht. Anschließend wird der Enklave-Pod in einer separaten AMD SEV-SNP Utility-VM gestartet.
- Der übergeordnete Container führt
hpodctl run-containeraus, um ein Image abzurufen und einen Container im Enklaven-Pod zu starten. Die CCE-Richtlinie des Enklaven-Pods steuert, welche Container und Befehle ausgeführt werden können. - Die übergeordnete Containergruppe und der Enklaven-Pod kommunizieren nur über Portweiterleitungen.
Isolationseigenschaften
- Separate TEE. Jeder Enklave-Pod wird in einer eigenen AMD SEV-SNP Hilfsprogramm-VM ausgeführt. Der Enklave-Pod teilt keinen Speicher mit der übergeordneten Containergruppe oder mit anderen Enklaven-Pods.
- Getrennte Richtlinie. Jeder Enklaven-Pod hat seine eigene CCE-Richtlinie. Diese Richtlinie ist von der CCE-Richtlinie der übergeordneten Containergruppe getrennt.
- Kein Netzwerkzugriff. Ein Enklave-Pod hat weder eine öffentliche IP-Adresse noch eine IP-Adresse in Ihrem virtuellen Netzwerk und keinen ausgehenden Internetzugriff. Sie kann nur über Portweiterleitungen mit der übergeordneten Containergruppe kommunizieren.
- Zugriff nur für Besitzer. Nur die übergeordnete Containergruppe, die einen Enklaven-Pod erstellt hat, kann sie verwalten, Befehle darin ausführen und ihre Protokolle lesen. Nur die übergeordnete Containergruppe und ihr Enclave-Pod können die Portweiterleitungen zwischen ihnen sehen und anhalten.
- Dieselbe Lebensdauer wie das übergeordnete Element. Wenn die übergeordnete Containergruppe beendet oder neu gestartet wird, entfernt die Plattform ihren Enklaven-Pod.
Prerequisites
Um dieses Lernprogramm abzuschließen, müssen Sie die folgenden Anforderungen erfüllen:
Azure CLI: Sie müssen Azure CLI Version 2.44.1 oder höher auf Ihrem lokalen Computer installiert haben. Zum Ermitteln Ihrer Version führen Sie
az --versionaus. Wenn Sie die Azure CLI installieren oder aktualisieren müssen, siehe Installieren der Azure CLI.Azure CLI confcom-Erweiterung: Sie müssen Azure CLI confcom Extension Version 0.30+ installiert haben, um Richtlinien zur Durchsetzung von Confidential Computing zu generieren.
az extension add -n confcomDocker: Sie müssen Docker lokal installiert haben. Docker stellt Pakete bereit, die die Docker-Umgebung auf macOS, Windows und Linux konfigurieren.
In diesem Lernprogramm wird ein grundlegendes Verständnis der grundlegenden Docker-Konzepte wie Container, Containerimages und grundlegenden
dockerBefehlen vorausgesetzt. Eine Einführung in Docker und Container finden Sie in der Docker-Übersicht.
Important
Da Azure Cloud Shell den Docker-Daemon nicht enthält, müssen Sie sowohl das Azure CLI als auch die Docker Engine auf Ihrem lokalen Computer installieren, um dieses Lernprogramm abzuschließen. Sie können Azure Cloud Shell für dieses Lernprogramm nicht verwenden.
Außerdem benötigen Sie:
- Ein Containerimage für die übergeordnete Containergruppe, die das
hpodctlTool enthält. Weitere Informationen finden Sie unter Hinzufügen von hpodctl zum übergeordneten Containerimage. - Eine CCE-Richtlinie für den Enklaven-Pod, getrennt von der Richtlinie der übergeordneten Containergruppe. Weitere Informationen finden Sie unter Richtlinien zur Erzwingung von Confidential Computing.
- Containerimages für den Enklaven-Pod in einer Registrierung, die anonymes Pullen zulässt. Weitere Informationen finden Sie unter "Einschränkungen".
hpodctl zum übergeordneten Container-Image hinzufügen
Die übergeordnete Containergruppe verwendet hpodctl, um den Enklaven-Pod zu verwalten.
hpodctl ist eine einzelne ausführbare Linux x64-Datei ohne Laufzeitabhängigkeiten.
Fügen Sie hpodctl zum Image des Containers hinzu, der den Enklaven-Pod verwaltet. Setzen Sie sie auf die PATH des Containers.
Sie müssen keine Verbindung konfigurieren für hpodctl.
Stellen Sie sicher, dass die CCE-Richtlinie der übergeordneten Containergruppe die Befehle zulässt, die mit hpodctl beginnen. Führen Sie hpodctl beispielsweise über das Einstiegspunktskript Ihres Containers aus.
Bereitstellen der übergeordneten Containergruppe mit einem Enklavenprofil
Um Ressourcen für den Enklaven-Pod zu reservieren, fügen Sie der Containergruppe die enclaveProfile Eigenschaft hinzu. Legen Sie diese Werte fest:
-
skuaufConfidential. -
osTypeaufLinux. - Verwenden Sie die API-Version
2023-05-01oder höher.
Das folgende Beispiel zeigt die Containergruppenressource einer ARM-Vorlage. Die übergeordnete Containergruppe verfügt über 1 CPU und 1,5 GB Arbeitsspeicher. Das Enklavenprofil reserviert weitere 1 CPU und 2 GB Arbeitsspeicher für den Enklaven-Pod.
{
"type": "Microsoft.ContainerInstance/containerGroups",
"apiVersion": "2023-05-01",
"name": "[parameters('name')]",
"location": "[parameters('location')]",
"properties": {
"sku": "Confidential",
"osType": "Linux",
"confidentialComputeProperties": {
"ccePolicy": ""
},
"containers": [
{
"name": "parent",
"properties": {
"image": "<your-registry>/<parent-image>:<tag>",
"resources": {
"requests": {
"cpu": 1,
"memoryInGB": 1.5
}
}
}
}
],
"enclaveProfile": {
"cpu": 1,
"memoryInGB": 2
}
}
}
Generieren Sie die CCE-Richtlinie der übergeordneten Containergruppe, und stellen Sie dann die Vorlage bereit. Die vollständigen Schritte finden Sie im Lernprogramm: Vorbereiten einer Bereitstellung für einen vertraulichen Container auf Azure Container Instances.
Enklave-Profilregeln
| Property | Regel |
|---|---|
cpu |
Erforderlich mit memoryInGB. Mindestens 0,4. |
memoryInGB |
Erforderlich mit cpu. Mindestens 0,4. |
Die CPU im Enklavenprofil zählt zum Kernkontingent Ihres Abonnements, identisch mit der CPU Ihrer Container. Weitere Informationen finden Sie unter Ressourcenverfügbarkeits- und Kontingentbeschränkungen.
Enklave-Pod starten
Führen Sie diese Befehle im Container der übergeordneten Containergruppe aus, die hpodctl enthält. In der Regel führt Ihr Einstiegspunktskript sie aus.
Starten Sie einen Enklaven-Pod mit einer CCE-Richtlinie für die Enklave pod. Der Befehl druckt die ID des Enklaven-Pods.
POD=$(hpodctl run-pod --cce-policy-file ./enclave-policy.b64)Starten Sie einen Container im Enclave-Pod. Der Befehl druckt die ID des Containers. Verwenden Sie dieselben Image-, Befehls- und Umgebungsvariablen, die die Richtlinie zulässt.
CTR=$(hpodctl run-container "$POD" mcr.microsoft.com/azurelinux/base/core:3.0 -e GREETING=hello -- /bin/sh -c 'while true; do echo "$GREETING"; sleep 5; done')Stellen Sie sicher, dass der Container ausgeführt wird:
hpodctl containers "$POD" hpodctl logs "$CTR" -n 20
Mit einem Enklaven-Pod kommunizieren
Die übergeordnete Containergruppe und deren Enklaven-Pod sind separate virtuelle Maschinen. Sie können sich nicht direkt miteinander verbinden. Stattdessen kommunizieren sie über Portweiterleitungen.
Apps auf beiden Seiten verwenden vsock Sockets (AF_VSOCK), nicht TCP-Sockets:
- Eine App im Enklave-Pod muss auf einem Vsock-Port lauschen. Der Enklave-Pod kann keine TCP-Verbindungen von der übergeordneten Containergruppe empfangen.
- Eine App in der übergeordneten Containergruppe stellt eine Verbindung mit vsock CID 2 auf dem Listenport der Weiterleitung her.
Weiterleiten von der übergeordneten Containergruppe an einen Enklaven-Pod
Erstellen Sie im übergeordneten Container eine Weiterleitung zu Vsock Port 6666 in der Enklave pod. Verwenden Sie -l, um den Port festzulegen, mit dem die übergeordnete App eine Verbindung herstellt:
hpodctl vsock-forward 6666 --pod "$POD" -l 7777
Der Befehl gibt die Weiterleitungs-ID und den Listenport aus. Die Weiterleitung bleibt aktiv, nachdem der Befehl beendet wurde. Die übergeordnete App kann jetzt eine Verbindung mit vsock CID 2, Port 7777 herstellen. Jede Verbindung geht an Port 6666 im Enklave-Pod.
Wenn Sie diese Option nicht verwenden-l, wählt Azure Container Instances einen zufälligen Listenport zwischen 49152 und 65535 aus und druckt ihn.
Weiterleiten von einer Enklave-Pod zur übergeordneten Containergruppe
Eine App im Enklaven-Pod kann auch eine Verbindung mit der übergeordneten Containergruppe herstellen. In diesem Fall erstellt der Enclave-Pod die Weiterleitung. Der Listenport ist immer identisch mit dem Zielport:
hpodctl vsock-forward 8080 --parent
Um diesen Modus zu verwenden, muss der Enklave-Pod hpodctl enthalten, und seine CCE-Richtlinie muss den Befehl zulassen.
Portweiterleitungen verwalten
# List the port forwards that start or end at this container group or enclave pod.
hpodctl list
# Stop a forward.
hpodctl stop-vsock-forward <forward-id>
Eine übergeordnete Containergruppe oder ein Enklaven pod kann die Quelle von maximal 64 Weiterleitungen sein.
Befehle in einem Enclave-Pod ausführen
Sie können az container exec nicht verwenden, um eine direkte Verbindung mit einer Enklave-Pod herzustellen. Stellen Sie zuerst eine Verbindung mit dem übergeordneten Container her, und verwenden Sie dann hpodctl exec:
Herstellen einer Verbindung mit dem übergeordneten Container:
az container exec --resource-group <resource-group> --name <container-group> --container-name parent --exec-command "/bin/sh"Starten Sie eine Shell im Enklavencontainer:
hpodctl exec -t <container-id> -- /bin/sh
Die CCE-Richtlinien der übergeordneten Containergruppe und des Enklaven-Pods müssen diese Befehle zulassen. Weitere Informationen finden Sie in den --debug-mode-Optionen und exec-Optionen der Azure CLI-Erweiterung „confcom“.
Verwenden Sie hpodctl logs <container-id>zum Lesen der Protokolle eines Enklavencontainers . Fügen Sie -f hinzu, um neue Ausgaben zu verfolgen.
Enklavencontainer beenden und entfernen
Führen Sie Folgendes aus, um einen Enklavencontainer zu beenden und zu entfernen:
hpodctl stop-container "$CTR" -t 10
hpodctl remove-container "$CTR"
Wenn die übergeordnete Containergruppe beendet oder neu gestartet wird, entfernt die Plattform ihren Enklaven-Pod automatisch. Wenn Sie die übergeordnete Containergruppe löschen, wird auch der Enklaven-Pod entfernt.
Um den Enklaven-Pod zu ersetzen (z. B. um eine neue CCE-Richtlinie zu verwenden), starten Sie die übergeordnete Containergruppe neu. Beginnen Sie dann einen neuen Enklave-Pod.
Sicherheitsempfehlungen
- Verwenden Sie immer eine echte CCE-Policy für den Enklaven-Pod.
hpodctl run-podhat auch eine--dev-policyOption. Mit dieser Option können beliebige Container und jeder beliebige Befehl verwendet werden. Verwenden Sie dies nur für Entwicklungszwecke. Verwenden Sie es nicht für Produktionslasten. - Daten während der Übertragung schützen. Portweiterleitungen verschlüsseln den Datenverkehr zwischen der übergeordneten Containergruppe und dem Enklaven-Pod nicht. Wenn Ihre Daten während der Übertragung vertraulich bleiben müssen, verschlüsseln Sie sie Ende-zu-Ende, z. B. mit TLS zwischen der übergeordneten App und der Enklave-App.
- Beschränken Sie die Enclave-Richtlinie auf ein Minimum. Lassen Sie nur die Images, Befehle und Umgebungsvariablen zu, die der Enklave-Pod benötigt. Lassen Sie interaktive Shells in Produktionsrichtlinien nicht zu.
Limitations
- Enklaven sind nur für Linux-Containergruppen mit der
ConfidentialSKU verfügbar. - Das System ruft Enclave-Images ohne Registry-Anmeldedaten ab. Verwenden Sie eine Registry, die anonyme Pulls zulässt. Das System unterstützt keine privaten Registries, die Anmeldeinformationen benötigen.
- Ein Enklave-Pod hat keinen Netzwerkzugriff. Sie kann nur über Portweiterleitungen mit der übergeordneten Containergruppe kommunizieren.
- Nur die übergeordnete Containergruppe kann Befehle in einer Enklave-Pod ausführen. Sie können
az container execnicht verwenden, um sich direkt mit einem Enklaven-Pod zu verbinden. -
az container execbeschränkt den Befehl auf 5.000 Zeichen. Übergeben Sie keine CCE-Richtlinie inline im Befehl. Verwenden Sie stattdessen--cce-policy-file. - Eine übergeordnete Containergruppe kann jeweils nur einen Enklaven-Pod ausführen. Sie können den Enklaven-Pod nicht entfernen, ohne die übergeordnete Containergruppe neu zu starten.
- Portweiterleitungen können z. B. während der Plattformwartung geschlossen werden. Sorgen Sie dafür, dass Ihre App getrennte Verbindungen erkennt und die Weiterleitung erneut erstellt.
- Eine übergeordnete Containergruppe oder ein Enklaven pod kann die Quelle von maximal 64 Portweiterleitungen sein.
hpodctl-Befehlsreferenz
| Command | Description |
|---|---|
run-pod (--cce-policy <base64> \| --cce-policy-file <path> \| --dev-policy) [--cpu-count <n>] [--memory <GB>] |
Starten Sie einen Enclave-Pod, und drucken Sie seine ID. Eine Containergruppe kann nur einen aktiven Enklaven Pod haben. Wenn Sie --cpu-count oder --memory auslassen, verwendet der Enklaven-Pod die gesamte Ressource im Enklavenprofil.
--dev-policy nur für die Entwicklung verwenden. |
pods |
Listen Sie den Enclave-Pod Ihrer Containergruppe auf. |
run-container <pod-id> <image> [-e KEY=VALUE ...] [-- <command> <args>] |
Starten Sie einen Container in einem Enklaven-Pod, und drucken Sie dessen ID. |
containers [<pod-id>] |
Listen Sie Ihre Enclave-Container auf. |
logs <container-id> [-f] [-n <lines>] |
Die Protokolle eines Containers anzeigen oder verfolgen. |
exec [-t] <container-id> [-- <command> <args>] |
Führen Sie einen Befehl oder eine Shell in einem Container aus. Der Standardbefehl ist /bin/sh. |
stop-container <container-id> [-t <seconds>] |
Beenden eines Containers. |
remove-container <container-id> |
Entfernen Sie einen Container. |
vsock-forward <port> --pod <pod-id> [-l <listen-port>] |
Leiten Sie von der übergeordneten Containergruppe an einen Enklaven-Pod weiter. |
vsock-forward <port> --parent |
Leiten Sie von einem Enklave-Pod zur übergeordneten Containergruppe weiter. |
list |
Portweiterleitungen auflisten, die beim Aufrufer beginnen oder enden. |
stop-vsock-forward <forward-id> |
Beende eine Portweiterleitung, die beim Aufrufenden beginnt oder endet. |
Um alle Optionen eines Befehls anzuzeigen, führen Sie hpodctl <command> --help aus.