Arbeitslasten erstellen und anpassen


Eine Arbeitslast wird von einem Arbeitslastautor erstellt und verarbeitet die vertraulichen Daten, mit denen Datenmitbearbeiter arbeiten möchten.

Ein Arbeitslastautor muss die folgenden Ressourcen zusammenstellen, um eine Arbeitslast zu erstellen:

  • Eine Anwendung zur Verarbeitung der vertraulichen Daten. Sie können Ihre Anwendung in einer beliebigen Sprache schreiben, sofern Sie ein containerisiertes Image erstellen, das diese Sprache unterstützt.

  • Ein Container-Image, um die Anwendung mit Docker zu verpacken.

  • Ein Repository in Artifact Registry zum Speichern des Docker-Images.

  • Startrichtlinien, die für das Container-Image festgelegt sind und steuern, wie eine Arbeitslast ausgeführt werden kann, und die Möglichkeiten eines böswilligen Arbeitslastoperators einschränken.

Zum Bereitstellen der Arbeitslast wird eine Confidential VM von einem Arbeitslastoperator auf Grundlage des Confidential Space-Images ausgeführt. Dadurch wird das containerisierte Image aus Artifact Registry abgerufen und ausgeführt.

Daten-Mitbearbeiter müssen die Attestierungen einer Arbeitslast validieren, bevor sie auf ihre Daten zugreifen können.

Hinweise

Das Schreiben einer Arbeitslast für Confidential Space umfasst mehr als nur Code und Debugging. Sie müssen sich auch mit Datenmitarbeitern austauschen, um ihre Anforderungen zu ermitteln, Ihre Umgebung einzurichten, Ihren Code in einem Container-Image zu verpacken und mit einem Workload-Operator zusammenarbeiten, um sicherzustellen, dass alles korrekt bereitgestellt wird.

Mit den Datenmitarbeitern sprechen

Bevor Sie mit dem Schreiben Ihrer Anwendung beginnen, müssen Sie sich mit Ihren Datenpartnern darüber unterhalten, welche privaten Daten sie Ihnen zur Verfügung stellen möchten. Hier einige Beispielfragen:

  • Welche Organisations-IDs sind betroffen?

  • Welche Projektnummern sind betroffen?

  • Auf welche Google Cloud Ressourcen muss ich zugreifen und welche IDs und Namen haben sie?

  • Gibt es Ressourcen, auf die ich zugreifen muss, die nicht von Google CloudIAM verwaltet werden?

  • Wie sollte die Anwendung die privaten Daten vergleichen und verarbeiten?

  • In welchem Format sollte die Ausgabe erfolgen?

  • Wo soll die Ausgabe gespeichert werden und soll sie verschlüsselt werden?

  • Sehen alle Datenmitarbeiter dasselbe Ergebnis oder sind die Ausgaben für jeden einzigartig?

Außerdem hat jeder Datenpartner möglicherweise eigene Datenschutzanforderungen, die Sie erfüllen müssen. Es ist von entscheidender Bedeutung, dass durch einen Arbeitslast keine privaten Daten offengelegt werden.

Confidential Space-Lösung erstellen

Es ist sinnvoll, zwei oder mehr Projekte mit den entsprechenden Berechtigungen als Testumgebung einzurichten, wie in Erste Confidential Space-Umgebung erstellen beschrieben. Versuchen Sie, die Projekteinrichtung der Daten-Mitbearbeiter so gut wie möglich nachzubilden. So können Sie sich mit projektübergreifenden Berechtigungen vertraut machen und die benötigten Daten aus bestimmten Google Cloud Ressourcen abrufen. Außerdem erhalten Sie einen Überblick über die Rollen „Workload-Operator“ und „Daten-Mitwirkender“ und ihre Verantwortlichkeiten.

In der frühen Entwicklungsphase ist es hilfreich, die folgenden Empfehlungen zu beachten:

  • Wenn Sie als Datenbearbeiter arbeiten, sollten Sie die Bestätigungsvalidierung aus Gründen der Entwicklungsgeschwindigkeit auf ein Minimum beschränken.

  • Wenn Sie als Arbeitslastoperator arbeiten, verwenden Sie beim Bereitstellen der Arbeitslast das Confidential Space-Debug-Image anstelle des Produktions-Images. So haben Sie mehr Möglichkeiten, Fehler in der Arbeitslast zu beheben.

Wenn Ihre Anwendung ausgereifter ist und ihr Status vorhersehbarer wird, können Sie Ihre Lösung zunehmend mit Bestätigungsvalidierung und Startrichtlinien sichern und zum Confidential Space-Produktions-Image wechseln.

