Zffoto - stock.adobe.com

So stellen Sie Azure Key Vaults mit Terraform bereit

Terraform verwaltet Ressourcen mit Konfigurationsdateien auf Cloud-Plattformen. In diesem Tutorial erfahren Sie, wie Sie Azure Key Vault mit Terraform bereitstellen und verwalten.

Azure Key Vault speichert zentral Geheimnisse, Schlüssel und Zertifikate. Doch wie lässt sich ein Azure Key Vault einrichten und verwalten? Die meisten Cloud-Anbieter stellen ihren Kunden Verwaltungsportale, Konsolen, Befehlszeilenschnittstellen, API-Endpunkte und andere Tools zur Verfügung. Daneben gibt es meist auch Automatisierungsfunktionen für die Cloud-Services.

Wer lieber Konfigurationsdateien als die grafische Benutzeroberfläche verwendet, sollte sich Terraform als Tool ansehen. Folgen Sie dieser Anleitung, um Azure Key Vault mit Terraform bereitzustellen und zu verwalten.

Warum Terraform für Azure Key Vault verwenden?

Terraform von Hashicorp ist ein Infrastructure as Code (IaC) Tool, mit dem Benutzer Ressourcen über Konfigurationsdateien verwalten. Das funktioniert in mehreren Cloud-Umgebungen parallel. Einige alltägliche Anwendungsfälle für Terraform sind Multi-Clouds, Infrastruktur- oder Anwendungsskalierung und das Bereitstellen von Anwendungen auf PaaS (Platform as a Service). IaC Tools wie Terraform bieten mehrere Vorteile:

  • Plattformunabhängig. Terraform lässt sich über mehrere unterstützte Anbieter hinweg verwenden.
  • Wiederverwendbarkeit. Module ermöglichen es Ihnen, plattform- und projektübergreifend Code wiederzuverwenden.
  • Agentenlos. Sie brauchen zum Installieren und Verwenden von Konfigurationen keine Agenten.
  • Deklarativ. Sie legen gewünschte Zustände von Ressourcen fest, ohne die genauen Schritte definieren zu müssen.

Mit Terraform erstellen und verwalten Sie Cloud-Plattform-Ressourcen über die APIs des Anbieters. Der Kern-Workflow von Terraform besteht aus drei Phasen:

  • Schreiben. Definieren Sie Ressourcen für einen oder mehrere Cloud-Anbieter und -Services.
  • Planen. Stellen Sie einen Ausführungsplan auf, der die Infrastruktur beschreibt, die Sie benötigen.
  • Anwenden. Terraform führt die eingereichten Operationen der Reihe nach innerhalb des ausgewählten Dienstes aus.

Verwenden Sie Terraform, um einen Azure Key Vault zu erstellen

Wenn Sie Terraform einsetzen möchten, müssen Sie es logischerweise zuerst installieren und einrichten. Laden Sie zunächst die ausführbare Terraform-Datei herunter und führen Sie den Installationsassistenten durch. Stellen Sie außerdem sicher, dass Sie die Azure-Befehlszeilenschnittstelle (CLI) installiert haben – diese führt die Authentifizierung beim Azure-Tenant durch.

Schritt 1. Starten Sie ein PowerShell-Fenster, und verwenden Sie den folgenden Befehl:

Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'; rm .\AzureCLI.msi

Möglicherweise müssen Sie das PowerShell-Fenster schließen und erneut öffnen, um den az-Befehl aufzulösen.

Schritt 2. Authentifizieren Sie den Azure-Tenant mit az login, so dass PowerShell die Abonnementdetails ausgibt (Abbildung 1).

Screenshot der PowerShell-Konsole
Abbildung 1: Wenn Sie sich beim Azure-Tenant anmelden, gibt PowerShell Ihre Abonnementdetails aus.

Wenn es mehrere Abonnements gibt, müssen Sie das zu verwendende Abonnement mit dem folgenden Befehl festlegen:

az account set --subscription "b47a11f0-1018-subscription-id"

Schritt 3. Erstellen Sie einen Dienstprinzipal. Dies ist eine Azure Active Directory-Anwendung mit einem Authentifizierungs-Token. Terraform benötigt dieses Token, um Aktionen in Ihrem Namen durchzuführen.

az ad sp create-for-rbac --role="Contributor" --scopes="/subscriptions/b47a11f0-1018-subscription-id"

Schritt 4. Kopieren Sie die zurückgegebenen Werte; Sie benötigen sie, wenn Sie die Terraform-Variablen erstellen.

Die zurückgegebenen Variablen in der PowerShell-Konsole
Abbildung 2: Gehen Sie sicher, dass Sie diese zurückgegebenen Werte sichern, um Sie später zu verwenden.

