Blog

Wie man asymmetrische KMS-Schlüssel von Google verwendet, um bestimmte Geheimnisse in Terraform zu verschlüsseln

Mark van Holsteijn

Aktualisiert Oktober 17, 2025
3 Minuten

Um ein bestimmtes Geheimnis für die Verwendung in Terraform zu verschlüsseln, können Sie entweder das google_kms_secret oder das google_kms_secret_asymmetric verwenden. Da ich den Chiffretext für google_kms_secret etwas kurz finde, verwende ich lieber google_kms_secret_asymmetric. In diesem Blog zeige ich Ihnen, wie Sie einen asymmetrischen KMS-Schlüssel verwenden, um mit Terraform Geheimnisse zu verteilen.

Verschlüsseln eines bestimmten Geheimnisses in Terraform

Um ein bestimmtes Geheimnis in Terraform zu verschlüsseln, führen Sie die folgenden Schritte aus:

  • einen asymmetrischen KMS-Schlüssel erstellen
  • das Geheimnis verschlüsseln
  • die Prüfsumme berechnen
  • base64 verschlüsselt das verschlüsselte Geheimnis
  • das verschlüsselte Geheimnis in Terraform verwenden
  • speichern Sie das Geheimnis im Geheimnismanager

Erstellen Sie einen asymmetrischen KMS-Schlüssel

Um den asymmetrischen KMS-Schlüssel zu erstellen, verwenden Sie das folgende Terraform-Snippet:

resource "google_kms_key_ring" "cicd" {
  name     = "cicd"
  location = "global"
}

resource "google_kms_crypto_key" "terraform" {
  name     = "terraform"
  key_ring = google_kms_key_ring.cicd.id
  purpose  = "ASYMMETRIC_DECRYPT"
  version_template {
    algorithm = "RSA_DECRYPT_OAEP_4096_SHA256"
  }
}

data "google_kms_crypto_key_version" "terraform" {
  crypto_key = google_kms_crypto_key.terraform.id
}

resource "local_file" "public_key" {
    filename = "${path.module}/public-key.pem"
    content     = data.google_kms_crypto_key_version.terraform.public_key[0].pem
}

Nachdem dieser Schlüssel erstellt wurde, wird der öffentliche Schlüssel in der Datei public-key.pem gespeichert.

Das Schöne daran ist, dass Sie den öffentlichen Schlüssel an jeden weitergeben können. Wenn Sie den öffentlichen Schlüssel an den Anbieter des Geheimnisses weitergeben, muss das Geheimnis im Klartext niemals an Sie weitergegeben werden.

Verschlüsseln Sie das Geheimnis mit dem öffentlichen Schlüssel

Um das Geheimnis mit dem öffentlichen Schlüssel zu verschlüsseln, geben Sie ein:

$ echo -n B0FCE1C3-AF9F-4E92-A2E8-18748AB3C591  | 
  openssl pkeyutl -in - 
        -encrypt 
        -pubin 
        -inkey public-key.pem 
        -pkeyopt rsa_padding_mode:oaep 
        -pkeyopt rsa_oaep_md:sha256 
        -pkeyopt rsa_mgf1_md:sha256 
            -out my-api-key.enc

Das verschlüsselte Geheimnis befindet sich jetzt in der Datei my-api-key.enc und ist 512 Bytes lang!

Berechnen Sie die Prüfsumme

Um sicherzustellen, dass der Chiffriertext nicht verfälscht wird, können Sie auch die Prüfsumme berechnen und verwenden:

$ go install github.com/binxio/crc32@1.0.0
$ $HOME/go/bin/crc32 
  -polynomial castagnoli < my-api-key.enc
cbe83625

Base64 verschlüsselt das verschlüsselte Geheimnis

Da Terraform keine Binärdateien unterstützt, führen wir eine base64-Kodierung des Geheimnisses durch:

$ openssl base64 
  -in my-api-key.enc 
  -out my-api-key.enc.b64

Verwenden Sie das verschlüsselte Geheimnis in Terraform

Jetzt können Sie das verschlüsselte Geheimnis sicher in Ihre Terraform-Vorlage aufnehmen, indem Sie die Datenquelle google_kms_secret_asymmetric verwenden:

data "google_kms_secret_asymmetric" "api_key" {
  crypto_key_version = data.google_kms_crypto_key_version.terraform.id
  crc32              = "cbe83625"
  ciphertext         = <<EOT
        kumghZcadUm6pwraawMQr5amqM98lpSWd35GhUPtlIHK1AAXACI8s5zfh7PS7qGA
        v37/mt9xVuLmNv1zdj4uEhvPm52E92d6CCn3HkAosRNmHaQ5x7d3SU5u5kjR5aRh
        l3UoPsJCWOpdkJ1e/UcCDFqNfFL297cFUO0MWqW2ya2PIk5U8K8ujziy9sNMKSVi
        Mb98+S/EAuGlNbk/KHTyNzCnicjoKNWZPFQipZCTrrxXpy27j5+9RJ+q7T/gAzGu
        BWn85bbslMjL8ozjy5XWpBAZuhIjcrBAeSz8Wbahmnh4wcRTBM2sFWp0cW7rzeCk
        adE8z6LvrIdz330O2iX8v8H+Q1z0tNVvB07fklvj3h5XjuwVixXSpVEwD9d6uDq7
        i+fxQfER2eJvwI1NEzBsyNgJKDeilEz0obJq7ljyFZAbSxDnsog43GoJbg0JVe9s
        CqXtk0DdmHgEym+jw1MdKeFVwNPeyghZBF74gGNJ/G1bkkXUlL6kIQ6gr+oA9En0
        2hrUb4Nd+vECMby7r0mqtpkMA/7Fxq49CFLqfY3hSlMkNippruCGu5jArt5QksAa
        Tg0XGPOt7oU7T3FjWnMOiab4AR9KpFTT5vCBOBXdssU41jt90lIpPM0kDUPpRPEG
        +hvi7FdT9YsLxRTlVA0SFsXMvAt+MSdsAqgRk6BBCE4=
  EOT

  provider           = google-beta
}

Stellen Sie das Geheimnis im Geheimnismanager bereit

Schließlich können Sie das Geheimnis im Geheimnismanager bereitstellen:

resource "google_secret_manager_secret" "api_key" {
  secret_id = "api-key"

  replication {
    automatic = true
  }
}

resource "google_secret_manager_secret_version" "api_key" {
  secret = google_secret_manager_secret.api_key.id

  secret_data = data.google_kms_secret_asymmetric.api_key.plaintext
}

Nachdem Sie das Geheimnis angewendet haben, können Sie auf das Geheimnis im Geheimnismanager zugreifen:

$ gcloud secrets versions access latest --secret api-key 

Fazit

Mit der Datenquelle google_kms_secret_asymmetric können Sie ein gegebenes Geheimnis verschlüsseln, um einen 512 Byte langen Chiffretext zu erhalten, der sicher in eine Terraform-Vorlage aufgenommen werden kann. Der asymmetrische Schlüssel kann für relativ kurze Geheimnisse bis zu ~200 Byte verwendet werden.

Da das Geheimnis in Ihrer Terraform-Statusdatei sichtbar ist, empfehlen wir Ihnen, die Verwendung von vorgegebenen Geheimnissen wann immer möglich zu vermeiden. Wenn Sie ein vorgegebenes Geheimnis einsetzen möchten, ist die asymmetrische Datenquelle eine gute Alternative.

Verfasst von

Mark van Holsteijn

Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.

Contact

Let’s discuss how we can support your journey.