Nachdem Ihre Arbeitslast in Ihrer Testumgebung korrekt funktioniert, können Sie mit dem Testen in den Projekten Ihrer Datenpartner mit echten Ressourcen, aber gefälschten Daten fortfahren, damit Sie den Datenpartnern zeigen können, wie alles funktioniert. Zu diesem Zeitpunkt können Sie mit einem unabhängigen Arbeitslastoperator zusammenarbeiten.

Wenn alles funktioniert und die Ausgabe wie erwartet ist, können Sie mit dem Testen mit Produktionsdaten beginnen. Nach Abschluss der Tests und der Genehmigung der Ergebnisse durch alle Beteiligten kann der Arbeitslast in der Produktion eingesetzt werden.

Vorsicht bei der Ausgabe

Beim Testen von Code kann es verlockend sein, Fehler zu beheben, indem Sie in STDOUT oder STDERR ausgeben. Wenn Sie sich dafür entscheiden, achten Sie darauf, dass Sie keine privaten Daten preisgeben, die andere Parteien durch Zugriff auf Logs lesen könnten. Bevor Ihr Code in der Produktion ausgeführt wird, sollten Sie darauf achten, dass er nur die unbedingt erforderlichen Informationen ausgibt.

Dasselbe gilt für die endgültige Ausgabe. Geben Sie nur ein Endergebnis an, das die Vertraulichkeit und Sensibilität der Originaldaten nicht beeinträchtigt.

Containerisiertes Image mit Docker erstellen

Anwendungen müssen in einem von Docker erstellten Container-Image verpackt werden, das in Artifact Registry gespeichert ist. Wenn eine Arbeitslast bereitgestellt wird, wird das Docker-Image vom Confidential Space-Image aus dem Artifact Registry-Repository abgerufen und ausgeführt. Die Anwendung kann dann mit den entsprechenden Projektressourcen arbeiten.

Beachten Sie beim Erstellen Ihres Docker-Images Folgendes:

Zusätzliche Linux-Funktionen

Die Confidential Space-Arbeitslast wird in einem Linux-Container mit containerd ausgeführt. Dieser Container wird mit Standard-Linux-Funktionen ausgeführt.

Um Funktionen hinzuzufügen, können Sie tee-added-capabilities verwenden.

Laufwerks- und Arbeitsspeicherlimits

Confidential Space ändert automatisch die Größe der zustandsbehafteten Partition des Bootlaufwerks, wenn größere Bootlaufwerksgrößen verwendet werden. Die Partitionsgröße entspricht ungefähr der Größe des Bootlaufwerks minus 5 GB.

Im Rahmen der Dateisystemschutzmaßnahmen für die Integrität von Confidential Space werden Datenträger-Integritäts-Tags im Arbeitsspeicher gespeichert. Dies führt zu einem Arbeitsspeicher-Overhead von etwa 1% pro Byte auf der Festplatte. Für eine 100‑GB-Festplatte sind beispielsweise 1 GB Arbeitsspeicher erforderlich, für eine 10‑TB-Festplatte 100 GB.

Achten Sie darauf, die VM-Arbeitsspeicherlimits einzuhalten. Swap-Speicher ist auf Confidential Space-VMs deaktiviert, sodass eine übermäßige Speichernutzung die Arbeitslast abstürzen lassen kann. Achten Sie darauf, dass die von Ihnen ausgewählte Maschine den Arbeitsspeicherbedarf Ihrer Arbeitslast zusätzlich zum Overhead für die Festplattenintegrität unterstützt.

Abgelaufene OIDC-Tokens

Ein OIDC-Token wird für Ihre Arbeitslast zur Verfügung gestellt, wenn sie gestartet wird. Es enthält bestätigte Attestierungsansprüche zur VM Ihrer Arbeitslast und wird im Arbeitslastcontainer unter /run/container_launcher/attestation_verifier_claims_token gespeichert. Das Token läuft nach 60 Minuten ab.

Wenn das Token abläuft, wird im Hintergrund eine Aktualisierung mit exponentiellem Backoff versucht, bis dies erfolgreich ist. Wenn eine Aktualisierung fehlschlägt (aufgrund von Netzwerkproblemen, eines Ausfalls des Attestierungsdienstes oder aus anderen Gründen), muss Ihr Workload-Code diesen Fehler beheben können.

Ihre Arbeitslast kann einen Fehler beim Aktualisieren des Tokens auf eine der folgenden Arten behandeln:

  • Ignorieren Sie das abgelaufene Token, da es nach der ersten Verwendung nicht mehr benötigt wird.

  • Warten Sie, bis das abgelaufene Token erfolgreich aktualisiert wurde.

  • Beenden Sie die Arbeitslast.

In-Memory-Scratch-Bereitstellungen

Confidential Space unterstützt das Hinzufügen von In-Memory-Scratch-Bereichen. Dabei wird der verfügbare Arbeitsspeicher in der Confidential Space-VM verwendet. Da der Scratch-Bereich den Arbeitsspeicher der Confidential VM verwendet, hat er dieselben Integritäts- und Vertraulichkeitseigenschaften wie die Confidential VM.

