Vom Kunden verwaltete Verschlüsselungsschlüssel (Customer-Managed Encryption Keys, CMEK) aktivieren

In diesem Thema wird die Unterstützung von vom Kunden verwalteten Verschlüsselungsschlüsseln (Customer-Managed Encryption Keys, CMEK) im Secret Manager erläutert.

Übersicht

Secret Manager bietet Tools zum Speichern, Verwalten und Zugreifen auf vertrauliche Daten in Ihren Anwendungen.

Standardmäßig werden im Secret Manager gespeicherte Secrets mit der Standardverschlüsselung von Google verschlüsselt. Bei der Standardverschlüsselung von Google werden geheime Nutzlasten von Schlüsseln verschlüsselt, die von Google verwaltet werden, bevor sie in den nichtflüchtigen Speicher geschrieben werden. Eine Konfiguration ist nicht erforderlich. Die Standardverschlüsselung von Google ist für viele Organisationen die beste Wahl.

Für Organisationen, die eine bessere Kontrolle wünschen, können Sie mit CMEK für Secret Manager den Cloud KMS-Schlüssel konfigurieren, mit dem inaktive Daten im Secret Manager geschützt werden. Wenn Sie den CMEK-Schlüssel vorübergehend deaktivieren oder dauerhaft zerstören, können die mit diesem Schlüssel verschlüsselten Daten nicht entschlüsselt werden und sind daher nicht mehr zugänglich.

Funktionsweise von CMEK im Secret Manager

Vor dem Schreiben einer Secret-Version in einen nichtflüchtigen Speicher an einem bestimmten Speicherort verschlüsselt Secret Manager die Daten mit einem eindeutigen Datenverschlüsselungsschlüssel (Data Encryption Key, DEK). Dieser DEK wird dann mit einem replikatspezifischen Schlüssel verschlüsselt, dem sogenannten KEK, dem Key Secret Manager-Dienst gehört.

Wenn Sie CMEK für Secret Manager verwenden, wird der KEK als CMEK-Schlüssel bezeichnet und ist ein symmetrischer Schlüssel, den Sie in Cloud KMS verwalten. Der CMEK-Schlüssel muss sich am selben GCP-Speicherort wie das Secret-Versionsreplikat befinden, das es verschlüsselt.

In dieser Anleitung wird beschrieben, wie Sie Secret Manager für die Verwendung von CMEK konfigurieren. Weitere allgemeine Informationen zu CMEK einschließlich ihrer Aktivierung finden Sie in der Dokumentation zum Cloud Key Management Service.

Beschränkungen

CMEK sind nur in der Secret Manager v1 API und gCloud verfügbar.

Hinweis

Sie können alle Ressourcen im selben Projekt speichern oder Secrets und Schlüssel in separaten Projekten speichern. Weitere Informationen zu dieser Entscheidung finden Sie unter Aufgabentrennung von Cloud KMS.

Führen Sie die folgenden Voraussetzungen aus, um Secret Manager und Cloud KMS einzurichten:

  • Secret Manager:

    • Erstellen oder verwenden Sie ein vorhandenes Projekt für Ihre Secret Manager-Ressourcen.
    • Führen Sie bei Bedarf die Schritte im Abschnitt Secret Manager konfigurieren der Kurzanleitung für Secret Manager aus.
  • Cloud KMS:

Legen Sie für die folgenden Variablen die Projekt-IDs Ihrer Secret Manager- und Cloud KMS-Projekte fest.

Befehlszeile

$ export SM_PROJECT_ID="..."
$ export KMS_PROJECT_ID="..."

Authentifizieren Sie sich bei Google Cloud:

gcloud

$ gcloud auth login

Dienstkonto erstellen

Sie müssen für jedes Projekt ein Dienstkonto erstellen, das vom Kunden verwaltete Verschlüsselungsschlüssel erfordert. Derzeit können Sie nur Befehle des gcloud-Befehlszeilentools verwenden, um die Art von Dienstkonto zu erstellen, die Sie für vom Kunden verwaltete Verschlüsselungsschlüssel benötigen.

Erstellen Sie mit diesem Befehl ein Dienstkonto mit dem gcloud-Befehlszeilentool:

gcloud

