Quellen für Secrets in HashiCorp Vault


Bicycle

Verteilung von Secrets

Der Problembereich der Verteilung von Secrets ist weit verbreitet. Sie haben eine sensible Information, möchten sie an einen Dienst verteilen und diese Aktion auf sichere Weise umsetzen. Diese sensible Information kann ein Passwort, ein API-Schlüssel, ein TLS-Zertifikat oder alles andere sein, was Sie geheim halten möchten.

Ein häufiges Problem bei der Verteilung von Secrets ist auch die Notwendigkeit, diese Daten rotieren zu lassen. Dies ist eine bewährte Sicherheitsmethode und wird häufig von Compliance-Standards gefordert. Das Rotieren von Secrets kann ein komplexer Prozess sein, insbesondere wenn Sie es über mehrere Dienste hinweg durchführen müssen.

Sie sind sich vielleicht auch des Problems bewusst, dass verteilte Secrets schwer zu verwalten sein können. Möglicherweise haben Sie diese sensiblen Informationen an mehreren Orten gespeichert, und es kann schwierig sein, den Überblick darüber zu behalten, wo sie sich befinden und wer Zugriff darauf hat.

Quellen von Secrets

HashiCorp Vault ist ein Verwaltungstool für sensitive Informationen, das Ihnen bei der Lösung dieser Probleme helfen kann. Vault kann Informationen speichern, an Dienste verteilen und rotieren. Es kann Ihnen auch dabei helfen, den Zugriff auf Secrets zu verwalten, sodass Sie steuern können, wer Zugriff auf was hat.

Aber natürlich müssen Sie die Secrets zuerst in Vault bringen. Hier kommen Quellen von Secrets ins Spiel. Secret-Quellen sind die Orte, von denen Sie Secrets erhalten und in Vault importieren können. Es gibt verschiedene Quellen für Secrets, und jede Quelle hat ihre eigene Art, Secrets in Vault zu übertragen.

Beispiel Use Case - 1Password

Schauen wir uns als Beispiel 1Password an. 1Password ist ein Passwort-Manager, mit dem Sie Ihre Passwörter interaktiv per Benutzeroberfläche oder Browsererweiterung sicher speichern und verwalten können – aber vielleicht möchten Sie diese Daten auch in Ihren Anwendungen verwenden. Und für diesen Anwendungsfall können Sie eine Quelle für Secrets einrichten, um diese Secets von 1Password mit Ihrem HashiCorp Vault zu synchronisieren.

 1locals {
 2  vault_name = "Infralovers Coders"
 3  vault_items = {
 4    "Docker Hub Service Account"            = "docker/service_account",
 5    "Quay Service Account"                  = "quay/service_account",
 6    "Gitlab Service Account"                = "gitlab/service_account",
 7    "Terraform HCP Service Account"         = "terraform_hcp/service_account",
 8    "HCP Packer Servie Account"             = "hcp_packer/service_account",
 9    "Mondoo Service Account"                = "mondoo/service_account"
10  }
11}

Als ersten Schritt müssen wir definieren, welche Secrets aus 1Password nach HashiCorp Vault übertragen/synchronisiert werden sollen. In diesem Beispiel haben wir eine lokale Variable vault_items definiert, mit den Secrets, die wir übertragen möchten. Der Schlüssel der Map ist der Name des Secrets in 1Password, der Wert ist der Pfad innerhalb der Secrets-Engine von HashiCorp Vault.

 1resource "vault_mount" "kv" {
 2  path        = "kv"
 3  type        = "kv"
 4  description = "Generic Key/Value secrets engine"
 5}
 6
 7module "vault_1password" {
 8  for_each   = local.vault_items
 9  source     = "./1password"
10  vault_name = local.vault_name
11  vault_item = each.key
12}
13
14resource "vault_generic_secret" "1password_item" {
15  for_each  = local.vault_items
16  path      = "${vault_mount.kv.path}/op/${each.value}"
17  data_json = module.vault_1password[each.key].json_data
18}

