Verwenden des Azure Key Vault Provider for Secrets Store CSI-Treibers in einem Azure Kubernetes Service (AKS)-Cluster

Der Azure Key Vault-Anbieter für Secrets Store Container Storage Interface (CSI)-Treiber ermöglicht die Integration eines Azure Key Vault als geheimen Speicher mit einem Azure Kubernetes Service (AKS)-Cluster über ein CSI-Volume.

Features

  • Einbinden von Geheimnissen, Schlüsseln und Zertifikaten in einen Pod mithilfe eines CSI-Volumes.
  • Unterstützung von CSI-Inlinevolumes.
  • Unterstützung für das Einbinden mehrerer Geheimnisspeicherobjekte als einzelnes Volume.
  • Unterstützt die Pod-Portabilität mit der SecretProviderClass benutzerdefinierten Ressourcendefinition (Custom Resource Definition, CRD).
  • Unterstützung von Windows-Containern.
  • Synchronisieren mit Kubernetes-Geheimnissen.
  • Unterstützung für die automatische Rotation eingebundener Inhalte und synchronisierter Kubernetes-Geheimnisse.

Einschränkungen

  • Ein Container, der ein ConfigMap oder Secret als subPath Volume-Mount verwendet, erhält keine automatisierten Updates, wenn das Secret rotiert wird, was eine Limitierung von Kubernetes ist. Damit die Änderungen wirksam werden, muss die Anwendung die geänderte Datei neu laden, indem sie entweder nach Änderungen im Dateisystem sucht oder indem sie den Pod neu starten. Weitere Informationen finden Sie unter Bekannte Einschränkungen des Secrets Store CSI-Treibers.
  • Das Add-On erstellt in der Knotenressourcengruppe (azurekeyvaultsecretsprovider-xxxxx) eine verwaltete Identität mit dem Namen MC_ und weist sie dem Skalierungssatz für virtuelle Computer automatisch zu. Sie können diese verwaltete Identität oder Ihre eigene verwaltete Identität verwenden, um auf den Schlüsseltresor zuzugreifen. Es wird nicht unterstützt, um die Erstellung der Identität zu verhindern.

Voraussetzungen

  • Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

  • Terraform der Version 1.6 oder höher.

  • Azure CLI installiert und angemeldet. installieren Sie die neueste Version.

  • Berechtigungen zum Erstellen von AKS und Key Vault Ressourcen.

  • Legen Sie Ihr Azure-Abonnement im Azure CLI mit dem folgenden Befehl fest. Ersetzen Sie <subscriptionId> durch Ihre Abonnement-ID.

    az account set --subscription <subscriptionId>
    

Netzwerk

Rollen

Erstellen eines AKS-Clusters

Erstellen Sie einen AKS-Cluster mit dem Azure Key Vault-Anbieter zur Unterstützung des Secrets Store CSI Driver.

  1. Erstellen Sie Variablen, die in den Befehlen zum Erstellen eines AKS-Clusters und eines Key Vault verwendet werden.

    export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
    export KEYVAULT_NAME=myKeyVault${RANDOM_STRING}
    export RESOURCE_GROUP=myResourceGroup
    export CLUSTER_NAME=myAKSCluster
    export LOCATION=eastus2
    

    Azure Key Vault-Namen müssen global eindeutig, alphanumerisch einschließlich Bindestrichen und 3-24 Zeichen sein. Der Name des Schlüsseltresors verkettet den Wert der KEYVAULT_NAME-Variablen mit der 10-stelligen Zeichenfolge der myKeyVault-VariablenRANDOM_STRING.

  2. Erstellen Sie mithilfe des Befehls az group create eine Azure-Ressourcengruppe.

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Verwenden Sie den Befehl az aks create mit dem Parameter --enable-addons azure-keyvault-secrets-provider, um einen AKS-Cluster mit Azure Key Vault Provider for Secrets Store CSI-Treiber zu erstellen.

    Der --enable-addons-Parameter erstellt eine vom Benutzer zugewiesene verwaltete Identität namens azurekeyvaultsecretsprovider-xxxx, die Sie zum Authentifizieren bei Ihrem Schlüsseltresor verwenden können. Die verwaltete Identität wird in der Knotenressourcengruppe (MC_) gespeichert und automatisch dem Skalierungssatz für virtuelle Computer zugewiesen. Sie können diese verwaltete Identität oder Ihre eigene verwaltete Identität verwenden, um auf den Schlüsseltresor zuzugreifen. Es wird nicht unterstützt, um die Erstellung der Identität zu verhindern.

    az aks create \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --enable-addons azure-keyvault-secrets-provider \
      --generate-ssh-keys
    

    Tipp

    Wenn Sie Microsoft Entra Workload ID verwenden möchten, muss der az aks create-Befehl die Parameter --enable-oidc-issuer und --enable-workload-identity enthalten.

