Authentifizierung von Terraform Cloud um Secrets aus HashiCorp Vault auszulesen


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.

Authentifizierung von Terraform Cloud/Enterprise mittels HashiCorp Vault

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.

Sie können Terraform HCP oder Terraform Enterprise so konfigurieren, dass sie sich bei HashiCorp Vault authentifizieren, um notwendige Secrets ohne Duplizierung von Daten abzurufen. Auf diese Weise können Sie Ihre Secrets an einem zentralen Ort speichern und sie auf sichere Weise von Ihren Diensten abrufen.

Json Web Token Authentifizierung (JWT)

HashiCorp bietet mehrere Setups zur Authentifizierung von Clients, z. AppRole als Authentifizierung, wenn Ihnen keine anderen Anmeldedaten zur Verfügung stehen. Terraform Enterprise, aber auch Terraform HCP können sich mithilfe der JWT-Authentifizierungsmethode bei HashiCorp Vault authentifizieren. Mit dieser Methode können Sie sich bei Vault mithilfe eines signierten JWT-Tokens authentifizieren.

1resource "vault_jwt_auth_backend" "tfc_jwt_vault" {
2  description        = "Hashicorp tfc auth backend"
3  path               = "tfc_jwt_vault"
4  oidc_discovery_url = "https://app.terraform.io"
5  bound_issuer       = "https://app.terraform.io"
6  default_role       = "tfc_vault_config"
7}

Zunächst müssen Sie ein JWT-Authentifizierungs-Backend und eine Rolle definieren. Die Rolle definiert die Richtlinien und Ansprüche, die für die Authentifizierung gegenüber Vault erforderlich sind. Die Rolle ist an das JWT-Authentifizierungs-Backend gebunden.

 1resource "vault_jwt_auth_backend_role" "tfc_vault_config" {
 2
 3  backend = "tfc_vault_config"
 4
 5  role_name         = "tfc_jwt_all_projects"
 6  token_policies    = [ "tfc_all_projects" ]
 7  user_claim        = "terraform_full_workspace"
 8  role_type         = "jwt"
 9  bound_audiences   = ["vault.workload.identity"]
10  bound_claims_type = "glob"
11  token_ttl         = 20 * 60
12
13  bound_claims = {
14    sub = "organization:MyOrganization:project:*:workspace:*:run_phase:*"
15  }
16}

Durch die Definition der Rolle können Sie die Richtlinien und Ansprüche angeben, die für die Authentifizierung gegenüber Vault erforderlich sind. Das Attribut bound_claims gibt die Ansprüche an, die für die Authentifizierung gegenüber Vault erforderlich sind. In diesem Beispiel muss der sub-claim also mit dem angegebenen Wert übereinstimmen, sonst schlägt die Authentifizierung fehl. In diesem Beispiel kann diese Rolle über alle Projekte in der Organisation MyOrganization für alle Arbeitsbereiche und Ausführungsphasen verwendet werden.

 1resource "vault_jwt_auth_backend_role" "tfc_jwt_my_project" {
 2
 3  backend = "tfc_jwt_vault"
 4
 5  role_name         = "tfc_jwt_my_project"
 6  token_policies    = [ "tfc_all_projects" ]
 7  user_claim        = "terraform_full_workspace"
 8  role_type         = "jwt"
 9  bound_audiences   = ["vault.workload.identity"]
10  bound_claims_type = "glob"
11  token_ttl         = 20 * 60
12
13  bound_claims = {
14    sub = "organization:MyOrganization:project:MyProject:workspace:*:run_phase:*"
15  }
16}

Wenn Sie den Zugriff auf ein bestimmtes Projekt einschränken müssen, können Sie eine Rolle für dieses Projekt definieren. In diesem Beispiel kann die Rolle tfc_jwt_my_project nur für das Projekt MyProject in der Organisation MyOrganization verwendet werden, aber alle Arbeitsbereiche und Ausführungsphasen innerhalb dieses Projekts.

JWT Authentifizierung und Terraform

Wenn Sie eine Authentifizierung gegenüber HashiCorp Vault in Kombination mit der AppRole-Authentifizierung definieren müssen, müssen Sie eine Lösung finden, um die SecretID anzufordern und diese Informationen an den Client weiterzugeben. Wenn Sie die JWT-basierte Authentifizierung verwenden, müssen Sie lediglich das Vault-JWT-Authentifizierungs-Backend und die Rolle in Ihrer Terraform-Konfiguration definieren. Den Rest erledigt Terraform Cloud.

 1variable "tfc_vault_dynamic_credentials" {
 2  description = "Object containing Vault dynamic credentials configuration"
 3  type = object({
 4    default = object({
 5      token_filename = string
 6      address        = string
 7      namespace      = string
 8      ca_cert_file   = string
 9    })
10    aliases = map(object({
11      token_filename = string
12      address        = string
13      namespace      = string
14      ca_cert_file   = string
15    }))
16  })
17}
18
19provider "vault" {
20  // skip_child_token must be explicitly set to true as TFC manages the token lifecycle
21  skip_child_token = true
22  address          = var.tfc_vault_dynamic_credentials.default.address
23  namespace        = var.tfc_vault_dynamic_credentials.default.namespace
24
25  auth_login_token_file {
26    filename = var.tfc_vault_dynamic_credentials.default.token_filename
27  }
28}

Dieser Block definiert den Vault-Provider in Terraform. Das Attribut skip_child_token muss auf true gesetzt sein, da Terraform HCP den Token-Lebenszyklus verwaltet. Die Attribute address und namespace werden auf die Werte aus der Variablen tfc_vault_dynamic_credentials gesetzt. Der Block auth_login_token_file gibt die Tokendatei an, die zur Authentifizierung bei Vault verwendet wird. Diese Token-Datei wird von Terraform HCP verwaltet. Bei jedem Lauf authentifiziert sich Terraform HCP mithilfe des JWT-Tokens bei Vault und ruft die für den Lauf erforderlichen Geheimnisse ab.

Schließlich müssen Sie die folgenden Umgebungsvariablen in Ihrer Terraform-Konfiguration definieren – dies kann in den Workspace-Einstellungen in Terraform HCP mithilfe von Variable-Set erfolgen: TFC_VAULT_ADDR, TFC_VAULT_AUTH_PATH, TFC_VAULT_NAMESPACE, TFC_VAULT_PROVIDER_AUTH. Die letzte Variable ist ein boolsches Flag, das auf true gesetzt werden muss, um den Vault-Provider in Terraform entsprechend zu aktivieren. Alle anderen Variablen werden durch die vorherige Terraform-Konfiguration definiert/erstellt.

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