$ gcloud beta services identity create \
    --service "secretmanager.googleapis.com" \
    --project "${SM_PROJECT_ID}"

Der vorherige Befehl gibt den Namen eines Dienstkontos in diesem Format zurück:

service-[PROJECT_NUMBER]@gcp-sa-secretmanager.iam.gserviceaccount.com

Sie erteilen diesem Dienstkonto Zugriff auf die CMEK-Cloud KMS-Schlüssel, die zum Verschlüsseln und Entschlüsseln Ihrer Secrets verwendet werden.

Speichern Sie den Namen des Dienstkontos als Umgebungsvariable:

Befehlszeile

# This is from the output of the command above
$ export SM_SERVICE_ACCOUNT="service-...."

Bei den Umgebungsvariablen für das Secret Manager-Projekt, das Cloud KMS-Projekt und das Secret Manager-Dienstkonto muss die gesamte Dauer der Anleitung angegeben werden.

CMEK mit automatischer Replikation

In diesem Abschnitt werden Secrets beschrieben, die über eine Richtlinie für automatische Replikation konfiguriert werden.

Bei Secrets, die die automatische Replikationsrichtlinie verwenden, muss Ihr CMEK-Schlüssel an der globalen Cloud KMS-Multiregion liegen.

Erstellen Sie einen symmetrischen Cloud KMS-Schlüssel in der globalen Cloud KMS-Region oder verwenden Sie einen vorhandenen Schlüssel. In diesem Beispiel wird ein neuer Schlüsselbund namens secret-manager-cmek erstellt. Dann wird ein neuer Schlüssel namens my-cmek-key erstellt.

gcloud

$ gcloud kms keyrings create "secret-manager-cmek" \
    --project "${KMS_PROJECT_ID}" \
    --location "global"

$ gcloud kms keys create "my-cmek-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

Rufen Sie den Ressourcennamen des Schlüssels ab und legen Sie ihn als Umgebungsvariable fest.

Befehlszeile

$ export KMS_KEY_NAME="projects/${KMS_PROJECT_ID}/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"

Gewähren Sie dem Dienstkonto Secret-Manager-Zugriff, um es mit dem CMEK-Schlüssel zu verschlüsseln und zu entschlüsseln. Mit diesem Befehl wird dem Dienstkonto die Cloud KMS-Rolle "Cloud KMS-Verschlüsseler / Entschlüsseler" (roles/cloudkms.cryptoKeyEncrypterDecrypter) für den Dienstkontoschlüssel my-cmek-key erteilt.

gcloud

$ gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:${SM_SERVICE_ACCOUNT}" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

Secret mit automatischer Replikation erstellen Der Ressourcenname des CMEK-Schlüssels wird als Metadaten im Secret gespeichert.

gcloud

$ gcloud beta secrets create my-secret \
    --replication-policy "automatic" \
    --kms-key-name "${KMS_KEY_NAME}" \
    --project "${SM_PROJECT_ID}"

API

Legen Sie den Wert von replication.automatic.customerManagedEncryption.kmsKeyName auf den Ressourcennamen für den CMEK-Schlüssel fest.

$ curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets?secretId=my-secret" \
    --request "POST" \
    --header "Content-Type: application/json" \
    --header "Authorization: Bearer $(gcloud auth print-access-token)" \
    --data-binary @- <<EOF
{
  "replication":{
    "automatic":{
      "customerManagedEncryption":{
        "kmsKeyName": "${KMS_KEY_NAME}"
      }
    }
  }
}
EOF

Bei jeder Secret-Version in diesem Secret wird die Nutzlast der Secret-Version automatisch mit dem Schlüssel verschlüsselt, bevor in den nichtflüchtigen Speicher geschrieben wird, sofern das Dienstkonto Zugriff auf den CMEK-Schlüssel hat. Wenn das Dienstkonto keinen Zugriff mehr hat oder der Schlüssel nicht mehr verfügbar ist, wird beim Versuch, eine neue Secret-Version zu erstellen oder auf eine vorhandene zuzugreifen, ein Fehler zurückgegeben.

Fügen Sie eine neue Secret-Version hinzu. Sie geben nicht den Ressourcennamen des Cloud KMS-Schlüssels an; er wird aus den Metadaten des Secrets gelesen.