Erstellen eines AKS-Clusters

Erstellen Sie eine main.tf Datei mit der folgenden Konfiguration, um einen AKS-Cluster mit Azure Key Vault-Provider für die Unterstützung des Secrets Store CSI-Treibers zu erstellen.

  1. Erstellen Sie die Terraform-Konfiguration.

    terraform {
     required_version = ">= 1.6.0"
     required_providers {
       azurerm = {
         source  = "hashicorp/azurerm"
         version = "~> 4.0"
       }
     }
    }
    provider "azurerm" {
     features {}
    }
    data "azurerm_client_config" "current" {}
    resource "azurerm_resource_group" "rg" {
     name     = "aks-rg"
     location = "East US"
    }
    
  2. Erstellen Sie den AKS-Cluster.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "aks-cluster"
     location            = azurerm_resource_group.rg.location
     resource_group_name = azurerm_resource_group.rg.name
     dns_prefix          = "akscsi"
     default_node_pool {
       name       = "system"
       node_count = 1
       vm_size    = "Standard_DS2_v2"
     }
     identity {
       type = "SystemAssigned"
     }
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  3. Stellen Sie die Konfiguration bereit. Erstellen Sie eine Bash-Sitzung, führen Sie die folgenden Befehle aus, um die Ressourcen bereitzustellen:

    terraform init
    terraform validate
    terraform plan
    terraform apply
    

Aktualisieren eines vorhandenen AKS-Clusters

Aktualisieren Sie einen vorhandenen AKS-Cluster mit dem Azure Key Vault-Anbieter für die CSI-Treiberunterstützung für den Secrets Store.

  1. Erstellen Sie Variablen, die in den Befehlen verwendet werden. Ersetzen Sie die Werte nach Bedarf, um Ihren vorhandenen AKS-Cluster oder Key Vault zu aktualisieren.

    Wenn Sie beispielsweise einen vorhandenen Schlüsseltresor verwenden, ersetzen Sie den Wert der KEYVAULT_NAME Variablen, ohne die RANDOM_STRING Variable zu verwenden.

    Wenn Sie keinen Schlüsseltresor haben, müssen Azure Key Vault-Namen global eindeutig, alphanumerisch einschließlich Bindestrichen und 3-24 Zeichen sein. Der Name des Schlüsseltresors verkettet den Wert der KEYVAULT_NAME-Variablen mit der 10-stelligen Zeichenfolge der myKeyVault-VariablenRANDOM_STRING. Sie können den Schlüsseltresor später in diesem Artikel erstellen.

    export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
    export KEYVAULT_NAME=myKeyVault${RANDOM_STRING}
    export RESOURCE_GROUP=myResourceGroup
    export CLUSTER_NAME=myAKSCluster
    export LOCATION=eastus2
    
  2. Aktualisieren Sie einen vorhandenen AKS-Cluster mit dem Azure Key Vault-Anbieter für die Secrets Store CSI-Treiber-Funktion mithilfe des az aks enable-addons-Befehls, und aktivieren Sie das azure-keyvault-secrets-provider Add-on. Das Add-On erstellt eine benutzerseitig zugewiesene verwaltete Identität, mit der Sie sich bei Ihrem Schlüsseltresor authentifizieren können.

    az aks enable-addons \
      --addons azure-keyvault-secrets-provider \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    

    Nachdem Sie den geheimen Azure Key Vault-Anbieter aktiviert haben, erstellt AKS eine verwaltete Identität mit dem Namen azurekeyvaultsecretsprovider-xxxx , mit der Sie sich bei Ihrem Schlüsseltresor authentifizieren können. Die verwaltete Identität wird in der Knotenressourcengruppe (MC_) gespeichert und automatisch dem Skalierungssatz für virtuelle Computer zugewiesen. Sie können diese verwaltete Identität oder Ihre eigene verwaltete Identität verwenden, um auf den Schlüsseltresor zuzugreifen. Es wird nicht unterstützt, um die Erstellung der Identität zu verhindern.