Sie können tee-dev-shm-size verwenden, um die Größe der /dev/shm-Freigabe für die Arbeitslast zu erhöhen. Die Größe von /dev/shm wird in KB angegeben.

Mit tee-mount können Sie tmpfs-Bereitstellungen im laufenden Container mit durch Semikolon getrennten Konfigurationen angeben. type und source sind immer tmpfs. destination ist der Mountpoint, der mit der tee.launch_policy.allow_mount_destinations-Startrichtlinie interagiert. Optional können Sie die tmpfs-Größe in Byte angeben. Die Standardgröße beträgt 50% des VM-Arbeitsspeichers.

Eingehende Ports

Standardmäßig werden Confidential Space-VMs mit einer Firewallregel betrieben, die alle eingehenden Ports blockiert. Wenn Sie eine Confidential Space-Image-Version ab 230600 verwenden, können Sie beim Erstellen Ihres Arbeitslast-Images in Dockerfile eingehende Ports angeben, die geöffnet bleiben sollen.

Fügen Sie dazu Schlüsselwort EXPOSE mit der Portnummer und einem optionalen Protokoll von tcp oder udp der Dockerfile hinzu, um die Ports zu öffnen. Wenn Sie das Protokoll für einen Port nicht angeben, sind sowohl TCP als auch UDP zulässig. Hier ist ein Beispiel für Dockerfile, mit dem eingehende Ports preisgegeben werden:

FROM alpine:latest
EXPOSE 80
EXPOSE 443/tcp
EXPOSE 81/udp
WORKDIR /test
COPY salary /test
ENTRYPOINT ["/test/salary"]
CMD []

Je nach verwendetem Basis-Image sind möglicherweise bereits einige Ports freigegeben. Ihr Dockerfile macht nur zusätzliche Ports verfügbar. Es kann keine Ports blockieren, die bereits vom Basis-Image geöffnet wurden.

Arbeitslastbetreiber sollten dafür sorgen, dass die freigegebenen Ports in ihrer VPC-Firewall geöffnet sind, bevor sie die Arbeitslast ausführen. Die Portnummern können vom Autor der Arbeitslast angegeben oder aus den Docker-Bildinformationen abgerufen werden.

Offengelegte Ports werden in der Konsole protokolliert und an Cloud Logging weitergeleitet, wenn die Metadatavariable tee-container-log-redirect verwendet wird.

Startrichtlinien

Startrichtlinien überschreiben die von Arbeitslastoperatoren festgelegten VM-Metadatavariablen, um schädliche Aktionen einzuschränken. Ein Arbeitslastautor kann beim Erstellen seines Container-Images Richtlinien mit einem Label festlegen.

Beispiel: Dockerfile

LABEL "tee.launch_policy.allow_cmd_override"="true"

In einer Bazel-BUILD-Datei:

container_image(
    ...
    labels={"tee.launch_policy.allow_cmd_override":"true"}
    ...
)

Die verfügbaren Startrichtlinien finden Sie in der folgenden Tabelle:

Richtlinie Typ Beschreibung

tee.launch_policy.allow_capabilities

Interagiert mit:

Boolesch (Standardwert ist false) Gibt an, ob der Arbeitslastoperator dem Arbeitslastcontainer zusätzliche Linux-Funktionen hinzufügen kann.

tee.launch_policy.allow_cgroups

Interagiert mit:

Boolesch (Standardwert ist false) Bestimmt, ob der Arbeitslastcontainer eine Namespaced-Cgroup-Bereitstellung unter /sys/fs/cgroup enthalten darf.

tee.launch_policy.allow_cmd_override

Interagiert mit:

Boolesch (Standardwert ist false) Bestimmt, ob das im Dockerfile des Arbeitslastcontainers angegebene CMD durch einen Arbeitslastoperator mit dem Metadatenwert tee-cmd überschrieben werden kann.

tee.launch_policy.allow_env_override

Interagiert mit:

Durch Kommas getrennter String Ein durch Kommas getrennter String mit zulässigen Umgebungsvariablennamen, die von einem Arbeitslastoperator mit tee-env-ENVIRONMENT_VARIABLE_NAME-Metadatenwerten festgelegt werden dürfen.

tee.launch_policy.allow_mount_destinations

Interagiert mit:

  • Arbeitslastoperator: Die Metadatenvariable tee-mount.
Durch Doppelpunkte getrennter String

Ein durch Doppelpunkte getrennter String mit zulässigen Bereitstellungsverzeichnissen, in die der Arbeitslastoperator mit tee-mount einbinden darf.

Beispiel: /run/tmp:/var/tmp:/tmp

tee.launch_policy.log_redirect

Interagiert mit:

Definierter String