gcloud

$ echo -n "abcd1234" | gcloud beta secrets versions add "my-secret" \
    --project "${SM_PROJECT_ID}" \
    --data-file -

Die Secret-Version wird auch dann erstellt, wenn der Aufrufer keinen direkten Zugriff auf den CMEK-Schlüssel hat. Beim Lesen und Schreiben des Secrets ist der Dienst für Secret Manager und nicht für den Aufrufer verantwortlich.

Ebenso benötigen Sie keinen direkten Zugriff auf den CMEK-Schlüssel, um auf das Secret zuzugreifen. Das Dienstkonto greift auf den Schlüssel zu und verschlüsselt oder entschlüsselt das Secret für Sie.

Rufen Sie die soeben erstellte Secret-Version auf:

gcloud

$ gcloud beta secrets versions access latest \
    --project "${SM_PROJECT_ID}" \
    --secret "my-secret"

CMEK-Konfiguration aktualisieren

Erstellen Sie einen neuen symmetrischen KMS-Schlüssel in der Multi-Cloud KMS-Region global.

gcloud

$ gcloud kms keys create "my-other-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

Gewähren Sie dem Dienstkonto Secret-Manager-Zugriff, um es mit dem neuen CMEK-Schlüssel zu verschlüsseln und zu entschlüsseln. Mit diesem Befehl wird dem Dienstkonto die Cloud KMS-Rolle "Cloud KMS-Verschlüsseler / Entschlüsseler" (roles/cloudkms.cryptoKeyEncrypterDecrypter) für den Dienstkontoschlüssel my-other-key erteilt.

gcloud

$ gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "global" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:${SM_SERVICE_ACCOUNT}" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

Ändern Sie die CMEK-Konfiguration für ein Secret, indem Sie die Replikation des Secrets mit den neuen Cloud KMS-Schlüsselressourcennamen aktualisieren.

gcloud

$ gcloud beta secrets replication update my-secret \
    --set-kms-key="projects/${KMS_PROJECT_ID}/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --project "${SM_PROJECT_ID}"

API

$ curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/my-secret?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer $(gcloud auth print-access-token)" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication": {
    "automatic":{
      "customerManagedEncryption":{
        "kmsKeyName": "projects/${KMS_PROJECT_ID}/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
      }
    }
  }
}
EOF

CMEK mit nutzerverwalteter Replikation

In diesem Abschnitt werden Secrets beschrieben, die mit einer vom Nutzer verwalteten Replikationsrichtlinie konfiguriert wurden. Mit einer vom Nutzer verwalteten Replikationsrichtlinie steuern Sie den GCP-Speicherort, an dem das Secret gespeichert ist. Secrets sind immer über jeden GCP-Standort zugänglich.

Secrets mit einer vom Nutzer verwalteten Replikationsrichtlinie müssen Cloud KMS-Schlüssel verwenden, die genau den Speicherorten entsprechen, an denen die Secret-Versionen gespeichert sind. In diesem Leitfaden wird ein Secret an zwei verschiedenen Standorten gespeichert: us-east1 und us-central1. Anfragen für den Zugriff auf das Secret werden an einen dieser Orte weitergeleitet.

Erstellen Sie in jeder der beiden Regionen einen Schlüsselbund und einen Cloud KMS-Schlüssel mit Verschlüsselung oder verwenden Sie einen vorhandenen Schlüssel. In diesem Beispiel wird ein neuer Schlüsselbund namens secret-manager-cmek erstellt. Anschließend wird in jeder Region ein Schlüssel namens my-cmek-key erstellt.

gcloud

# us-east1
$ gcloud kms keyrings create "secret-manager-cmek" \
    --project "${KMS_PROJECT_ID}" \
    --location "us-east1"

$ gcloud kms keys create "my-cmek-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

# us-central1
$ gcloud kms keyrings create "secret-manager-cmek" \
    --project "${KMS_PROJECT_ID}" \
    --location "us-central1"

$ gcloud kms keys create "my-cmek-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

Sie können dem Dienstkonto für Secret Manager die Berechtigung zum Verschlüsseln und Entschlüsseln mithilfe des CMEK-Schlüssels erteilen. Weisen Sie dafür jedem Cloud KMS-Schlüssel einzeln oder für alle Schlüssel im Projekt die Rolle "Cloud KMS-Verschlüsseler / Entschlüsseler" (roles/cloudkms.cryptoKeyEncrypterDecrypter) zu.