Aktualisieren eines vorhandenen AKS-Clusters

Erstellen Sie eine main.tfDatei mit der folgenden Konfiguration, um einen vorhandenen AKS-Cluster mit Azure Key Vault Anbieter für die Unterstützung von Secrets Store-CSI-Treibern zu aktualisieren.

  1. Aktualisieren Sie einen bestehenden AKS-Cluster.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "<existing-cluster>"
     resource_group_name = "<resource-group>"
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  2. Stellen Sie die Konfiguration bereit. Erstellen Sie eine Bash-Sitzung, führen Sie die folgenden Befehle aus, um die Konfiguration bereitzustellen:

    Run the following commands to apply the updates:
    
    terraform init
    terraform validate
    terraform plan
    terraform apply
    

Überprüfen der Installation des Anbieters von verwalteten Identitäten und Schlüsseltresoren

Wenn Sie Terraform verwendet haben, um einen neuen Cluster zu erstellen oder einen vorhandenen Cluster zu aktualisieren, müssen Sie die Variablen wie $CLUSTER_NAME in den folgenden Befehlen durch die Werte ersetzen, die Sie in Ihrer Terraform-Konfiguration verwendet haben.

Überprüfen der verwalteten Identität

Führen Sie die folgenden Schritte aus, um zu überprüfen, ob die verwaltete Identität erstellt und dem Virtual Machine Scale Set des Clusters zugewiesen wurde.

  1. Überprüfen Sie, ob die verwaltete Identität erstellt und dem Cluster mithilfe des az aks show Befehls zugewiesen wurde.

    az aks show \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --query addonProfiles
    
    {
      "azureKeyvaultSecretsProvider": {
        "config": {
          "enableSecretRotation": "false",
          "rotationPollInterval": "2m"
        },
        "enabled": true,
        "identity": {
          "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
          "objectId": "aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb",
          "resourceId": "/subscriptions/<subscriptionID>/resourcegroups/MC_myResourceGroup_myAKSCluster_eastus2/providers/Microsoft.ManagedIdentity/userAssignedIdentities/azurekeyvaultsecretsprovider-myakscluster"
        }
      }
    }
    

    Die resourceId Eigenschaft zeigt die Ressourcengruppe und den Namen der Identität azurekeyvaultsecretsprovider-myakscluster an.

  2. Überprüfen Sie, ob die verwaltete Identität dem VM-Skalierungssatz der Knotenressourcengruppe zugewiesen ist.

    NODE_RG=$(az aks show \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP \
      --query nodeResourceGroup --output tsv)
    
    VMSS_NAME=$(az vmss list \
      --resource-group $NODE_RG \
      --query [].name --output tsv)
    
    az vmss show --name $VMSS_NAME --resource-group $NODE_RG --query '[id, identity]'
    

    Die Ausgabe zeigt die Microsoft.Compute/virtualMachineScaleSets Ressourcen-ID des Virtual Machines Scale Set und die Eigenschaft userAssignedIdentities mit einer Ressourcen-ID für azurekeyvaultsecretsprovider-myakscluster, die bestätigt, dass die Identität des Virtual Machine Scale Set zugewiesen ist.

