Eine Private Registry kann hilfreich sein, um Linux Container Images für Ihre Anwendungen in einer internen, kontrollierten (und potenziell sichereren) Infrastruktur zu speichern.

Linux Container sind Technologien, mit denen Sie Anwendungen mit ihrer gesamten Runtime-Umgebung – d. h. mit allen für den Betrieb notwendigen Dateien – paketieren und isolieren können. Damit kann die enthaltene Anwendung leicht zwischen Umgebungen (Entwicklung, Test, Produktion usw.) verschoben werden.

 

Red Hat ausgezeichnet als Leader im 2023 Gartner® Magic Quadrant™

Red Hat wurde im Gartner 2023 Magic Quadrant für Container Management hinsichtlich der Ausführungsfähigkeit und der umfassenden Vision bestplatziert.

In diesem Artikel zeige ich Ihnen, wie Sie eine einfache SSL/TLS-fähige Private Registry mit einem stärkeren Sicherheitsstatus erstellen, die zum Speichern von Containern im Allgemeinen verwendet werden kann, und wie Sie sie in Red Hat OpenShift integrieren, um getrennte OCP-Bereitstellungen durchführen zu können. Sie kann auch für Fälle verwendet werden, in denen der OperatorHub keinen Internetzugang hat.

Voraussetzungen:

Wir benötigen folgende Voraussetzungen:

  • FQDN: registry.rhbrlabs.com
  • BS: Red Hat Enterprise Linux 8.6+
  • SELinux: Erzwingend
  • Firewalld: Aktiviert
  • Registry: Podman
  • Apache-Tools
  • Volumen: 100 GB bereitgestellt auf /data

Diese Registry unterstützt getrennte Installationen von OpenShift vollständig.

Installation

Eine Installation zur Maximierung der Systemsicherheit besteht aus der Verwendung von Kryptographie zusätzlich zu den Sicherheitsfunktionen, die bereits in Linux verfügbar sind.

Erstellen Sie die erforderlichen Verzeichnisse:

[root@registry ~]# mkdir -p /data/registry/{auth,certs,data}

Zertifikate

Generieren Sie Zertifikate für die Container-Registry. In diesem Beispiel erstellen wir Zertifikate, die 10 Jahre gültig sind:

[root@registry ~]# openssl req -newkey rsa:4096 -nodes -sha256 \
-keyout /data/registry/certs/registry.rhbrlabs.com.key -x509 -days 3650 \
-out /data/registry/certs/registry.rhbrlabs.com.crt \
-subj "/C=US/ST=NorthCarolina/L=Raleigh/O=Red Hat/OU=Engineering/CN=registry.rhbrlabs.com" \
-addext "subjectAltName = DNS:registry.rhbrlabs.com"

Das Betriebssystem muss den generierten Zertifikaten vertrauen.

Kopieren Sie das generierte Zertifikat in das vertrauenswürdige Verzeichnis bzw. führen Sie update-ca-trust: aus.

[root@registry ~]# cp /data/registry/certs/registry.rhbrlabs.com.crt /etc/pki/ca-trust/source/anchors/

[root@registry ~]# update-ca-trust

Benutzerkonten

Um den Zugriff auf unsere Registry zu steuern, müssen wir Benutzerkonten erstellen. Im folgenden Beispiel erstellen wir ein Konto für die Benutzer-Registry.

Generieren Sie eine Authentifizierungsdatei für die Image-Registry:

[root@registry ~]# dnf -y install httpd-tools

[root@registry ~]# htpasswd -bBc /data/registry/auth/htpasswd registry redhat12345678

HTTP-Secret

Zusätzlich zum Benutzerkonto benötigen wir ein Secret, um die Zuverlässigkeit des Zugriffs zu erhöhen.

Generieren Sie ein zufälliges Secret:

[root@registry ~]# date | md5sum

10f207a4cbba51bf00755b5a50718966

Registry-Software

Sobald die erforderlichen Daten vorliegen, kann die Registry erstellt werden.

Erstellen Sie die Container-Registry mit dem Image docker.io/library/registry:2:

[root@registry ~]# dnf -y install podman

[root@registry ~]# podman create --name ocp-registry --net host -p 5000:5000 \ -v /data/registry/data:/var/lib/registry:z -v /data/registry/auth:/auth:z \ -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry" \ -e "REGISTRY_HTTP_SECRET=10f207a4cbba51bf00755b5a50718966" \ -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -v /data/registry/certs:/certs:z \ -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.rhbrlabs.com.crt \ -e REGISTRY_HTTP_TLS_KEY=/certs/registry.rhbrlabs.com.key docker.io/library/registry:2

