Poiché il mio progetto era già avviato, ho dovuto solo creare un keyring e una crypto key su Cloud KMS che verranno utilizzati per cifrare e decifrare i segreti. Questo può essere fatto tramite Terraform con poche risorse:
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 questo esempio, sto anche assegnando il ruolo cloudkms.cryptoKeyEncrypter a un gruppo fittizio encrypter@example.com in modo che i membri possano cifrare nuovi segreti.
Cifrare i segreti
Ho poi usato questo comando per cifrare un segreto da utilizzare in Terraform tramite Cloud KMS:
echo -n <your-secret> | gcloud kms encrypt --project <project-name> --location <region> --keyring default --key default --plaintext-file - --ciphertext-file - | base64Per cifrare un intero file, puoi eseguire:
cat <path-to-your-secret> | gcloud kms encrypt --project <project-name> --location <region> --keyring default --key default --plaintext-file - --ciphertext-file - | base64<your-secret>è la stringa o il file che vuoi cifrare<project-name>è il progetto le cui chiavi KMS devono essere usate per cifrare il segreto.<region>è la regione in cui è configurato il keyring KMS.
Se stai lavorando su macOS, puoi aggiungere | pbcopy al comando in modo che l'output risultante venga aggiunto automaticamente agli appunti.
Infine, una stringa cifrata si presenta così:
YmlueGlzYXdlc29tZWJpbnhpc2F3ZXNvbWViaW54aXNhd2Vzb21lYmlueGlzYXdlc29tZWJpbnhpc2F3ZXNvbWViaW54aXNhd2Vzb21lYmlueGlzYXdlc29tZQConfigurare il data source Cloud KMS
La stringa cifrata non viene archiviata da nessuna parte. Quello che ho fatto invece è usare il data source Cloud KMS per decifrarla al volo.
data "google_kms_secret" "secret_key" {
crypto_key = data.google_kms_crypto_key.this.self_link
ciphertext = "YmlueGlzYXdlc29tZWJpbnhpc2F3ZXNvbWViaW54aXNhd2Vzb21lYmlueGlzYXdlc29tZWJpbnhpc2F3ZXNvbWViaW54aXNhd2Vzb21lYmlueGlzYXdlc29tZQ"
}Il valore decifrato può essere referenziato con:
data.google_kms_secret.secret_key.plaintextTerraform decifrerà la stringa automaticamente e la sostituirà con il valore effettivo dove viene referenziata.
Riepilogo
In questo breve post ho spiegato come ho usato Cloud KMS per cifrare stringhe che possono essere committate in sicurezza su git e usate in Terraform. Se hai più ambienti da supportare, ricorda che le chiavi KMS sono diverse per ogni progetto, quindi dovrai cifrare la stessa stringa di nuovo, una volta per ogni progetto. Se hai bisogno di indicazioni su come organizzare un repository Terraform multi-progetto, dai un'occhiata al mio recente articolo Come usare i workspace Terraform per gestire la configurazione basata sull'ambiente.
lucavallin