gcloud

# us-east1
$ gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:${SM_SERVICE_ACCOUNT}" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

# us-central1
$ gcloud kms keys add-iam-policy-binding "my-cmek-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:${SM_SERVICE_ACCOUNT}" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

CMEK-fähiges Secret mit vom Nutzer verwalteter Replikation erstellen Der Ressourcenname des CMEK-Schlüssels wird als Metadaten im Secret gespeichert.

gcloud

$ cat <<EOF > replication-policy.json
{
  "userManaged":{
    "replicas":[
      {
        "location":"us-east1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/${KMS_PROJECT_ID}/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
        }
      },
      {
        "location":"us-central1",
        "customerManagedEncryption":{
          "kmsKeyName":"projects/${KMS_PROJECT_ID}/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
        }
      }
    ]
  }
}
EOF

$ gcloud beta secrets create my-ummr-secret \
    --replication-policy-file replication-policy.json \
    --project "${SM_PROJECT_ID}"

API

Legen Sie den Wert von replication.userManaged.replicas.customerManagedEncryption.kmsKeyName auf die Ressourcennamen für die CMEK-Schlüssel fest.

$ curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets?secretId=my-ummr-secret" \
--request "POST" \
--header "Content-Type: application/json" \
--header "Authorization: Bearer $(gcloud auth print-access-token)" \
--data-binary @- <<EOF
{
  "replication":{
    "userManaged":{
      "replicas":[
        {
          "location":"us-east1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/${KMS_PROJECT_ID}/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
          }
        },
        {
          "location":"us-central1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/${KMS_PROJECT_ID}/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key"
          }
        }
      ]
    }
  }
}
EOF

Bei jeder Secret-Version in diesem Secret wird die Nutzlast der Secret-Version automatisch mit dem Schlüssel verschlüsselt, bevor in den nichtflüchtigen Speicher geschrieben wird, sofern das Dienstkonto Zugriff auf den CMEK-Schlüssel hat. Wenn das Dienstkonto keinen Zugriff mehr hat oder der Schlüssel nicht mehr verfügbar ist, wird beim Versuch, eine neue Secret-Version zu erstellen oder auf eine vorhandene zuzugreifen, ein Fehler zurückgegeben.

Fügen Sie eine neue Secret-Version hinzu. Sie geben nicht den Ressourcennamen des Cloud KMS-Schlüssels an; er wird aus den Metadaten des Secrets gelesen.

gcloud

$ echo -n "abcd1234" | gcloud beta secrets versions add "my-ummr-secret" \
    --project "${SM_PROJECT_ID}" \
    --data-file -

Die Secret-Version wird auch dann erstellt, wenn der Aufrufer keinen direkten Zugriff auf den CMEK-Schlüssel hat. Beim Lesen und Schreiben des Secrets ist der Dienst für Secret Manager und nicht für den Aufrufer verantwortlich.

Ebenso benötigen Sie keinen direkten Zugriff auf den CMEK-Schlüssel, um auf das Secret zuzugreifen. Das Dienstkonto greift auf den Schlüssel zu und verschlüsselt oder entschlüsselt das Secret für Sie.

Rufen Sie die soeben erstellte Secret-Version auf.

gcloud

$ gcloud beta secrets versions access latest \
    --project "${SM_PROJECT_ID}" \
    --secret "my-ummr-secret"

CMEK-Konfiguration aktualisieren

Erstellen Sie zwei neue symmetrische KMS-Schlüssel in derselben Region wie das Secret.

gcloud

# us-east1
$ gcloud kms keys create "my-other-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

# us-central1
$ gcloud kms keys create "my-other-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --purpose "encryption"

Gewähren Sie dem Dienstkonto Secret-Manager-Zugriff, um es mit dem neuen CMEK-Schlüsseln zu verschlüsseln und zu entschlüsseln. Mit diesem Befehl wird dem Dienstkonto die Cloud KMS-Rolle "Cloud KMS-Verschlüsseler / Entschlüsseler" (roles/cloudkms.cryptoKeyEncrypterDecrypter) für die Cloud KMS-Dienstkontoschlüssel my-other-key erteilt.

