Webapplikationen im Kubernetes Cluster mit Client Zertifikaten schützen
Der Artikel gibt einen Überblick über die Schritte die notwendig sind, den Zugriff auf eine Webapplikation im Kubernetes Cluster mittels TLS Client Zertifikaten zu beschränken.
Annahmen
Eine Webapplikation in einem Namespace namespace
ermöglicht den Zugriff über einen Ingress ingress
. Dieser Zugriff soll per Client Zertifikat Authentifzierung geschützt werden.
Zertifikate erstellen
Die notwendigen Zertfikate lassen sich einfach mit OpenSSL erstellen.
Erstellen der CA und des Client Zertifikats
openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 3560 \
-nodes -subj '/CN=CA for joachim-wilke.de'
openssl req -new -newkey rsa:4096 -keyout client.key -out client.csr \
-nodes -subj '/CN=Clientcert for joachim-wilke.de'
openssl x509 -req -sha256 -days 3650 -in client.csr -CA ca.crt -CAkey ca.key \
-set_serial 01 -out client.crt
Speichern des CA Zertifikats im Cluster
kubectl create secret generic ca-secret --from-file=ca.crt=ca.crt --namespace=namespace
Speichern des Client Zertifikats auf dem Endgerät
Das Vorgehen ist abhängig von der verwendeten Plattform.
Windows
- Das Zertifikat in das pkcs12 Format konvertieren:
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt
- Die Datei
client.pfx
im Explorer öffnen und dem Import-Assistenten folgen und die Standardwerte blassen. Das Zertifikat wird im Ordner “Eigene Zertfikate” importiert. - In Browsern wie Firefox ggf. das Zertifikat über “Einstellungen” –> “Zertifikate” manuell importieren.
iOS
- Das Zertifikat in das pkcs12 Format konvertieren:
openssl pkcs12 -export -out client.pfx -inkey client.key -in client.crt
- Die Datei
client.pfx
als E-Mail-Anhang an das iOS Gerät senden. - Den Anhang im Gerät öffnen und in den Gerätespeicher laden.
Android
TBD.
Zugriffschutz aktivieren
Der Kubernetes-Ingress muss um folgende Annotationen unter metadata.annotations
erweitert werden:
# Enable client certificate authentication
nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
# Create the secret containing the trusted ca certificates
nginx.ingress.kubernetes.io/auth-tls-secret: "namespace/ca-secret"
- Achtung: Der Namespace darf nicht weggelassen werden, selbst wenn Ingress und Secret im gleichen Namespace liegen.
- Die Annotiationen greifen für die gesamte Domain. Existieren mehrere Ingressobjekte mit unterschiedlichen Pfadspezifikationen sind alle Zugriffe auf die Domain authentifiziert, auch wenn die Annotiationen nur in einem Ingressobjekt vorhanden sind. Ein beschränken auf einzelne Pfade innerhalb der Domain ist damit nicht so ohne weiteres möglich.
Offene Punkte
- Warum übernimmt Firefox die Zertifikate nicht aus dem Windows-Zertifikatestore?