Bestimmt, wie das Logging funktioniert, wenn tee-container-log-redirect von einem Arbeitslastoperator auf true gesetzt wird.

Die gültigen Werte sind:

  • debugonly (Standard): Nur stdout- und stderr-Weiterleitungen zulassen, wenn ein Debug-Image verwendet wird.
  • always: Lässt immer stdout- und stderr-Weiterleitungen zu.
  • never: Lässt niemals stdout- und stderr-Weiterleitungen zu.

tee.launch_policy.monitoring_memory_allow

Interagiert mit:

Definierter String

Bestimmt, wie die Überwachung der Speichernutzung von Arbeitslasten funktioniert, wenn tee-memory-monitoring-enable von einem Arbeitslastoperator auf true gesetzt wird.

Die gültigen Werte sind:

  • debugonly (Standard): Die Überwachung der Speichernutzung ist nur bei Verwendung eines Debug-Images zulässig.
  • always: Überwachung der Speichernutzung immer zulassen.
  • never: Die Überwachung der Speichernutzung ist nie zulässig.

Mehrere Arbeitslastausführungen

Damit eine saubere Umgebung gewährleistet ist, muss eine VM neu gestartet werden, um eine Arbeitslast neu zu starten. Dadurch wird das VM-Laufwerk mit einem temporären Schlüssel verschlüsselt, um den Angriffsvektor der Änderung eines Arbeitslast-Images auf dem Laufwerk zu beheben, nachdem es heruntergeladen und gemessen wurde.

Außerdem fallen zusätzliche Kosten an, z. B. für die Bootzeit und das Herunterladen des Arbeitslast-Images für jeden Arbeitslastlauf. Wenn diese Overheads die Leistung Ihrer Arbeitslast zu stark beeinträchtigen, können Sie einen Neustart der Arbeitslast in die Arbeitslast selbst codieren, was jedoch Ihr Risikoprofil erhöht.

Cgroups mit Namespaces

Die Confidential Space-Arbeitslast wird standardmäßig ohne cgroup-Mount ausgeführt.

Wenn Sie Cgroups im Arbeitslastcontainer verwalten möchten, können Sie tee-cgroup-ns verwenden. Dadurch wird im Containerdateisystem eine Bereitstellung unter /sys/fs/cgroup erstellt.

Reproduzierbare Container-Images

Wenn Sie ein Container-Image auf reproduzierbare Weise erstellen, kann dies dazu beitragen, das Vertrauen zwischen den Parteien zu stärken. Sie können reproduzierbare Images mit Bazel erstellen.

Ressourcen, die nicht von Google Cloud IAM verwaltet werden

Wenn Sie auf Ressourcen zugreifen möchten, die nicht von Google Cloud IAM verwaltet werden, muss in Ihrem Arbeitslast eine benutzerdefinierte Zielgruppe angegeben werden.

Weitere Informationen finden Sie unter Auf Ressourcen zugreifen, die nicht von Google Cloud IAM verwaltet werden.

Signierte Container-Images

Sie können ein Container-Image mit einem öffentlichen Schlüssel signieren, den ein Datenpartner dann für die Attestierung verwenden kann, anstatt einen Image-Digest in seiner WIP-Richtlinie anzugeben.

Das bedeutet, dass Datenbearbeiter ihre WIP-Richtlinien nicht jedes Mal aktualisieren müssen, wenn eine Arbeitslast aktualisiert wird, und die Arbeitslast weiterhin ohne Unterbrechung auf geschützte Ressourcen zugreifen kann.

Sie können Sigstore Cosign verwenden, um das Container-Image zu signieren. Damit Confidential Space die Signaturen abrufen kann, müssen Arbeitslastoperatoren die Signaturinformationen der Metadatavariablen tee-signed-image-repos hinzufügen, bevor sie die Arbeitslast bereitstellen.

Zur Laufzeit werden Signaturen zur Überprüfung an den Attestierungsdienst für Confidential Space gesendet. Der Attestierungsdienst gibt ein Attestierungsanspruchstoken zurück, das die Ansprüche der überprüften Signatur enthält. Hier ein Beispiel für einen Signaturanspruch:

"image_signatures": [
  {
    "key_id": "hexadecimal-sha256-fingerprint-public-key1",
    "signature": "base64-encoded-signature",
    "signature_algorithm": "RSASSA_PSS_SHA256"
  },
  {
    "key_id": "hexadecimal-sha256-fingerprint-public-key2",
    "signature": "base64-encoded-signature",
    "signature_algorithm": "RSASSA_PSS_SHA256",
  },
  {
    "key_id": "hexadecimal-sha256-fingerprint-public-key3",
    "signature": "base64-encoded-signature",
    "signature_algorithm": "RSASSA_PSS_SHA256",
  }
],

Informationen zum Konfigurieren der Signierung von Container-Images finden Sie im Codelab für signierte Container-Images.