Wie kann ich Geheimnisse in .tf und .tfstate verwalten?


46

Ich möchte den Terraform- MySQL-Provider verwenden , um eine Liste von MySQL- Benutzern zu führen und Stipendien zum Erstellen neuer Testumgebungen zur Hand zu haben. Die .tfund .tfstate-Dateien scheinen die MySQL-Passwörter im Klartext zu speichern.

In Bezug auf .tf:

Ich verstehe, dass .tfDateien in der Revisionskontrolle gespeichert sind und von einem Team verwaltet werden. Wie unterscheidet sich diese Praxis, wenn Geheimnisse in der sind .tf? Kann man diese Werte überhaupt verschlüsseln?

In Bezug auf .tfstate:

Ich kann das .tfstatesicher irgendwo nach dem Ausführen von Terraform anwenden, aber wäre es für diesen Anwendungsfall vorzuziehen, es überhaupt nicht zu speichern?

Antworten:


22

Terraform unterstützt das Hinzufügen einer zusätzlichen Datei mit Variablen während des Aufrufs.

Dokumentation: https://www.terraform.io/intro/getting-started/variables.html#from-a-file

Wir verwenden diese Funktion, um secrets.tfvarsbei jedem Aufruf von Terraform eine Datei bereitzustellen . Wir verwenden auch ein Skript, um den Befehl so zu verpacken, dass sein Aufruf konsistent ist und alle Teammitglieder nicht dieselben Fehler machen müssen. Der Wrapper wird .tfstatevor einer Ausführung mit S3 synchronisiert und .tfstateam Ende auf S3 zurückgesetzt. Ich höre auch von Leuten, die dasselbe mit dem in Consul gespeicherten Status tun und sogar eine Art Semaphor in Consul einfügen, um zu verhindern, dass zwei Leute gleichzeitig Terraform starten.

Wenn Sie vermeiden, einen Standardwert in einer variables.tfDatei festzulegen, wird der Benutzer gezwungen, den Wert einzugeben. Sie kann entweder manuell oder mit der -var-fileoben beschriebenen Befehlsoption eingegeben werden . Wenn Sie keine Standardeinstellungen für Ihre Geheimnisse festlegen, können Sie Änderungen erzwingen, die eine Änderung der Geheimnisse erfordern.

Die secrets.tfvarsDatei ist eine symbolische Verknüpfung zu einer der Dateien mit Geheimnissen, die nicht in der Versionskontrolle gespeichert sind. Wir haben mehrere, je eine pro - Umgebung, wie so secrets-prod.tfvars, secrets-dev.tfvars, secrets-stg.tfvarsusw ...

Eine noch bessere Methode wäre, diese geheimen Dateien während des Wrapper-Skripts auf der Grundlage von Daten in Vault oder auf andere Weise zu generieren, um Geheimnisse freizugeben. Da sich derzeit das Format von Geheimnissen oder Geheimnissen selbst ändert, müssen wir es dem Team außerhalb des Versionskontrollkanals mitteilen - und das funktioniert, um ehrlich zu sein, nicht immer gut. Aber Geheimnisse ändern sich selten.



8

Wir vermeiden es Terraform mit unseren Geheimnissen umzugehen. Selbst wenn Sie es schaffen, Geheimnisse durch eine var-Datei "secrtes.tfvars" zu injizieren, werden diese Geheimnisse in Ihrem Terraform- (Remote-) Status gespeichert.

Sie können Remote-Status-Dateien mit z. B. S3-Autorisierung schützen oder lokale Status-Dateien gitignore, aber wir haben uns entschieden, nicht auf diese Art von Schutz zu vertrauen.


2
Überprüfen Sie auch github.com/hashicorp/terraform/issues/516 , wo sie das Problem der leckenden Geheimnisse
verfolgen

6

Wenn Sie AWS nutzen, lesen Sie im AWS-Blog "Der richtige Weg, um Geheimnisse zu verwalten" von Segment.io . Wir empfehlen chamber, alle unsere Kunden für die Verwaltung von Geheimnissen zu nutzen. Dazu wird der AWS Systems Manager-Parameterspeicher (SSM) zusammen mit KMS-Schlüsseln verwendet. Dies stellt sicher, dass Geheimnisse im Ruhezustand (und während der Übertragung) verschlüsselt, mit IAM gesichert, mit CloudTrails überwacht und nur zur Laufzeit als Umgebungsvariablen verfügbar gemacht werden.

Nachdem wir die Kammer konfiguriert und den KMS-Schlüssel eingerichtet haben, schreiben wir die Geheimnisse in den Parameterspeicher.

chamber write db TF_VAR_DB_USER foobar
chamber write db TF_VAR_DB_PASS secret

Verwenden Sie dann diese Geheimnisse, wenn Sie terraform aufrufen.

chamber exec db -- terraform plan

Dies setzt voraus, dass Sie eine Variable mit dem Namen DB_USERund DB_PASSin Ihrem HCL-Code definiert haben.

Zum Beispiel könnten Sie dies hinzufügen variables.tf

variable "DB_USER" { }
variable "DB_PASS" { }

HINWEIS: chamber Umgebungsvariablen werden immer in Großbuchstaben exportiert

Wir bieten ein Terraform-Modul terraform-aws-kms-keyan, das die Bereitstellung des KMS-Schlüssels vereinfacht. In unserer ausführlichen Dokumentation finden Sie Beispiele für die Verwendung chambermit mehreren Namespaces sowie für die Verwendung von chamber with terraform zur Verwaltung von Geheimnissen. In unserem vollständigen Referenzbeispiel finden Sie Informationen zur Bereitstellung von Kammerabhängigkeiten.

Was .tfstatebringen Sie einen wirklich guten Punkt über die Existenz von Klartext - Geheimnisse in der Statusdatei auf. Daran führt kein Weg vorbei. Damit terraform Änderungen berechnen kann, um einen Plan zu erstellen, muss der Zustand "Vorher" und "Nachher" bekannt sein. Aus diesem Grund empfehlen wir die Verwendung eines verschlüsselten S3-Buckets mit obligatorischer Versionierung. Verwenden Sie das terraform-aws-tfstate-backendModul, um einen Bucket und eine DynamoDB-Sperrtabelle gemäß den Best Practices bereitzustellen.


Dies hängt eng mit den AWS-Diensten zusammen, die in der Frage nicht erwähnt werden und für lokale Infrastrukturen oder andere Clouds keine echte Antwort darstellen.
Tensibai

@tensibai, du hast recht. Die ursprüngliche Frage enthält nicht genügend Informationen, um die Betriebsplattform zu ermitteln und die beste Empfehlung abzugeben. Jede Plattform ist abhängig von den Plattformfähigkeiten unterschiedlich. Unter normalen Bedingungen oder mit Baremetall können Benutzer eine Kombination aus Vault und Terraform Enterprise in Betracht ziehen. Der Umfang der Implementierung wird sehr viel größer sein. :)
Erik Osterman

Ich verwende bereits AWS Secrets Manager und möchte nicht Chamber und Parameter Store verwenden. Ist es möglich, dasselbe auch mit Secrets Manager zu tun?
Red888


2

Ich habe mir ein paar verschiedene Möglichkeiten angesehen, aber ich mochte besonders Git-Crypt, um etwas Ad-hoc zu tun, bevor ich etwas Größeres wie Vault implementierte.


2
Erklären Sie bitte, warum.
Jottr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.