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

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.
Unsere Ideen
Weitere Blogs
Contact