An dieser Stelle haben Sie die Wahl, ob Sie Umgebungsvariablen erstellen oder diese Werte innerhalb der Terraform-Konfiguration speichern. In der vorliegenden Anleitung speichern wir sie direkt in der Terraform-Konfiguration.

Schritt 5. Starten Sie nun das Projekt, indem Sie einen Ordner mit Dateien einrichten, die die spezifischen Konfigurationswerte enthalten.

“C:\DevOps\Terraform\Azure\Key Vault".

Terraform verwendet Dateien mit der Erweiterung .tf für die erforderliche Konfiguration. Eine Sammlung dieser Dateien heißt Stammmodul (Root Module). Sie können untergeordnete Module abteilen und lokale sowie Remote-Module importieren.

Schritt 6. Um ein Modul zu erstellen, müssen Sie eine main.tf-Datei im Verzeichnis speichern und den folgenden Code für die Variablen hinzufügen:

locals {
    subscription_id = "b47a11f0-1018-subscription-id"
    client_id = "cc884e38-67da-client-id"
    client_secret = "3t.8Q~C31mf-client-secret"
    tenant_id = "420a9610-d27d-tenant-id"
}

Schritt 7. Definieren Sie den Terraform-Abschnitt, der der Engine mitteilt, welchen Anbieter und welche Version sie verwenden soll. In diesem Fall verwenden Sie Azure.

terraform {
    required_providers {
        azurerm = {
            source = "hashicorp/azurerm"
            version = "~> 3.0.2"
        }
    }
    required_version = ">= 1.1.0"
}

Schritt 8. Fügen Sie die Anbieterkonfiguration hinzu. Hier verwenden Sie die bereits definierten lokalen Variablen wieder.

provider "azurerm" {
    features {}
 
    subscription_id = local.subscription_id
    client_id = local.client_id
    client_secret = local.client_secret
    tenant_id = local.tenant_id
}

Schritt 9. Fügen Sie die Ressourcen hinzu, die Sie erstellen möchten. Für dieses erste Beispiel setzen Sie eine Ressourcengruppe mit dem Namen rgTerraformRTQwpi auf, die weitere Komponenten enthält, die Sie bereitstellen müssen, wie zum Beispiel einen Azure Key Vault.

resource "azurerm_resource_group" "rg" {
    name = "rgTerraformRTQwpi"
    location = "westus"
}

Schritt 10. Verwenden Sie die folgenden Befehle, um die Konfiguration zu initialisieren, zu formatieren, zu validieren und dann anzuwenden:

terraform init

terraform fmt

terraform validate

terraform apply

Sobald apply durchgelaufen ist, greifen Sie auf das Azure-Portal zu oder verwenden Azure CLI, um die neue Ressourcengruppe zu bestätigen.

az group list --query "[?name=='rgTerraformRTQwpi']"

Erstellen Sie eine variable.tf-Datei

Bevor wir weiter machen, benötigen wir eine Datei namens variables.tf, die alle verwendeten Variablen enthält. So sind Sie in der Lage, die Standardwerte bei Bedarf zu überschreiben.

Die aktuelle Variablenliste sieht nun wie folgt aus:

variable "subscription_id" {
    description = "Azure Tenant Subscription ID"
    type = string
    default = "b47a11f0-1018-subscription-id"
}
variable "client_id" {
    description = "Service Principal App ID"
    type = string
    default = "cc884e38-67da-client-id"
}
variable "client_secret" {
    description = "Service Principal Password"
    type = string
    default = "3t.8Q~C31mf-client-secret"
}
variable "tenant_id" {
    description = "Azure Tenant ID"
    type = string
    default = "420a9610-d27d-tenant-id"
}

Schritt 1. Fügen Sie Variablen für die Azure Resource Group und Azure Key Vault hinzu.

variable "rg_name" {
    description = "Resource Group Name"
    type = string
    default = "rgTerraformRTQwpi"
}
variable "rg_location" {
    description = "Resource Group Location"
    type = string
    default = "westus"
}
variable "kv_name" {
    description = "Azure Key Vault Name"
    type = string
    default = "kvTerraformRTQwpi"
}
variable "kv_location" {
    description = "Azure Key Vault Location"
    type = string
    default = "westus"
}
variable "kv_enabled_for_deployment" {
    description = "Azure Key Vault Enabled for Deployment"
    type = string
    default = "true"
}
variable "kv_enabled_for_disk_encryption" {
    description = "Azure Key Vault Enabled for Disk Encryption"
    type = string
    default = "true"
}
variable "kv_enabled_for_template_deployment" {
    description = "Azure Key Vault Enabled for Deployment"
    type = string
    default = "true"
}
variable "kv_sku_name" {
    description = "Azure Key Vault SKU (Standard or Premium)"
    type = string
    default = "standard"
}

Schritt 2. Aktualisieren Sie die aktuelle Liste der Variablen in der Datei "main.tf".