Überprüfen der Installation des Azure Key Vault Provider for Secrets Store CSI-Treibers

  1. Rufen Sie die Anmeldeinformationen des AKS-Clusters mit dem Befehl az aks get-credentials ab.

    az aks get-credentials \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    
  2. Verifizieren Sie, ob die Installation mittels des kubectl get pods-Befehls abgeschlossen ist, der alle Pods mit den secrets-store-csi-driver- und secrets-store-provider-azure-Labels im kube-system-Namespace auflistet.

    kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver,secrets-store-provider-azure)' -o wide
    

    Das -o wide-Flag nimmt den Knoten, auf dem jeder Pod ausgeführt wird, in die Ausgabe auf.

    Ihre Ausgabe sollte in etwa dem folgendem Beispiel entsprechen:

    NAME                                     READY   STATUS    RESTARTS   AGE    NODE
    aks-secrets-store-csi-driver-4vpkj       3/3     Running   2          4m25s  aks-nodepool1-12345678-vmss000002
    aks-secrets-store-csi-driver-ctjq6       3/3     Running   2          4m21s  aks-nodepool1-12345678-vmss000001
    aks-secrets-store-csi-driver-tlvlq       3/3     Running   2          4m24s  aks-nodepool1-12345678-vmss000000
    aks-secrets-store-provider-azure-5p4nb   1/1     Running   0          4m21s  aks-nodepool1-12345678-vmss000000
    aks-secrets-store-provider-azure-6pqmv   1/1     Running   0          4m24s  aks-nodepool1-12345678-vmss000001
    aks-secrets-store-provider-azure-f5qlm   1/1     Running   0          4m25s  aks-nodepool1-12345678-vmss000002
    

Neuen Schlüsselvault erstellen

Führen Sie den az keyvault create Befehl aus, um einen neuen Schlüsseltresor mit aktiviertem Azure RBAC zu erstellen.

az keyvault create \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location $LOCATION \
  --enable-rbac-authorization

Azure RBAC ist standardmäßig aktiviert, wenn Sie einen neuen Schlüsseltresor erstellen, auch wenn Sie den --enable-rbac-authorization Parameter nicht einschließen.

Weitere Informationen zu Key Vault-Berechtigungsmodellen und Azure RBAC finden Sie unter Bieten Sie Zugriff auf Key Vault-Schlüssel, Zertifikate und Geheimnisse mit einer rollenbasierten Zugriffssteuerung von Azure.

Aktualisieren des vorhandenen Schlüsseltresors

Führen Sie den Befehl az keyvault update aus, um einen vorhandenen Schlüsseltresor mit Azure rollenbasierten Zugriffssteuerung (Azure RBAC) zu aktualisieren. Der parameter --enable-rbac-authorization ist erforderlich, um Azure RBAC zu aktivieren, wenn Sie einen vorhandenen Schlüsseltresor aktualisieren, der Azure RBAC deaktiviert hat.

az keyvault update \
  --name $KEYVAULT_NAME \
  --resource-group $RESOURCE_GROUP \
  --enable-rbac-authorization

Weitere Informationen zu Schlüsseltresor-Berechtigungsmodellen und Azure RBAC finden Sie unter Bereitstellen des Zugriffs auf Schlüsseltresorschlüssel, Zertifikate und geheime Schlüssel mit einer rollenbasierten Azure-Zugriffssteuerung