Der oben aufgeführte Befehl erzeugt eine Meldung wie diese:

Trying to pull docker.io/library/registry:2...
Getting image source signatures
Copying blob fd4a5435f342 done 
Copying blob 213ec9aee27d done 
Copying blob 4583459ba037 done 
Copying blob b136d5c19b1d done 
Copying blob 6f6a6c5733af done 
Copying config dcb3d42c17 done 
Writing manifest to image destination
Storing signatures
Port mappings have been discarded as one of the Host, Container, Pod, and None network modes are in use
22633f37262a4ab2d64fc8beb44bb80618b11802974fb2f45d31d98db3cf14e8

Die Registry ist nun einsatzbereit. Wir benötigen jedoch eine Möglichkeit, das Starten und Stoppen des Service zu steuern.

Startup-Steuerung

Erstellen Sie eine UNIT-Datei für Ihre Registry, um den Container beim Booten automatisch zu starten:

[root@registry ~]# cat /etc/systemd/system/ocp-registry.service

[Unit] Description=OCP Registry [Service] Restart=always ExecStart=/usr/bin/podman start -a ocp-registry ExecStop=/usr/bin/podman stop -t 10 ocp-registry [Install] WantedBy=network-online.target

Starten Sie den Container:

[root@registry ~]# systemctl daemon-reload

[root@registry ~]# systemctl enable --now ocp-registry.service
Private registry running

Ausführung der Private Registry

Firewall

Da wir eine lokale Firewall verwenden, müssen wir den Registry Service Port autorisieren.

Lassen Sie TCP-Port 5000 auf Firewalld zu:

[root@registry ~]# firewall-cmd --permanent --add-port=5000/tcp

[root@registry ~]# firewall-cmd --reload

Überprüfen Sie, ob die Registry funktioniert

Überprüfen wir nun den Zugriff auf unsere neue Registry.

Prüfen Sie, ob die Authentifizierung und die SSL/TLS-Vertrauenswürdigkeit funktionieren:

[root@registry ~]# curl -u 'registry:redhat12345678' https://registry.rhbrlabs.com:5000/v2/_catalog

{"repositories":[]}

Integration von Red Hat OpenShift

Wenn Sie diese Registry zusammen mit OCP verwenden möchten, erstellen Sie eine Datei im base64-Format mit den Authentifizierungsinformationen.

Generieren Sie eine temporäre Datei mit den Authentifizierungsinformationen für getrennte OpenShift-Installationen:

[root@registry ~]# cat <<EOF > ~/registry-secret.json
"registry.rhbrlabs.com:5000": {
   "email": "registry@redhat.com",
   "auth": "$(echo -n 'registry:redhat12345678' | base64 -w0)"
}
EOF

Zusammenfassung

Ihre neue Private Registry mit zusätzlichen Sicherheitsfunktionen ist jetzt aktiv. Der Service einer Private Registry ist eine gute Möglichkeit, den Zugriff zu kontrollieren und strengere Sicherheitsstandards zu erfüllen, da öffentliche Registry-Services anfälliger für Sicherheitsprobleme sind.

In diesem Beitrag habe ich Ihnen eine Anleitung zum Erstellen einer sicherheitsverstärkten Registry von Grund auf gegeben. Obwohl es sich um eine funktionale Lösung handelt, fehlen erweiterte Features wie Hochverfügbarkeit, Mirroring, Caching und Georeplikation, die in robusteren Lösungen bereits vorhanden sind.

Diese Funktionen sowie das Scannen von Container-Schwachstellen, die Unterstützung von Objekt-Storage und die automatische Skalierung sind in Red Hat Quay integriert.

Die Container Registry Plattform Red Hat Quay bietet sicheres Speichern, Verteilen und Governance von Containern und cloudnativen Artefakten in beliebigen Infrastrukturen. Die Plattform ist als Standalone-Komponente verfügbar und kann auf Red Hat OpenShift ausgeführt werden.


About the author

Andre Rocha is a Consultant at Red Hat focused on OpenStack, OpenShift, RHEL and other Red Hat products. He has been at Red Hat since 2019, previously working as DevOps and SysAdmin for private companies.

Read full bio