Wie Sie eine eigenen OCI Registry verwenden
Das ZETA Guard Helm Chart verweist standardmäßig auf Images bei den Upstream Registries. Für den produktiven Einsatz ist aus Gründen der Verfügbarkeit und Trafficvermeidung eine puffernde lokale Registry vom Anbieter zu nutzen.
Damit dann die Images von dort bezogen werden, muss dies über Helm Values entsprechend gesteuert werden:
- allgemeine Konfiguration
global.registry_hostName der Registry, z.B.my.registry.corp.internal:443global.imagePullSecrets(optional) Liste mit Image Pull Secrets im Syntax von Kubernetes. Erforderlich, wenn Container Images durch Authentifizierung geschützt sind.
- Authorization Server
authserver.image.repositoryName des authserver Images auf der Registryauthserver.image.tagZu verwendender Image Tagauthserver.image.digestoptionaler Image Digest – überschreibt den Tag, wenn vorhandenauthserver.imagePullPolicyist standartmäßigAlwaysauthserver.imagePullSecrets(optional) ähnlichglobal.imagePullSecrets
- PEP Http Proxy
pepproxy.image.repositoryName des authserver Images auf der Registrypepproxy.image.tagZu verwendender Image Tagpepproxy.image.digestoptionaler Image Digest – überschreibt den Tag, wenn vorhandenpepproxy.imagePullPolicyist standartmäßigAlwayspepproxy.imagePullSecrets(optional) ähnlichglobal.imagePullSecrets
- Provisioning Processor (Init-Container)
provisioningProcessor.image.repositoryPfad des Provisioning-Processor-Images in der RegistryprovisioningProcessor.image.tagZu verwendender Image TagprovisioningProcessor.provisioningContainerOCI-Image-Referenz des Provisioning-Daten-Images (wird zur Laufzeit vom Init-Container geladen, siehe unten)provisioningProcessor.provisioningContainerCaSecretRefCA-Zertifikat der Registry als Secret-Referenz (siehe unten)
Inhaltsverzeichnis
Begriffe: Provisioning Processor und Provisioning-Daten-Image
Der Provisioning Processor ist ein Init-Container, der beim Start der ZETA Guard Pods (Authserver, PEP-Proxy, OPA) ausgeführt wird. Er wird über provisioningProcessor.image.* konfiguriert und ist Bestandteil des Helm Charts. Mehr zur Konfiguration des Provisioning Processors findet sich in der Ressourcenverwaltung.
Das Provisioning-Daten-Image (konfiguriert über provisioningProcessor.provisioningContainer) ist ein separates OCI-Image, das der Provisioning Processor zur Laufzeit aus der Registry herunterlädt und auf seine cosign-Signatur prüft. Es enthält kryptografisches Material (Trust-Roots, Zertifikatsketten), das von den ZETA Guard Diensten benötigt wird — z.B. die SMC-B-Vertrauensanker aus der TSL.
Provisioning-Daten-Image spiegeln
Das Provisioning-Daten-Image (zetaguard-provisioning) wird vom Init-Container zur Laufzeit aus der Registry geladen und auf seine cosign-Signatur geprüft. cosign legt Signaturen als separate OCI-Artefakte unter einem .sig-Tag in derselben Registry ab (z.B. europe-west3-docker.pkg.dev/.../zeta-guard-provisioning:sha256-<digest>.sig).
Beim Spiegeln müssen daher sowohl der Image-Tag als auch der zugehörige .sig-Tag in die Ziel-Registry übertragen werden. Dafür gibt es mehrere Möglichkeiten:
cosign save/load(empfohlen): überträgt Image und alle Signatur-Artefakte in einem Schritt, ohne dass der.sig-Tag explizit bekannt sein muss.docker pull/push: möglich, erfordert aber das explizite Spiegeln des.sig-Tags zusätzlich zum Image-Tag.skopeo copy: geeignet insbesondere in OpenShift-Umgebungen. Ob.sig-Tags automatisch mitübertragen werden, hängt vom eingesetzten Registry-Backend ab — bei Red Hat Quay müssen die.sig-Tags explizit angegeben werden. Das intern genutzte Tool und Registry-Produkt sind daher stets zu prüfen.
Image mit Signatur in die eigene Registry übertragen
Auf einem Rechner mit Zugriff auf die gematik-Registry:
cosign save \
--dir /tmp/zetaguard-provisioning-cosign \
europe-west3-docker.pkg.dev/gematik-pt-zeta-test/zeta-provisioning/zeta-guard-provisioning:latest
tar -czf zetaguard-provisioning-cosign.tar.gz \
-C /tmp zetaguard-provisioning-cosign
Den Tarball auf ein System übertragen, das Zugriff auf die interne Registry hat (z.B. eine Jumphost-VM im Zielnetz), und dort ausführen:
tar -xzf zetaguard-provisioning-cosign.tar.gz -C /tmp
cosign load \
--dir /tmp/zetaguard-provisioning-cosign \
my.registry.corp.internal/zetaguard-provisioning:latest
# Temporäre Dateien können danach gelöscht werden:
rm -rf /tmp/zetaguard-provisioning-cosign zetaguard-provisioning-cosign.tar.gz
cosign load überträgt Image und Signatur in die Ziel-Registry.
CA-Zertifikat für die Registry
Wenn die Registry ein Zertifikat von einer Certification Authority (CA) verwendet, die nicht öffentlich vertrauenswürdig ist (z.B. eine interne CA), muss das CA-Zertifikat dem Init-Container mitgegeben werden. Das Zertifikat wird als Kubernetes Secret angelegt und als Datei in den Init-Container gemountet. Diese Variante vermeidet das Kernel-Limit ARG_MAX, das bei der Übergabe großer Zertifikatsketten als Umgebungsvariable überschritten werden kann.
kubectl create secret generic registry-ca \
--from-file=ca.crt=/path/to/ca.pem
zeta-guard:
provisioningProcessor:
provisioningContainerCaSecretRef:
name: registry-ca
key: ca.crt
- Analoges wird für die weiteren Images stückweise folgen