Kubernetes-ETCD mit OVHcloud KMS verschlüsseln

Als Markdown ansehen

Erfahren Sie, wie Sie Kubernetes konfigurieren, um den ETCD-Speicher mit der KMIP-Schnittstelle von OVHcloud KMS zu verschlüsseln

Ziel

Dieser Leitfaden erläutert, wie Sie den Verschlüsselungsanbieter des kube-apiserver einrichten, damit Kubernetes-Cluster Daten im Ruhezustand über OVHcloud KMS mithilfe des KMIP-Protokolls verschlüsseln und entschlüsseln können.

Voraussetzungen

In der praktischen Anwendung

Installation der Binärdatei

Die Binärdatei kann direkt aus den Go-Paketen installiert werden.

go install github.com/ovh/okms-k8s-encryption-provider@latest

Alternativ können Sie sie aus den Quellen kompilieren.

git clone https://github.com/ovh/okms-k8s-encryption-provider.git
cd okms-k8s-encryption-provider
go build -o okms-k8s-encryption-provider

Konfiguration von OVHcloud KMS (OKMS)

Um OVHcloud KMS als Verschlüsselungsanbieter für Kubernetes zu verwenden, benötigen Sie Folgendes:

  • Einen OVHcloud Benutzer und die Berechtigungen zur Verwaltung der OKMS-KMIP-Schlüssel.
  • Ein Zugriffszertifikat für Ihre OKMS-Domain.
  • Einen KMIP-AES-Schlüssel in Ihrem OKMS.

Benutzer und Zugriffsrechte erstellen

Erstellen Sie einen lokalen IAM-Benutzer mit Zugriffsrechten auf Ihre Domain.

Wenn Sie stattdessen IAM-Richtlinien verwenden, sollte der Benutzer mindestens die folgenden Rechte auf der OKMS-Domain besitzen:

  • okms:kmip:encrypt
  • okms:kmip:decrypt
  • okms:kmip:locate

Andernfalls sollte der Benutzer Mitglied einer Gruppe mit der Rolle ADMIN sein.

Alternativ können Sie einen Benutzer mit der OVHcloud CLI erstellen:

ovhcloud iam user create --login "etcd-encryption" --group ADMIN --description "A user created for ETCD encryption" --password "xxxxxxxxx" --email "xxxxx@mycompany.com"

Zugriffszertifikat erstellen

Erstellen Sie ein OKMS-Zugriffszertifikat und verknüpfen Sie den zuvor erstellten Benutzer.

Speichern Sie das erzeugte Zertifikat cert.pem und den privaten Schlüssel key.pem, da sie für die Konfiguration des Verschlüsselungsanbieters benötigt werden.

KMIP-AES-Schlüssel erstellen

Um einen KMIP-AES-Schlüssel zu erstellen, können Sie die OKMS CLI verwenden:

Laden Sie zunächst die Binärdatei der neuesten Version herunter oder kompilieren Sie sie aus den Quellen.

Anschließend können Sie einen Schlüssel wie folgt erstellen:

okms-cli kmip create symmetric --alg aes --size 256

Notieren Sie sich die Key ID des erzeugten Schlüssels. Im weiteren Verlauf dieses Leitfadens verwenden wir die Key ID 70001308-5674-43fe-93dd-6270ecac0710 als Beispiel.

Weitere Informationen zur Verwendung von okms-cli finden Sie im GitHub-Repository.

Konfiguration des Verschlüsselungsanbieters

Der Verschlüsselungsanbieter kann direkt auf den kube-apiserver-Hosts mit der folgenden Befehlszeile ausgeführt werden:

./okms-k8s-encryption-provider \
  --client-cert "~/.ovh-kms/cert.pem" \
  --client-key "~/.ovh-kms/key.pem" \
  --kmip-addr "eu-west-par.okms.ovh.net:5696" \
  --kmip-key-id "70001308-5674-43fe-93dd-6270ecac0710"

Der Verschlüsselungsanbieter unterstützt die folgenden Optionen:

