Webapplikationen im Kubernetes Cluster mit Client Zertifikaten schützen

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?