Hinzufügen von Rollenzuweisungen und Geheimnissen zum Schlüsseltresor

  1. Führen Sie den Befehl az keyvault show aus, um zu überprüfen, ob Azure RBAC für den Schlüsseltresor aktiviert ist.

    az keyvault show \
      --name $KEYVAULT_NAME \
      --resource-group $RESOURCE_GROUP \
      --query properties.enableRbacAuthorization
    

    Die Ausgabe sollte sein true.

  2. Fügen Sie mithilfe des Befehls az role assignment create eine Rollenzuweisung für Ihr Benutzerkonto für den Schlüsseltresorbereich hinzu, um im nächsten Schritt ein Schlüsseltresor-Secret hinzufügen zu können.

    Die Rolle "Key Vault Secrets Officer" mit eindeutiger ID b86a8fe4-44ce-4948-aee5-eccb2c155cd7 wird hinzugefügt, und Sie können den Namen oder den eindeutigen Bezeichner verwenden. Die Verwendung des eindeutigen Bezeichners der Rolle ist eine bewährte Methode, um Probleme zu vermeiden, wenn sich der Rollenname ändert.

    KEYVAULT_ID=$(az keyvault show \
      --name $KEYVAULT_NAME \
      --resource-group $RESOURCE_GROUP \
      --query id -o tsv)
    
    MYID=$(az ad signed-in-user show --query id --output tsv)
    
    az role assignment create \
      --assignee-object-id $MYID \
      --role "b86a8fe4-44ce-4948-aee5-eccb2c155cd7" \
      --scope $KEYVAULT_ID \
      --assignee-principal-type User
    

    Es kann mehrere Minuten dauern, bis die Rollenzuweisung wirksam wird. Sie können überprüfen, ob die Rollenzuweisung mit dem folgenden Befehl erstellt wurde:

    az role assignment list \
      --assignee-object-id $MYID \
      --scope $KEYVAULT_ID \
      --query '[].{Role:roleDefinitionName, Scope:scope}' \
      --output table
    
  3. Erstellen Sie mit dem Befehl ExampleSecret in dem Schlüsseltresor ein Nur-Text-Secret in dem Schlüsseltresor mit dem Namen az keyvault secret set.

    Ihr Key Vault kann Schlüssel, Geheimnisse und Zertifikate speichern. Der value Parameter verwendet die RANDOM_STRING Variable, um einen eindeutigen Wert für den geheimen Schlüssel zu erstellen.

    az keyvault secret set \
      --vault-name $KEYVAULT_NAME \
      --name ExampleSecret \
      --value MyAKSExampleSecret${RANDOM_STRING}
    
  4. Überprüfen Sie mithilfe des Befehls [az keyvault secret show][az-keyvault-secret-show], ob das Geheimnis dem Schlüsseltresor hinzugefügt wurde.

    az keyvault secret show --vault-name $KEYVAULT_NAME --name ExampleSecret
    

Neuen Schlüsselvault erstellen

Aktualisieren Sie Ihre main.tfdatei, um einen neuen Schlüsseltresor mit aktivierter Azure rollenbasierten Zugriffssteuerung (Azure RBAC) zu erstellen.

  1. Erstellen Sie einen neuen Schlüsseltresor mit aktiviertem Azure RBAC.

    data "azurerm_client_config" "current" {}
    resource "random_string" "suffix" {
     length  = 5
     special = false
     upper   = false
    }
    resource "azurerm_key_vault" "kv" {
     name                = "akskv${random_string.suffix.result}"
     location            = azurerm_resource_group.rg.location
     resource_group_name = azurerm_resource_group.rg.name
     tenant_id           = data.azurerm_client_config.current.tenant_id
     sku_name            = "standard"
     enable_rbac_authorization = true
    }
    
  2. Zuweisen der Rolle „Key Vault Secrets Officer“

    resource "azurerm_role_assignment" "kv_role" {
     scope                = azurerm_key_vault.kv.id
     role_definition_name = "Key Vault Secrets Officer"
     principal_id         = data.azurerm_client_config.current.object_id
    }
    
  3. Erstellen Sie ExampleSecret im Schlüsseltresor.

    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  4. Stellen Sie die Konfiguration bereit. Erstellen Sie eine Bash-Sitzung, führen Sie die folgenden Befehle aus, um die aktualisierte Konfiguration bereitzustellen:

    terraform plan
    terraform apply
    
  5. Überprüfen Sie mithilfe des Befehls [az keyvault secret show][az-keyvault-secret-show], ob ExampleSecret dem Schlüsseltresor hinzugefügt wurde. Ersetzen Sie <keyvault-name> durch den Namen des Schlüsseltresors, den Sie in der Terraform-Konfiguration erstellt haben.

    az keyvault secret show \
     --vault-name <keyvault-name> \
     --name ExampleSecret
    