Der nächste Schritt besteht darin, eine Secrets Engine in Vault zu erstellen, in der wir die Informationen von 1Password speichern können. In diesem Beispiel verwenden wir die kv-Engine, eine generische Engine für Schlüssel/Wert-Secrets zum Speichern beliebiger Daten. Danach verwenden wir ein Terraform-Modul, um die Daten von 1Password abzurufen und sie in einer lokalen Variablen zu speichern. Schließlich werden mit einer vault_generic_secret Resource die Geheimnisse in Vault gespeichert. Der Pfad des Secrets ist eine Kombination aus dem Pfad der kv-Engine und dem Pfad des Secrets in der Map vault_items.

1Password Module

Der interessante Teil ist das 1password-Modul. Dieses Modul ist dafür verantwortlich, die Daten von 1Password abzurufen und sie in einem Format zurückzugeben, das von der Ressource vault_generic_secret verwendet werden kann. Diese Logik ist in ein Modul unterteilt, um diese Funktionalität wiederverwendbar zu machen. Das Modul könnte so aussehen:

 1variable "vault_name" {
 2  type = string
 3  description = "1password vault name"
 4}
 5
 6variable "vault_item" {
 7  type    = string
 8  description = "1password item title"
 9}
10
11data "onepassword_item" "secure_info_title" {
12  vault = var.vault_name
13  title = var.vault_item
14}
15
16locals {
17  core_data = {
18    username = data.onepassword_item.secure_info_title.username
19    password = data.onepassword_item.secure_info_title.password
20    url      = data.onepassword_item.secure_info_title.url
21    hostname = data.onepassword_item.secure_info_title.hostname
22    database = data.onepassword_item.secure_info_title.database
23    category = data.onepassword_item.secure_info_title.category
24    note     = data.onepassword_item.secure_info_title.note_value
25  }
26
27  fields = flatten(flatten([for s in data.onepassword_item.secure_info_title.section :
28    [for f in s.field : {
29      "${replace(f.label, " ", "_")}" = f.value
30    }]
31  ]))
32  json_data = merge(local.core_data, local.fields...)
33}
34
35output "json_data" {
36  value     = jsonencode(local.json_data)
37  sensitive = true
38  description = "data from 1password as json (object)"
39}

Das Modul verwendet die Datenquelle onepassword_item, um die Informationen von 1Password abzurufen. Die Datenquelle benötigt zum Abrufen der Informationen die Parameter vault und title, die als Variable an das Modul übergeben werden. Die Datenquelle gibt viele Informationen zurück, die dann in ein JSON-Objekt umgewandelt werden, das von der Ressource vault_generic_secret verwendet werden kann. Das JSON-Objekt enthält die Kerndaten wie Benutzername, Passwort usw. Darüber hinaus reduziert das Modul die Felder der 1Password-Abschnitte und führt sie in das JSON-Objekt ein.

Fazit

Die Integration von 1Password mit HashiCorp Vault ist nur ein Beispiel dafür, wie Sie Quellen von Secrets nutzen können, um Secrets in Vault zu übertragen. Es gibt viele andere Quellen für Secrets, wie AWS Secrets Manager, Azure Key Vault, Google Secret Manager oder sogar Ihre eigenen benutzerdefinierten Quellen. Wichtig ist, dass Sie Quellen nutzen können, um deren Daten auf sichere und automatisierte Weise in Vault zu übertragen.

Wenn Sie diesen Code in Kombination mit Terraform HCP verwenden, müssen Sie Ihren eigenen, benutzerdefinierten Agenten verwenden, der mit der 1Password-API interagieren kann, da der Terraform-Provider von 1Password die Verfügbarkeit der CLI erfordert. Aber das ist ein Thema für einen anderen Blogbeitrag.

Viel Spaß beim Ausprobieren!

Zurück Unsere Trainings entdecken

Wir sind für Sie da

Sie interessieren sich für unsere Trainings oder haben einfach eine Frage, die beantwortet werden muss? Sie können uns jederzeit kontaktieren! Wir werden unser Bestes tun, um alle Ihre Fragen zu beantworten.

Hier kontaktieren