Kubernetes-Secrets im Ruhezustand in Etcd verschlüsseln
Erfahren Sie, wie Sie Konfigurationsdaten verschlüsseln, die als Kubernetes-Secrets in etcd gespeichert sind, wenn Sie die Kubernetes Engine (OKE) verwenden.
In der Kubernetes-Cluster-Control Plane werden sensible Konfigurationsdaten (wie Authentifizierungstoken, Zertifikate und Zugangsdaten) als Kubernetes-Secret-Objekte in etcd gespeichert. etcd ist ein Open-Source-verteilter Key-Value Store, den Kubernetes für die Clusterkoordination und Statusverwaltung verwendet. In den Kubernetes-Cluster, die von der Kubernetes-Engine erstellt werden, schreibt und liest etcd Daten in und aus Blockspeicher-Volumes im Oracle Cloud Infrastructure Block Volume-Service. Standardmäßig verschlüsselt Oracle Daten in Block-Volumes im Ruhezustand, einschließlich etcd und Kubernetes-Secrets. Oracle verwaltet diese Standardverschlüsselung mit einem Masterverschlüsselungsschlüssel, ohne dass Sie Maßnahmen ergreifen müssen. Für zusätzliche Kontrolle über den Lebenszyklus des Masterverschlüsselungsschlüssels und dessen Verwendung können Sie den Masterverschlüsselungsschlüssel selbst verwalten, anstatt ihn von Oracle für Sie verwalten zu lassen.
Wenn Sie den Masterverschlüsselungsschlüssel selbst verwalten, geben Sie den zu verwendenden Schlüssel an, und Sie haben die Kontrolle darüber, wann der Schlüssel rotiert wird. Der Masterverschlüsselungsschlüssel wird im Oracle Cloud Infrastructure Vault-Service gespeichert (siehe Key Management). Die Kubernetes-Secrets im Ruhezustand in etcd werden mit einem Datenverschlüsselungsschlüssel (DEK) mit dem AES-CBC-Verschlüsselungsalgorithmus mit PKCS#7-Auffüllung verschlüsselt. Für jede Verschlüsselung wird ein neuer DEK generiert. Die Datenverschlüsselungsschlüssel werden mit dem Masterverschlüsselungsschlüssel (MEK) verschlüsselt, einem Konzept, das als Envelope-Verschlüsselung bezeichnet wird.
Bevor Sie ein Cluster erstellen können, für das Sie den Masterverschlüsselungsschlüssel selbst verwalten möchten, müssen Sie folgende Schritte ausführen:
- einen geeigneten Masterschlüsselungsschlüssel in Vault erstellen (oder den Namen und die OCID eines solchen Schlüssels abrufen)
- Eine dynamische Gruppe erstellen, die alle Cluster in dem Compartment enthält, in dem Sie das neue Cluster erstellen
- Eine Policy erstellen, die die dynamische Gruppe autorisiert, den Masterverschlüsselungsschlüssel zu verwenden
Nachdem Sie das Cluster erstellt und angegeben haben, dass Sie den Masterverschlüsselungsschlüssel selbst verwalten möchten, können Sie die Verwendung des Masterverschlüsselungsschlüssels optional einschränken, indem Sie die dynamische Gruppe so ändern, dass nur dieses Cluster enthalten ist.
Beachten Sie Folgendes:
- Sie können die Option zum Verwalten des Masterverschlüsselungsschlüssels nur selbst auswählen, wenn Sie ein neues Cluster im Workflow "Benutzerdefinierte Erstellung" erstellen. Sie können den Masterverschlüsselungsschlüssel nicht verwalten, wenn Sie ein neues Cluster im Workflow "Schnellerstellung" erstellen. Außerdem können Sie die Masterverschlüsselungsschlüssel für Cluster, die Sie zuvor im Workflow "Benutzerdefinierte Erstellung" erstellt haben, nicht verwalten.
Wenn Sie die Option zum Verwalten des Masterverschlüsselungsschlüssels selbst auswählen, löschen Sie den Masterverschlüsselungsschlüssel anschließend nicht im Vault-Service. Sobald Sie in Vault einen Schlüssel zum Löschen planen, sind die für das Cluster in etcd gespeicherten Kubernetes-Secrets nicht mehr zugänglich. Wenn Sie den Schlüssel bereits zum Löschen vorgesehen haben, befindet er sich möglicherweise noch im Status "Ausstehendes Löschen". Brechen Sie in diesem Fall das geplante Löschen des Schlüssels ab (siehe Löschen eines Masterverschlüsselungsschlüssels abbrechen), um den Zugriff auf die Kubernetes-Secrets wiederherzustellen. Wenn der geplante Vorgang für das Löschen von Schlüsseln ausgeführt und der Masterverschlüsselungsschlüssel gelöscht wird, wird der Zugriff auf die Kubernetes-Secrets, die für das Cluster in etcd gespeichert sind, dauerhaft gesperrt. Clusterupgrades können daher nicht erfolgreich durchgeführt werden. In diesem Fall haben Sie keine andere Möglichkeit, als das Cluster zu löschen und neu zu erstellen.
Zugriff auf Masterverschlüsselungsschlüssel einrichten
Wenn Sie den Masterverschlüsselungsschlüssel verwalten, der Kubernetes-Secrets im Key-Value Store etcd des Clusters verschlüsselt, wenn Sie ein neues Cluster im Workflow "Benutzerdefinierte Erstellung" erstellen, richten Sie den Zugriff auf den Masterverschlüsselungsschlüssel ein:
- Melden Sie sich in der Konsole an.
-
Wenn Sie die OCID des Masterverschlüsselungsschlüssels kennen, mit dem Kubernetes-Secrets verschlüsselt werden, gehen Sie direkt zum nächsten Schritt. Andernfalls:
- Wenn bereits ein entsprechender Master-Verschlüsselungsschlüssel in Vault vorhanden ist, Sie jedoch die OCID nicht kennen, befolgen Sie die Anweisungen unter Masterverschlüsselungsschlüssel auflisten, und notieren Sie sich die OCID des Masterverschlüsselungsschlüssels.
- Wenn noch kein geeigneter Master-Verschlüsselungsschlüssel in Vault vorhanden ist, befolgen Sie die Anweisungen unter Masterschlüsselungsschlüssel erstellen, um einen zu erstellen, indem Sie Folgendes festlegen:
- Schutzmodus für Software oder HSM.
- Schlüsselform: Algorithmus für AES, RSA oder ECDSA.
- Schlüsselausprägung: Länge für AES-Schlüssel (128, 256) und RSA-Schlüssel (2048, 3072, 4096) oder Schlüsselausprägung: Kurven-ID für ECDSA-Schlüssel (NIST_P256, NIST_P384, NIST_P521).
-
Gewähren Sie Zugriff auf den Masterverschlüsselungsschlüssel in Vault.
Sie haben zwei Möglichkeiten, Zugriff auf den Masterverschlüsselungsschlüssel zu erteilen:
Neue IAM-Policy erstellen (empfohlen)- Öffnen Sie das Navigationsmenü , und wählen Sie Identität und Sicherheit aus. Wählen Sie unter Identität die Option Policys aus.
- Befolgen Sie die Anweisungen unter So erstellen Sie eine Policy, und geben Sie der Policy einen Namen (Beispiel:
acme-oke-kms-policy
). -
Geben Sie eine Policy-Anweisung für den Zugriff auf den Master-Verschlüsselungsschlüssel in folgendem Format ein:
Allow any-user to use keys in compartment <compartment-name> where ALL {request.principal.type = 'cluster', target.key.id = '<key-ocid>'}
Hierbei gilt:
<compartment-name>
ist der Name des Compartments, das den Masterverschlüsselungsschlüssel enthält.<key-OCID>
ist die OCID des Masterverschlüsselungsschlüssels in Vault.
Beispiel:
Allow any-user to use keys in compartment acme-kms-key-compartment where ALL {request.principal.type = 'cluster', target.key.id = 'ocid1.key.oc1.iad.annrl______trfg'}
- Klicken Sie auf Erstellen, um die neue Policy zu erstellen.
Erstellen Sie eine neue dynamische Gruppe, und erstellen Sie dann eine neue IAM-Policy- Öffnen Sie das Navigationsmenü , und wählen Sie Identität und Sicherheit aus. Wählen Sie unter Identität die Option Domains aus. Wählen Sie unter Identitätsdomain die Option Dynamische Gruppen aus.
- Befolgen Sie die Anweisungen unter So erstellen Sie eine dynamische Gruppe, und geben Sie der dynamischen Gruppe einen Namen (Beispiel:
acme-oke-kms-dyn-grp
). -
Geben Sie eine Regel ein, die alle Cluster im Compartment in folgendem Format enthält:
ALL {resource.type = 'cluster', resource.compartment.id = '<compartment-ocid>'}
Dabei ist
<compartment-ocid>
die OCID des Compartments, in dem Sie das neue Cluster erstellen möchten.Beispiel:
ALL {resource.type = 'cluster', resource.compartment.id = 'ocid1.compartment.oc1..aaaaaaaa23______smwa'}
- Klicken Sie auf Dynamische Gruppe erstellen.
Nachdem Sie eine dynamische Gruppe erstellt haben, die alle Cluster im Compartment enthält, können Sie jetzt eine Policy erstellen, um der dynamischen Gruppe Zugriff auf den Masterverschlüsselungsschlüssel in Vault zu erteilen.
- Öffnen Sie das Navigationsmenü , und wählen Sie Identität und Sicherheit aus. Wählen Sie unter Identität die Option Policys aus.
- Befolgen Sie die Anweisungen unter So erstellen Sie eine Policy, und geben Sie der Policy einen Namen (Beispiel:
acme-oke-kms-dyn-grp-policy
). -
Geben Sie eine Policy-Anweisung ein, um der dynamischen Gruppe Zugriff auf den Masterverschlüsselungsschlüssel zu erteilen. Verwenden Sie dazu das folgende Format:
Allow dynamic-group <dynamic-group-name> to use keys in compartment <compartment-name> where target.key.id = '<key-OCID>'
Hierbei gilt:
<dynamic-group-name>
ist der Name der zuvor erstellten dynamischen Gruppe.<compartment-name>
ist der Name des Compartments, das den Masterverschlüsselungsschlüssel enthält.<key-OCID>
ist die OCID des Masterverschlüsselungsschlüssels in Vault.
Beispiel:
Allow dynamic-group <acme-oke-kms-dyn-grp> to use keys in compartment acme-kms-key-compartment where target.key.id = 'ocid1.key.oc1.iad.annrl______trfg'
- Klicken Sie auf Erstellen, um die neue Policy zu erstellen.
-
Wenn Sie ein neues Cluster erstellen, wählen Sie die Option Mit einem von Ihnen verwalteten Schlüssel verschlüsseln aus, und geben Sie den Masterverschlüsselungsschlüssel an (siehe Cluster mit explizit definierten Einstellungen im Workflow "Benutzerdefinierte Erstellung" mit der Konsole erstellen).
-
(Optional) Nach Erstellen des Clusters können Sie für zusätzliche Sicherheit Folgendes tun:
- Notieren Sie sich die OCID des neu erstellten Clusters.
-
Schränken Sie die Verwendung des Master-Verschlüsselungsschlüssels ein:
-
Wenn Sie einfach eine IAM-Policy erstellt haben, ändern Sie die Policy-Anweisung so, dass sie explizit die OCID des neuen Clusters und nicht alle Cluster im Compartment einbezieht. Beispiel:
Allow any-user to use keys in compartment acme-kms-key-compartment where ALL {request.principal.type = 'cluster', target.key.id = 'ocid1.key.oc1.iad.annrl______trfg', request.principal.id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______yg5q'}
-
Wenn Sie eine dynamische Gruppe erstellt haben, ändern Sie die zuvor erstellte dynamische Gruppenregel, um die OCID des neuen Clusters explizit anstelle aller Cluster im Compartment anzugeben. Beispiel:
resource.id = 'ocid1.cluster.oc1.iad.aaaaaaaaaf______yg5q'
-
Masterverschlüsselungsschlüssel rotieren
Wenn Sie die Option zum Verwalten des Masterverschlüsselungsschlüssels selbst auswählen, können Sie den Masterverschlüsselungsschlüssel im Vault-Service rotieren und eine neue Version des Masterverschlüsselungsschlüssels erstellen (siehe Vault-Schlüssel rotieren).
kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="<time>"
wobei <time>
eine Zeichenfolge ist, die angibt, wann die Rotation durchgeführt werden soll. Beispiel:
kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="20210909_2135"
Masterverschlüsselungsschlüssel in anderen Mandanten
Sie können ein Cluster in einem Mandanten erstellen, der einen Masterverschlüsselungsschlüssel in einem anderen Mandanten verwendet. In diesem Fall müssen Sie mandantenübergreifende Policys schreiben, damit das Cluster in seinem Mandanten auf den Masterverschlüsselungsschlüssel im Mandanten des Vault-Service zugreifen kann. Beachten Sie, dass Sie ein Cluster nicht mit der Konsole erstellen können, wenn Sie bei dessen Erstellung einen Masterverschlüsselungsschlüssel angeben möchten, der sich in einem anderen Mandanten befindet.
Beispiel: Angenommen, das Cluster befindet sich in ClusterTenancy, und der Masterverschlüsselungsschlüssel befindet sich in KeyTenancy. Benutzer, die zu einer Gruppe (OKEAdminGroup) in ClusterTenancy gehören, haben Berechtigungen zum Erstellen von Clustern. Eine dynamische Gruppe (OKEAdminDynGroup) wurde im Cluster mit der Regel ALL {resource.type = 'cluster', resource.compartment.id = 'ocid1.compartment.oc1..<unique_ID>'}
erstellt, sodass alle Cluster, die in ClusterTenancy erstellt wurden, zur dynamischen Gruppe gehören.
Im Root Compartment von KeyTenancy gilt beim Schreiben der nachstehenden Policys Folgendes:
- Mit der OCID von ClusterTenancy wird ClusterTenancy dem Aliasnamen OKE_Tenancy zugeordnet.
- Mit den OCIDs von OKEAdminGroup und OKEAdminDynGroup werden diese den Aliasnamen RemoteOKEAdminGroup bzw. RemoteOKEClusterDynGroup zugeordnet.
- RemoteOKEAdminGroup und RemoteOKEClusterDynGroup erhalten die Möglichkeit, kryptografische Vorgänge mit einem bestimmten Masterschlüssel in KeyTenancy aufzulisten, anzuzeigen und auszuführen.
Define tenancy OKE_Tenancy as ocid1.tenancy.oc1..<unique_ID>
Define dynamic-group RemoteOKEClusterDynGroup as ocid1.dynamicgroup.oc1..<unique_ID>
Define group RemoteOKEAdminGroup as ocid1.group.oc1..<unique_ID>
Admit dynamic-group RemoteOKEClusterDynGroup of tenancy ClusterTenancy to use keys in tenancy where target.key.id = 'ocid1.key.oc1..<unique_ID>'
Admit group RemoteOKEAdminGroup of tenancy ClusterTenancy to use keys in tenancy where target.key.id = 'ocid1.key.oc1..<unique_ID>'
Im Root Compartment von ClusterTenancy gilt beim Schreiben der nachstehenden Policys Folgendes:
- Mit der OCID von KeyTenancy wird um KeyTenancy dem Aliasnamen KMS_Tenancy zugeordnet.
- OKEAdminGroup und OKEAdminDynGroup erhalten die Möglichkeit, Masterschlüssel in KeyTenancy zu verwenden.
- OKEAdminDynGroup wird erlaubt, einen bestimmten Masterschlüssel zu verwenden, der aus KeyTenancy in ClusterTenancy abgerufen wird.
Define tenancy KMS_Tenancy as ocid1.tenancy.oc1..<unique_ID>
Endorse group OKEAdminGroup to use keys in tenancy KMS_Tenancy
Endorse dynamic-group OKEAdminDynGroup to use keys in tenancy KMS_Tenancy
Allow dynamic-group OKEAdminDynGroup to use keys in tenancy where target.key.id = 'ocid1.key.oc1..<unique_ID>'
Weitere Beispiele zum Schreiben von mandantenübergreifenden Policys finden Sie unter Auf Object Storage-Ressourcen mandantenübergreifend zugreifen.
oci ce cluster create --name oke-with-cross-kms --kubernetes-version v1.16.8 --vcn-id ocid1.vcn.oc1.iad.<unique_ID> --service-lb-subnet-ids '["ocid1.subnet.oc1.iad.<unique_ID>"]' --compartment-id ocid1.compartment.oc1..<unique_ID> --kms-key-id ocid1.key.oc1.iad.<unique_ID>