Blog

Wie Sie Geheimnisse in Terraform mit Cloud KMS sicher speichern

Luca Cavallin

Aktualisiert Oktober 20, 2025
3 Minuten

Ich habe kürzlich an einem Projekt gearbeitet, bei dem ich eine Helm-Veröffentlichung mit in Terraform fest kodierten Geheimnissen konfigurieren musste. Mit Cloud KMS konnte ich die Geheimnisse verschlüsseln, so dass sie sicher nach Git übertragen werden konnten. In diesem Artikel zeige ich Ihnen, wie das Verfahren funktioniert.

Cloud KMS einrichten

Da mein Projekt bereits läuft, musste ich nur noch ein Cloud KMS keyring und crypto key erstellen, das für die Ver- und Entschlüsselung von Geheimnissen verwendet wird. Dies kann über Terraform mit ein paar Ressourcen erfolgen:

data "google_project" "secrets" {
  project_id = "secrets"
}

resource "google_kms_key_ring" "this" {
  project  = data.google_project.secrets.project_id
  name     = "default"
  location = "europe-west4"
}

resource "google_kms_crypto_key" "this" {
  name     = "default"
  key_ring = google_kms_key_ring.this.self_link
}

resource "google_project_iam_member" "this" {
  project = data.google_project.secrets.project_id
  role    = "roles/cloudkms.cryptoKeyEncrypter"
  member  = "group:encrypter@example.com"
}

In diesem Beispiel weise ich außerdem einer imaginären encrypter@example.com Gruppe die Rolle cloudkms.cryptoKeyEncrypter zu, damit die Mitglieder neue Geheimnisse verschlüsseln können.

Verschlüsseln Sie die Geheimnisse

Ich habe dann diesen Befehl verwendet, um ein Geheimnis für die Verwendung in Terraform über Cloud KMS zu verschlüsseln:

echo -n <your-secret> | gcloud kms encrypt --project <project-name> --location <region> --keyring default --key default --plaintext-file - --ciphertext-file - | base64

Um stattdessen eine ganze Datei zu verschlüsseln, können Sie Folgendes ausführen:

cat <path-to-your-secret> | gcloud kms encrypt --project <project-name> --location <region> --keyring default --key default --plaintext-file - --ciphertext-file - | base64
  • <your-secret> ist die Zeichenkette oder Datei, die Sie verschlüsseln möchten
  • <project-name> ist das Projekt, dessen KMS-Schlüssel zur Verschlüsselung des Geheimnisses verwendet werden sollen.
  • <region> ist die Region, in der der KMS-Schlüsselring konfiguriert ist.

Wenn Sie unter macOS arbeiten, können Sie | pbcopy an den Befehl anhängen, damit die resultierende Ausgabe automatisch in die Zwischenablage eingefügt wird.

Schließlich sieht eine verschlüsselte Zeichenkette wie folgt aus:

YmlueGlzYXdlc29tZWJpbnhpc2F3ZXNvbWViaW54aXNhd2Vzb21lYmlueGlzYXdlc29tZWJpbnhpc2F3ZXNvbWViaW54aXNhd2Vzb21lYmlueGlzYXdlc29tZQ

Konfigurieren Sie die Cloud KMS-Datenquelle

Die verschlüsselte Zeichenfolge wird nirgendwo gespeichert. Stattdessen habe ich die Cloud KMS-Datenquelle verwendet, um sie on-the-fly zu entschlüsseln.

data "google_kms_secret" "secret_key" {
  crypto_key = data.google_kms_crypto_key.this.self_link
  ciphertext = "YmlueGlzYXdlc29tZWJpbnhpc2F3ZXNvbWViaW54aXNhd2Vzb21lYmlueGlzYXdlc29tZWJpbnhpc2F3ZXNvbWViaW54aXNhd2Vzb21lYmlueGlzYXdlc29tZQ"
}

Der entschlüsselte Wert kann mit referenziert werden:

data.google_kms_secret.secret_key.plaintext

Terraform entschlüsselt die Zeichenkette automatisch und ersetzt sie durch den tatsächlichen Wert, auf den sie referenziert wird.

Zusammenfassung

In diesem kurzen Beitrag habe ich erklärt, wie ich Cloud KMS verwendet habe, um Strings zu verschlüsseln, die sicher nach Git übertragen und in Terraform verwendet werden können. Wenn Sie mehrere Umgebungen unterstützen müssen, denken Sie daran, dass die KMS-Schlüssel für jedes Projekt unterschiedlich sind, so dass Sie dieselbe Zeichenkette für jedes Projekt erneut verschlüsseln müssen. Wenn Sie wissen möchten, wie Sie ein Terraform-Repository mit mehreren Projekten organisieren können, lesen Sie bitte meinen kürzlich erschienenen Artikel How to use Terraform workspaces to manage environment-based configuration .



Credits: Kopfzeilenbild von Luca Cavallin auf nylavak.com

Verfasst von

Luca Cavallin

Luca is a Software Engineer and Trainer with full-stack experience ranging from distributed systems to cross-platform apps. He is currently interested in building modern, serverless solutions on Google Cloud using Golang, Rust and React and leveraging SRE and Agile practices. Luca holds 3 Google Cloud certifications, he is part of the Google Developers Experts community and he is the co-organizer of the Google Cloud User Group that Binx.io holds with Google.

Contact

Let’s discuss how we can support your journey.