FlagBeschreibungStandardwert
--client-certPfad zur Datei mit dem Client-Zertifikat für die Authentifizierung bei OVHcloud KMS."" (erforderlich)
--client-keyPfad zur Datei mit dem privaten Schlüssel, der dem Client-Zertifikat zugeordnet ist."" (erforderlich)
--kmip-addrAdresse des KMIP-Servers. Verfügbar im . (z. B. eu-west-rbx.okms.ovh.net:5696)."" (erforderlich)
--kmip-key-idBezeichner des auf dem KMIP-Server zu verwendenden Verschlüsselungsschlüssels."" (erforderlich)
--sockPfad zum Unix-Socket, auf dem der Anbieter lauscht. Sollte in den Kubernetes-apiserver eingebunden werden./var/run/okms_etcd_plugin.sock
--timeoutTimeout für die Operationen des gRPC-Servers.10s
--debugDebug-Traces aktivieren.false

Konfiguration von Kubernetes

Fügen Sie auf Grundlage des offiziellen Kubernetes-Leitfadens zum Verschlüsseln von Daten mit einem KMS-Anbieter die folgenden Flags zu Ihrem kube-apiserver hinzu:

  --encryption-provider-config=<path/to>/encryption-config.yaml
  # Optional: Datei bei Aktualisierung neu laden
  --encryption-provider-config-automatic-reload=true

Stellen Sie sicher, dass Sie das Verzeichnis, das den Unix-Socket enthält, auf dem der KMS-Server lauscht, in den kube-apiserver einbinden.

Ein Beispiel für encryption-config.yaml:

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
    - secrets
    providers:
    - kms:
        name: okms-encryption-provider
        endpoint: unix:///var/run/okms_etcd_plugin.sock
        cachesize: 1000
        timeout: 3s
    - identity: {}

Konfiguration überprüfen

Erstellen Sie ein Secret mit kubectl create secret generic okms-test-secret -n default --from-literal=mykey=mydata und überprüfen Sie anschließend den Inhalt des Secrets im ETCD-Speicher, indem Sie den folgenden Befehl ausführen:

ETCDCTL_API=3 etcdctl \
    --key /rootfs/etc/kubernetes/pki/kube-apiserver/etcd-client.key \
    --cert  /rootfs/etc/kubernetes/pki/kube-apiserver/etcd-client.crt \
    --cacert /rootfs/etc/kubernetes/pki/kube-apiserver/etcd-ca.crt  \
    --endpoints "https://etcd-a.internal.${CLUSTER}:4001" get /registry/secrets/default/okms-test-secret

Die Ausgabe sollte unlesbar sein:

0m`�He.0�cryption-provider:�1x��%�B���#JP��J���*ȝ���΂@\n�96�^��ۦ�~0| *�H��
                    `q�*�J�.P��;&~��o#�O�8m��->8L��0�C3���A7�����~���f�V�ܬ���X��_��`�H#�D��z)+�81��qW��y��`�q��}1<LF, ��N��p����i*�aC#E�߸�s������s��l�?�a
�AźR������.��8H�4�O

Schlüsselrotation einrichten

Um Ihren Schlüssel zu rotieren, müssen Sie zwei Verschlüsselungsanbieter ausführen, die jeweils auf einem unterschiedlichen Unix-Socket lauschen.

Nachfolgend finden Sie ein Beispiel für eine Konfigurationsdatei zur Verschlüsselung für alle API-Server, bevor der neue Schlüssel verwendet wird:

apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
  - resources:
    - secrets
    providers:
    # Anbieter mit dem alten Schlüssel
    - kms:
        name: okms-encryption-provider
        endpoint: unix:///var/run/kmsplugin/socket.sock
        cachesize: 1000
        timeout: 3s
    # Anbieter mit dem neuen Schlüssel
    - kms:
        name: okms-encryption-provider-2
        endpoint: unix:///var/run/kmsplugin/socket2.sock
        cachesize: 1000
        timeout: 3s
    - identity: {}

Nachdem alle API-Server neu gestartet wurden und mit dem neuen Schlüssel entschlüsseln können, verschieben Sie den Anbieter mit dem neuen Schlüssel an die oberste Stelle.

Nachdem alle Secrets mit dem neuen Schlüssel neu verschlüsselt wurden, können Sie den alten Verschlüsselungsanbieter entfernen.

Weiterführende Informationen

Treten Sie unserer User Community bei.

Erfahren Sie, wie Sie den Kubernetes External Secrets Operator mit Secret Manager verwenden.

War diese Seite hilfreich?