Verschlüsselung von Geheimnissen

Secrets-Verschlüsselungskonfiguration

RKE2 unterstützt die Verschlüsselung von Geheimnissen im Ruhezustand und wird Folgendes automatisch durchführen:

  • Einen AES-CBC-Schlüssel generieren.

  • Erzeugen Sie eine Konfigurationsdatei für die Verschlüsselung mit dem generierten Schlüssel.

  • Die Konfiguration als encryption-provider-config an den Kubernetes APIServer übergeben.

Wahl des Verschlüsselungsanbieters

Versionssperre

Verfügbar ab den Versionen vom April 2025: v1.30.12+rke2r1, v1.31.8+rke2r1, v1.32.4+rke2r1, v1.33.0+rke2r1.

FIPS-Kompatibilität

Die FIPS 140-3-Kompatibilität ist nur mit dem aescbc Anbieter verfügbar.

Mit dem --secrets-encryption-provider Flag können Sie auswählen, welchen Verschlüsselungsanbieter Sie verwenden möchten. Der Standardwert ist aescbc.

RKE2 unterstützt die folgenden Verschlüsselungsanbieter:

  • aescbc: AES-CBC mit PKCS#7-Padding

  • secretbox: XSalsa20 und Poly1305

Anbieter migrieren

Sie können vom aescbc Anbieter zum secretbox Anbieter migrieren, indem Sie die folgenden Schritte befolgen:

  1. Stellen Sie sicher, dass der secretbox Anbieter von Ihrer RKE2-Version unterstützt wird.

  2. Aktualisieren oder fügen Sie das secrets-encryption-provider-Flag in Ihrer RKE2-Konfigurationsdatei auf secretbox hinzu.

  3. Rotieren Sie die Verschlüsselungsschlüssel gemäß dem Abschnitt [Encryption Key Rotation] weiter unten.

Generierte Verschlüsselungskonfigurationsdatei

Nachfolgend finden Sie ein Beispiel für die Verschlüsselungskonfigurationsdatei, die RKE2 mit dem aescbc Standardanbieter generiert:

#/var/lib/rancher/rke2/server/cred/encryption-config.json
{
  "kind": "EncryptionConfiguration",
  "apiVersion": "apiserver.config.k8s.io/v1",
  "resources": [
    {
      "resources": [
        "secrets"
      ],
      "providers": [
        {
          "aescbc": {
            "keys": [
              {
                "name": "aescbckey",
                "secret": "xxxxxxxxxxxxxxxxxxx"
              }
            ]
          }
        },
        {
          "identity": {}
        }
      ]
    }
  ]
}

Geheimnisverschlüsselungs-Tool

RKE2 enthält einen Unterbefehl secrets-encrypt, der es Administratoren ermöglicht, die folgenden Aufgaben auszuführen:

  • Hinzufügen neuer Verschlüsselungsschlüssel

  • Rotation und Löschen von Verschlüsselungsschlüsseln

  • Geheimnisse erneut verschlüsseln

Das Nichteinhalten der richtigen Verfahren beim Rotieren der Verschlüsselungsschlüssel für Geheimnisse kann zu permanentem Datenverlust führen. Es wird empfohlen, vor der Rotation einen Snapshot zu erstellen. Vorsicht geboten.

Drehung der Verschlüsselungsschlüssel

Versionssperre

Verfügbar ab den Versionen vom September 2024: v1.29.9+rke2r1, v1.30.5+rke2r1, v1.31.1+rke2r1.

Für ältere Versionen siehe [Encryption Key Rotation Classic].

  • Einzelserver

  • Hochverfügbarkeit

Um die Verschlüsselungsschlüssel für Geheimnisse in einem Einzelserver-Cluster zur Rotation zu bringen:

  1. Rotieren Sie die Verschlüsselungsschlüssel für Geheimnisse.

    rke2 secrets-encrypt rotate-keys
  2. Warten Sie, bis die Neuverschlüsselung abgeschlossen ist. Überwachen Sie die Serverprotokolle oder warten Sie auf:

    $ rke2 secrets-encrypt status
    Encryption Status: Enabled
    Current Rotation Stage: reencrypt_finished

Um die Verschlüsselungsschlüssel für Geheimnisse in HA-setups zu drehen:

In diesem Beispiel werden 3 Server für ein HA-Cluster verwendet, die als S1, S2, S3 bezeichnet werden. Es wird empfohlen, einen Serverknoten auszuwählen, von dem aus die secrets-encrypt Befehle ausgeführt werden.

  1. Rotieren Sie die Verschlüsselungsschlüssel für Geheimnisse auf S1.

    rke2 secrets-encrypt rotate-keys
  2. Warten Sie, bis die Neuverschlüsselung abgeschlossen ist. Überwachen Sie die Serverprotokolle oder warten Sie auf:

    $ rke2 secrets-encrypt status
    Encryption Status: Enabled
    Current Rotation Stage: reencrypt_finished
  3. Starten Sie RKE2 nacheinander auf S1, S2, S3 neu.

    systemctl restart rke2-server.service

    Warten Sie, bis der systemctl-Befehl zurückkehrt, bevor Sie den nächsten Server neu starten.