gcloud

# us-east1
$ gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "us-east1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:${SM_SERVICE_ACCOUNT}" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

# us-central1
$ gcloud kms keys add-iam-policy-binding "my-other-key" \
    --project "${KMS_PROJECT_ID}" \
    --location "us-central1" \
    --keyring "secret-manager-cmek" \
    --member "serviceAccount:${SM_SERVICE_ACCOUNT}" \
    --role "roles/cloudkms.cryptoKeyEncrypterDecrypter"

Ändern Sie die CMEK-Konfiguration für ein Secret, indem Sie die Replikation des Secrets mit den neuen Cloud KMS-Schlüsselressourcennamen aktualisieren.

gcloud

$ gcloud beta secrets replication update my-ummr-secret \
    --set-kms-key="projects/${KMS_PROJECT_ID}/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --location=us-east1 \
    --project "${SM_PROJECT_ID}"

$ gcloud beta secrets replication update my-ummr-secret \
    --set-kms-key="projects/${KMS_PROJECT_ID}/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key" \
    --location=us-central1 \
    --project "${SM_PROJECT_ID}"

Um mehrere Schlüssel in einem Secret gleichzeitig zu aktualisieren, können Sie die Replikationsrichtlinie über eine Datei abrufen und festlegen.

gcloud

$ gcloud beta secrets replication get my-ummr-secret --project "${SM_PROJECT_ID}" --format=json > replication-policy.json

# update the file to reflect desired CMEK configuration
$ edit replication-policy json

$ gcloud beta secrets replication set my-ummr-secret \
    --replication-policy-file=replication-policy.json \
    --project "${SM_PROJECT_ID}"

API

$ curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/my-ummr-secret?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer $(gcloud auth print-access-token)" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication":{
    "userManaged":{
      "replicas":[
        {
          "location":"us-east1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/${KMS_PROJECT_ID}/locations/us-east1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
          }
        },
        {
          "location":"us-central1",
          "customerManagedEncryption":{
            "kmsKeyName":"projects/${KMS_PROJECT_ID}/locations/us-central1/keyRings/secret-manager-cmek/cryptoKeys/my-other-key"
          }
        }]
      }
    }
  }
EOF

CMEK-Konfiguration für Secret-Version ansehen

Sehen Sie sich die Metadaten der Secret-Version an, um festzustellen, ob die Secret-Version CMEK-fähig ist und den Ressourcennamen der CMEK-Schlüsselversion.

gcloud

$ gcloud beta secrets versions describe latest --secret my-secret --project "${SM_PROJECT_ID}"

API

$ curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/my-secret/versions/latest" \
    --request "GET" \
    --header "Authorization: Bearer $(gcloud auth print-access-token)" \
    --header "Content-Type: application/json"

Dies gibt den vollständigen Cloud KMS-Ressourcennamen der Schlüsselversion zurück, die zum Verschlüsseln der Secret-Version verwendet wird.

{
  "name": "projects/[PROJECT_NUMBER]/secrets/my-secret/versions/1",
  "createTime": "2020-07-...",
  "state": "ENABLED",
  "replicationStatus": {
    "automatic": {
      "customerManagedEncryption": {
        "kmsKeyVersionName": "projects/[KMS_PROJECT]/locations/global/keyRings/secret-manager-cmek/cryptoKeys/my-cmek-key/cryptoKeyVersions/1"
      }
    }
  }
}

CMEK deaktivieren

Entfernen Sie die CMEK-Konfiguration aus einem Secret, indem Sie die Replikationsrichtlinie aktualisieren.

gcloud

$ gcloud beta secrets replication update my-secret --remove-cmek --project "${SM_PROJECT_ID}"

API

$ curl "https://secretmanager.googleapis.com/v1/projects/${SM_PROJECT_ID}/secrets/my-secret?updateMask=replication" \
    --request "PATCH" \
    --header "Authorization: Bearer $(gcloud auth print-access-token)" \
    --header "Content-Type: application/json" \
    --data-binary @- <<EOF
{
  "replication":{
    "automatic":{}
  }
}
EOF

Nächste Schritte