Aktualisieren des vorhandenen Schlüsseltresors

Aktualisieren Sie Ihre datei main.tf so, dass ein vorhandener Schlüsseltresor mit aktivierter Azure rollenbasierten Zugriffssteuerung (Azure RBAC) aktualisiert wird.

  1. Aktualisieren Sie den vorhandenen Schlüsseltresor, um Azure RBAC zu aktivieren.

    resource "azurerm_key_vault" "kv" {
     name                = "<existing-kv>"
     resource_group_name = "<resource-group>"
     enable_rbac_authorization = true
    }
    
  2. Rolle zuweisen und Geheimnis hinzufügen.

    resource "azurerm_role_assignment" "kv_role" {
     scope                = azurerm_key_vault.kv.id
     role_definition_name = "Key Vault Secrets Officer"
     principal_id         = data.azurerm_client_config.current.object_id
    }
    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  3. Stellen Sie die Konfiguration bereit. Erstellen Sie eine Bash-Sitzung, führen Sie die folgenden Befehle aus, um die aktualisierte Konfiguration bereitzustellen:

    terraform plan
    terraform apply
    

Bereinigen von Ressourcen

Wenn Sie zum nächsten Artikel wechseln und diese Ressourcen benötigen, ignorieren Sie die folgenden Schritte. Andernfalls sollten Sie die in diesem Artikel erstellten Ressourcen löschen, wenn Sie fertig sind und nicht beabsichtigen, den nächsten Artikel fortzusetzen, um unnötige Kosten zu vermeiden.

  1. Entfernen Sie die Anmeldeinformationen Ihres Clusters aus Ihrer lokalen .kube/config-Datei.

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. Löschen Sie die Ressourcengruppe und alle darin enthaltenen Ressourcen, einschließlich Ressourcen in der Knotenressourcengruppe (MC_) mithilfe des az group delete Befehls.

    az group delete --name $RESOURCE_GROUP --yes --no-wait
    

Mit dem terraform destroy Befehl werden alle Ressourcen entfernt, die in der aktuellen Terraform-Konfigurations- und Zustandsdatei definiert sind. Führen Sie diesen Befehl nur aus dem Arbeitsverzeichnis aus, das für diesen Artikel verwendet wird.

Warnung

Wenn Sie mit vorhandenen oder Produktionsressourcen arbeiten, überprüfen Sie den Ausführungsplan sorgfältig, bevor Sie Folgendes ausführen:

terraform plan -destroy

Vermeiden Sie die Ausführung von terraform destroy auf freigegebener oder importierter Infrastruktur, es sei denn, Sie sind sicher, dass diese sicher entfernt werden kann. Weitere Informationen finden Sie in der Terraform-Dokumentation für den Terraform-Zerstörungsbefehl .

  1. Entfernen Sie die Anmeldeinformationen Ihres Clusters aus Ihrer lokalen .kube/config-Datei.

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. Führen Sie den folgenden Befehl aus, um die in diesem Artikel erstellten Ressourcen zu entfernen:

    terraform destroy
    

Nächste Schritte

In diesem Artikel haben Sie erfahren, wie Sie den Azure Key Vault Provider for Secrets Store CSI-Treiber in einem AKS-Cluster verwenden. Bereitstellen einer Identität für den Zugriff auf den Azure-Schlüsseltresor. Um zu erfahren, wie das geht, fahren Sie mit dem nächsten Artikel fort.