Klassische Verschlüsselungsschlüsselrotation

Neue Vorgehensweise

Wenn Sie RKE2-Versionen verwenden, die neuer sind als v1.30.1+rke2r1, empfehlen wir die Verwendung von [Encryption Key Rotation] stattdessen.

  • Einzelserver

  • Hochverfügbarkeit

Um die Verschlüsselungsschlüssel für Geheimnisse in einem Einzelknoten-Cluster zu rotieren:

  1. Vorbereiten:

    rke2 secrets-encrypt prepare
  2. Starten Sie den kube-apiserver Pod neu:

    # Get the kube-apiserver container ID export CONTAINER_RUNTIME_ENDPOINT="unix:///var/run/k3s/containerd/containerd.sock" crictl ps --name kube-apiserver # Stop the pod crictl stop <CONTAINER_ID>
  3. Rotieren:

    rke2 secrets-encrypt rotate
  4. Starten Sie den kube-apiserver Pod erneut.

  5. Neuverschlüsseln:

    rke2 secrets-encrypt reencrypt

Um die Verschlüsselungsschlüssel für Geheimnisse in HA-setups zu drehen:

In diesem Beispiel werden 3 Server für ein HA-Cluster verwendet, die als S1, S2, S3 bezeichnet werden. Obwohl es nicht erforderlich ist, wird empfohlen, einen Serverknoten auszuwählen, von dem aus die secrets-encrypt Befehle ausgeführt werden.

  1. Bereiten Sie auf S1 vor.

    rke2 secrets-encrypt prepare
  2. Starten Sie S1, S2, S3 nacheinander neu.

    systemctl restart rke2-server.service

    Warten Sie, bis der systemctl-Befehl zurückkehrt, bevor Sie den nächsten Server neu starten.

  3. Rotieren Sie auf S1.

    rke2 secrets-encrypt rotieren
  4. Starten Sie S1, S2, S3 nacheinander neu.

  5. Reverschlüsseln Sie auf S1.

    rke2 secrets-encrypt reencrypt

    Warten Sie, bis die Reverschlüsselung abgeschlossen ist, entweder über die Serverprotokolle journalctl -u rke2-server oder über rke2 secrets-encrypt status. Der Status gibt reencrypt_finished zurück, wenn alles abgeschlossen ist.

  6. Starten Sie S1, S2, S3 nacheinander neu.

Verschlüsselungsstatus der Geheimnisse

Der secrets-encrypt status Unterbefehl zeigt Informationen über den aktuellen Status der Verschlüsselung von Geheimnissen auf dem Knoten an.

Ein Beispiel für den Befehl auf einem Einzelserver-Knoten:

$ rke2 secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: start
Server Encryption Hashes: All hashes match

Active  Key Type  Name
------  --------  ----
 *      AES-CBC   aescbckey

Ein weiteres Beispiel in einem HA-Cluster, nach der Rotation der Schlüssel, aber bevor die Server neu gestartet werden:

$ rke2 secrets-encrypt status
Encryption Status: Enabled
Current Rotation Stage: rotate
Server Encryption Hashes: hash does not match between node-1 and node-2

Active  Key Type  Name
------  --------  ----
 *      AES-CBC   aescbckey-2021-12-10T22:54:38Z
        AES-CBC   aescbckey

Die Details zu jedem Abschnitt sind wie folgt:

  • Verschlüsselungsstatus: Zeigt an, ob die Geheimnisverschlüsselung auf dem Knoten deaktiviert oder aktiviert ist.

  • Aktueller Rotationsstatus: Gibt den aktuellen Rotationsstatus auf dem Knoten an. Die Stufen sind: start, prepare, rotate, reencrypt_request, reencrypt_active, reencrypt_finished

  • Server-Verschlüsselungshashes: Nützlich für HA-Cluster, zeigt dies an, ob alle Server sich im gleichen Status mit ihren lokalen Dateien befinden. Dies kann verwendet werden, um zu identifizieren, ob ein Neustart der Server erforderlich ist, bevor mit der nächsten Stufe fortgefahren wird. Im obigen HA-Beispiel haben Knoten-1 und Knoten-2 unterschiedliche Hashes, was darauf hinweist, dass sie derzeit nicht die gleiche Verschlüsselungskonfiguration haben. Ein Neustart der Server wird ihre Konfiguration synchronisieren.

Schlüsseltabelle Beschreibung

Aktiv

Das * zeigt an, welcher Schlüssel – falls vorhanden – derzeit für die Verschlüsselung von Geheimnissen verwendet wird. Der aktive Schlüssel wird von Kubernetes verwendet, um neue Geheimnisse zu verschlüsseln.

Schlüsseltyp

RKE2 unterstützt nur den AES-CBC Schlüsseltyp. Weitere Informationen finden Sie hier.

Name

Name des Verschlüsselungsschlüssels. Der Standardwert ist aescbckey-<DATE_AND_TIME>.