HashiCorp Vault GitHub Secrets Sync mit Terraform


Bicycle

Verteilen 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.

HashiCorp Vault GitHub Secrets Sync

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.

In diesem Artikel schauen wir uns an, wie Sie HashiCorp Vault verwenden können, um Secrets mit GitHub zu synchronisieren. Dies kann nützlich sein, wenn Sie Secrets an ein GitHub-Repository – oder mehrere Repositorys – verteilen und synchron halten möchten.

Voraussetzungen

In der Dokumentation finden Sie die Voraussetzungen für dieses Tutorial. Sie benötigen ein GitHub-Konto und eine HashiCorp Vault-Instanz. Sie müssen außerdem die Vault-CLI auf Ihrem Computer installiert haben, um den Dokumentationsanweisungen folgen zu können.

Wir wollen dies mit Terraform als Code erreichen – legen wir los:

HashiCorp Vault GitHub Secrets Sync mit Terraform

Zuerst müssen wir das Ziel-Repository auswählen, in dem wir die Informationen synchronisieren möchten. Wir können dies tun, indem wir ein neues Repository erstellen oder ein vorhandenes verwenden.

Da innerhalb des Terraform Vault-Anbieters keine spezifische Ressource verfügbar ist, müssen wir die Ressource vault_generic_endpoint verwenden, um mit der Vault-API zu interagieren.

 1resource "vault_generic_endpoint" "vault_github_sync" {
 2  path                 = "/sys/sync/destinations/gh/${var.github_repository}"
 3  disable_read         = true
 4  disable_delete       = true
 5  ignore_absent_fields = true
 6  data_json = jsonencode({
 7    "access_token"     = var.github_token,
 8    "repository_owner" = var.github_repository_owner,
 9    "repository_name"  = var.github_repository
10  })
11  write_fields = ["request_id", "data"]
12}

In diesem Codeausschnitt erstellen wir eine neue vault_generic_endpoint-Ressource, die mit der Vault-API interagiert. Wir verwenden das path-Attribut, um den Endpunkt zu definieren, mit dem wir interagieren möchten. In diesem Fall verwenden wir den Endpunkt /sys/sync/destinations/gh/${var.github_repository}, um die Secrets mit dem GitHub-Repository zu synchronisieren. Die tatsächlichen Werte für die Variablen github_repository, github_token und github_repository_owner werden aus der Terraform-Konfiguration übergeben. An diesem Endpunkt wird ${var.github_repository} als Schlüssel innerhalb dieser Struktur verwendet, um die Synchronisierung zu definieren, aber es ist nur eine Zeichenfolge und kann alles sein, was Sie wollen.

Wir verwenden das data_json-Attribut, um die Daten zu übergeben, die wir an die API senden möchten. In diesem Fall übergeben wir die Werte access_token, repository_owner und repository_name. Diese Werte werden von der Vault-API verwendet, um sich bei der GitHub-API zu authentifizieren und die Informationen mit dem Repository zu synchronisieren.

Schließlich verwenden wir das Attribut write_fields, um die Felder anzugeben, die wir in die API schreiben möchten. In diesem Fall schreiben wir die Felder request_id und data.

Nach dieser Definition können wir die Zuordnungen für die Secerts erstellen, die wir mit dem GitHub-Repository synchronisieren möchten. Wir können dies tun, indem wir für jedes Secrets, das wir synchronisieren möchten, eine neue vault_generic_endpoint-Ressource erstellen.

Der tatsächliche Endpunkt benötigt als Parameter den Pfad des Secrets innerhalb von Vault sowie den Pfad der Secrets-Engine, in dem das Secret gespeichert ist.

 1resource "vault_generic_endpoint" "vault_github_sync_items" {
 2  depends_on           = [vault_generic_endpoint.vault_github_sync]
 3  path                 = "/sys/sync/destinations/gh/${var.github_repository}/associations/set"
 4  disable_read         = true
 5  disable_delete       = true
 6  ignore_absent_fields = true
 7  data_json = jsonencode({
 8    mount       = "kv",
 9    secret_name = "team_devops/dockerhub"
10  })
11  write_fields = ["request_id", "data"]
12}

In diesem Codeausschnitt erstellen wir eine neue vault_generic_endpoint-Ressource, die mit der Vault-API interagiert. Wir verwenden wieder nun das path-Attribut, um den Endpunkt zu definieren, mit dem wir interagieren möchten. In diesem Fall verwenden wir den Endpunkt /sys/sync/destinations/gh/${var.github_repository}/associations/set, um eine Zuordnung zwischen dem Secret und dem GitHub-Repository-Secret zu erstellen.

Das Geheimnis von HashiCorp Vault wird als JSON-Objekt mit dem GitHub-Repository synchronisiert.

1{
2  "username": "team_devops",
3  "password": "dockerhub",
4  "api_token": "1234567890"
5}

Innerhalb Ihrer Github-Aktionen müssen Sie Tools wie jq oder fromJson() verwenden, um das JSON-Objekt zu analysieren und die Geheimnisse in Ihrem Workflow zu verwenden.

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