Die Variablen wurden aktualisiert
Abbildung 3: So sieht es aus, wenn Sie die Variablenliste aktualisiert haben.

Schritt 3. Verwenden Sie den folgenden Code, um den erforderlichen Code für die Erstellung des Azure Key Vault hinzuzufügen:

resource "azurerm_key_vault" "key-vault" {

  name = var.kv_name

  Standort = var.kv_standort

  ressource_group_name = var.rg_name

  enabled_for_deployment = var.kv_enabled_for_deployment

  enabled_for_disk_encryption = var.kv_enabled_for_disk_encryption

  enabled_for_template_deployment = var.kv_enabled_for_template_deployment

  tenant_id = var.tenant_id

  sku_name = var.kv_sku_name

}

Schritt 4. Validieren Sie die Konfiguration vor der Ausführung mit denselben Befehlen.

terraform validate

Erfolgreich validierte Konfiguration
Abbildung 4: So sieht es aus, wenn Sie erfolgreich die Konfiguration validiert haben.

Wenn Sie sehen möchten, welche Änderungen Sie innerhalb der Cloud-Plattform vornehmen, führen Sie den Befehl terraform plan aus, damit die Konsole alle Änderungen und Werte aufführt.

Erstellen der Azure Resource Group und des Azure Key Vault

Schritt 1. Um die Azure Resource Group und den Azure Key Vault zu einzurichten, führen Sie den Befehl terraform apply aus.

Schritt 2. Wenn die Befehle durchgelaufen sind, testen Sie mit der Azure CL, ob die Azure Resource Group und der Azure Key Vault existieren.

az group list --query "[?name=='rgTerraformRTQwpi']"

az keyvault list --query "[?name=='kvTerraformRTQwpi']"

Schritt 3. Nachdem Sie nun eine Azure-Ressourcengruppe und einen Azure Key Vault erstellt haben, müssen Sie möglicherweise Richtlinien hinzufügen, um den Zugriff zu kontrollieren und Schlüssel und Geheimnisse zu verwalten. Löschen Sie dazu den Azure Key Vault aus dem Azure-Portal.

Schritt 4. Ändern Sie den Code in der Datei variables.tf und fügen Sie Folgendes ein:

variable "kv_secret_name" {
    description = "Azure Key Vault Secret Name"
    type = string
    default = "TerraformSecret"
}
variable "kv_secret_value" {
    description = "Azure Key Vault Secret Value"
    type = string
    default = "Terraform Secret"
}

Schritt 5. Aktualisieren Sie die Datei main.tf und fügen Sie den folgenden Code ein:

resource "azurerm_key_vault_secret" "key-vault-secret" {

  name = var.kv_secret_name

  wert = var.kv_geheimnis_wert

  key_vault_id = azurerm_key_vault.key-vault.id

 

  depends_on = [azurerm_resource_group.rg, azurerm_key_vault.key-vault]

}

Schritt 6. Validieren Sie das Skript und führen Sie es dann aus. Möglicherweise stoßen Sie auf ein Access Denied-Problem, da keine Richtlinie mit dem Azure Key Vault verknüpft ist. Im nächsten Schritt erklären wir, was Sie dagegen tun.

Schritt 7. Um das Problem zu lösen, erstellen Sie eine Richtlinie, die das Lesen und Erstellen von Geheimnissen und Schlüsseln erlaubt. Aktualisieren Sie die Konfiguration des Azure Key Vault.

Fügen Sie unter dem Abschnitt provider folgendes hinzu:

data "azurerm_client_config" "current" {}

Schritt 8. Aktualisieren Sie den Azure Key Vault-Code, um die Zugriffsrichtlinie hinzuzufügen.

resource "azurerm_key_vault" "key-vault" {
    name = var.kv_name
    location = var.kv_location
    resource_group_name = var.rg_name
 
    enabled_for_deployment = var.kv_enabled_for_deployment
    enabled_for_disk_encryption = var.kv_enabled_for_disk_encryption
    enabled_for_template_deployment = var.kv_enabled_for_template_deployment
 
    tenant_id = var.tenant_id
    sku_name = var.kv_sku_name
 
    access_policy {
        tenant_id = data.azurerm_client_config.current.tenant_id
        object_id = data.azurerm_client_config.current.object_id
        key_permissions = ["Create", "Get", "List", "Purge", "Recover",]
        secret_permissions = ["Get", "List", "Purge", "Recover", "Set"]
        certificate_permissions = ["Create", "Get", "List", "Purge", "Recover", "Update"]
    }
 
    depends_on = [azurerm_resource_group.rg]
}

Nun können Sie das Skript validieren und ausführen. Wenn es abgeschlossen ist, sehen Sie eine Zugriffsrichtlinie und einen Schlüssel im Azure Key Vault.

Erfahren Sie mehr über Server- und Desktop-Virtualisierung