Använda Azure Key Vault-providern för Secrets Store CSI Driver i ett AKS-kluster (Azure Kubernetes Service)

Azure Key Vault-providern för CSI-drivrutinen (Secrets Store Container Storage Interface) möjliggör integrering av ett Azure Key Vault som ett hemligt arkiv med ett AKS-kluster (Azure Kubernetes Service) via en CSI-volym.

Funktioner

  • Monterar hemligheter, nycklar och certifikat till en podd med hjälp av en CSI-volym.
  • Stöder interna CSI-volymer.
  • Stöder montering av flera secrets store-objekt som en enda volym.
  • Stöder poddportabilitet med CRD SecretProviderClass (Custom Resource Definition).
  • Stöder Windows-containrar.
  • Synkroniserar med Kubernetes-hemligheter.
  • Stöder autorotation av monterat innehåll och synkroniserade Kubernetes-hemligheter.

Begränsningar

  • En container som använder en ConfigMap eller Secret som en subPath volymmontering får inte automatiska uppdateringar när hemligheten roteras, vilket är en Kubernetes-begränsning. För att ändringarna ska börja gälla måste programmet läsa in den ändrade filen igen genom att antingen söka efter ändringar i filsystemet eller genom att starta om podden. Mer information finns i Secrets Store CSI Driver: kända begränsningar.
  • Tillägget skapar en hanterad identitet med namnet azurekeyvaultsecretsprovider-xxxxx i nodresursgruppen (MC_) och tilldelar den till vm-skalningsuppsättningen automatiskt. Du kan använda den här hanterade identiteten eller din egen hanterade identitet för att få åtkomst till nyckelvalvet. Det är inte möjligt att förhindra skapandet av identiteten.

Förutsättningar

  • Om du inte har någon Azure-prenumeration skapar du ett kostnadsfritt konto innan du börjar.

  • Terraform som är version 1.6 eller senare.

  • Azure CLI installerat och loggat in. installera den senaste versionen.

  • Behörigheter för att skapa AKS och Key Vault resurser.

  • Ange din Azure-prenumeration i Azure CLI med följande kommando. Ersätt <subscriptionId> med ditt prenumerations-ID.

    az account set --subscription <subscriptionId>
    

Nätverk

Roller

Skapa ett AKS-kluster

Skapa ett AKS-kluster med Azure Key Vault-leverantören för stöd av Secrets Store CSI Driver.

  1. Skapa variabler som används i kommandona för att skapa ett AKS-kluster och Key Vault.

    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-namn måste vara globalt unika, alfanumeriska, inklusive bindestreck och 3–24 tecken. Namnet på nyckelvalvet sammanfogar KEYVAULT_NAME variabelns myKeyVault värde med RANDOM_STRING variabelns sträng på 10 tecken.

  2. Skapa en Azure-resursgrupp med kommandot az group create .

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  3. Skapa ett AKS-kluster med Azure Key Vault-providern för CSI-drivrutinsfunktionen i Secrets Store med hjälp av az aks create kommandot med parametern --enable-addons azure-keyvault-secrets-provider .

    Parametern --enable-addons skapar en användartilldelad hanterad identitet med namnet azurekeyvaultsecretsprovider-xxxx som du kan använda för att autentisera till ditt nyckelvalv. Den hanterade identiteten lagras i nodens resursgrupp (MC_) och tilldelas automatiskt till skaleringsuppsättningen för virtuella maskiner. Du kan använda den här hanterade identiteten eller din egen hanterade identitet för att få åtkomst till nyckelvalvet. Det är inte möjligt att förhindra skapandet av identiteten.

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

    Tips/Råd

    Om du vill använda Microsoft Entra-arbetsbelastnings-ID az aks create måste kommandot innehålla parametrarna --enable-oidc-issuer och --enable-workload-identity .

Skapa ett AKS-kluster

Skapa en main.tf fil med följande konfiguration för att skapa ett AKS-kluster med Azure Key Vault provider för CSI-drivrutinsstöd för Secrets Store.

  1. Skapa Terraform-konfigurationen.

    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. Skapa AKS-klustret.

    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. Distribuera konfigurationen. Skapa en Bash-session och kör följande kommandon för att distribuera resurserna:

    terraform init
    terraform validate
    terraform plan
    terraform apply
    

Uppdatera ett befintligt AKS-kluster

Uppdatera ett befintligt AKS-kluster med Azure Key Vault-providern för CSI-drivrutinsstöd för Secrets Store.

  1. Skapa variabler som används i kommandona. Ersätt värdena efter behov för att uppdatera ditt befintliga AKS-kluster eller Key Vault.

    Om du till exempel använder ett befintligt nyckelvalv ersätter KEYVAULT_NAME du variabelns värde utan att använda variabeln RANDOM_STRING .

    Om du inte har något nyckelvalv måste Azure Key Vault-namn vara globalt unika, alfanumeriska, inklusive bindestreck och 3–24 tecken. Namnet på nyckelvalvet sammanfogar KEYVAULT_NAME variabelns myKeyVault värde med RANDOM_STRING variabelns sträng på 10 tecken. Du kan skapa nyckelvalvet senare i den här artikeln.

    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. Uppdatera ett befintligt AKS-kluster med Azure Key Vault-providern för CSI-drivrutinsfunktionen i Secrets Store med hjälp av az aks enable-addons kommandot och aktivera azure-keyvault-secrets-provider tillägget. Tillägget skapar en användartilldelad hanterad identitet som du kan använda för att autentisera till ditt nyckelvalv.

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

    När du har aktiverat Azure Key Vault-hemlighetsprovidern skapar AKS en hanterad identitet med namnet azurekeyvaultsecretsprovider-xxxx som du kan använda för att autentisera till ditt nyckelvalv. Den hanterade identiteten lagras i nodens resursgrupp (MC_) och tilldelas automatiskt till skaleringsuppsättningen för virtuella maskiner. Du kan använda den här hanterade identiteten eller din egen hanterade identitet för att få åtkomst till nyckelvalvet. Det är inte möjligt att förhindra skapandet av identiteten.

Uppdatera ett befintligt AKS-kluster

Skapa en main.tf fil med följande konfiguration för att uppdatera ett befintligt AKS-kluster med Azure Key Vault provider för CSI-drivrutinsstöd för Secrets Store.

  1. Uppdatera ett befintligt AKS-kluster.

    resource "azurerm_kubernetes_cluster" "aks" {
     name                = "<existing-cluster>"
     resource_group_name = "<resource-group>"
     key_vault_secrets_provider {
       secret_rotation_enabled = false
     }
    }
    
  2. Distribuera konfigurationen. Skapa en Bash-session och kör följande kommandon för att distribuera konfigurationen:

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

Verifiera installationen av den hanterade identiteten och nyckelvalvsprovidern

Om du använde Terraform för att skapa ett nytt kluster eller uppdatera ett befintligt kluster måste du ersätta variablerna som $CLUSTER_NAME i följande kommandon med de värden som du använde i Terraform-konfigurationen.

Verifiera den hanterade identiteten

Använd följande steg för att verifiera att en hanterad identitet skapades och tilldelades skalningsuppsättningen för klustrets virtuella maskiner.

  1. Kontrollera att den hanterade identiteten skapades och tilldelades klustret med hjälp av az aks show kommandot .

    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"
        }
      }
    }
    

    Egenskapen resourceId visar resursgruppen och identitetens namn azurekeyvaultsecretsprovider-myakscluster.

  2. Kontrollera att den hanterade identiteten har tilldelats nodresursgruppens VM-skalningsuppsättning.

    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]'
    

    Utdata visar resurs-ID för Virtuella Maskinskalningsuppsättningar Microsoft.Compute/virtualMachineScaleSets och egenskapen userAssignedIdentities med ett resurs-ID för azurekeyvaultsecretsprovider-myakscluster som bekräftar att identiteten har tilldelats den Virtuella Maskinskalningsuppsättningen.

Verifiera installationen av Azure Key Vault-providern för Secrets Store CSI-drivrutinen

  1. Hämta autentiseringsuppgifterna för AKS-klustret med hjälp av az aks get-credentials kommandot .

    az aks get-credentials \
      --name $CLUSTER_NAME \
      --resource-group $RESOURCE_GROUP
    
  2. Kontrollera att installationen är klar med kubectl get pods kommandot som visar alla poddar med secrets-store-csi-driver etiketterna och secrets-store-provider-azure i kube-system namnområdet.

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

    Flaggan o wide innehåller den nod som varje podd körs på i utdata.

    Dina utdata bör se ut ungefär som följande exempelutdata:

    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
    

Skapa nytt nyckelvalv

az keyvault create Kör kommandot för att skapa ett nytt nyckelvalv med Azure RBAC aktiverat.

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

Azure RBAC är aktiverat som standard när du skapar ett nytt nyckelvalv även om du inte inkluderar parametern --enable-rbac-authorization .

För mer information om behörighetsmodeller för Key Vault och Azure RBAC, se Ge åtkomst till Key Vault-nycklar, certifikat och hemligheter med Azure rollbaserad åtkomstkontroll.

Uppdatera befintligt nyckelvalv

Kör kommandot az keyvault update för att uppdatera ett befintligt nyckelvalv med Azure rollbaserad åtkomstkontroll (Azure RBAC). Parametern --enable-rbac-authorization krävs för att aktivera Azure RBAC när du uppdaterar ett befintligt nyckelvalv som har Azure RBAC inaktiverat.

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

Mer information om nyckelvalvsbehörighetsmodeller och Azure RBAC finns i Ge åtkomst till Key Vault-nycklar, certifikat och hemligheter med en rollbaserad åtkomstkontroll i Azure

Lägg till rolltilldelning och hemlighet i nyckelvalvet

  1. Kör kommandot az keyvault show för att kontrollera att nyckelvalvet har Azure RBAC aktiverat.

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

    Utdata ska vara true.

  2. Lägg till en rolltilldelning för ditt användarkonto i nyckelvalvets omfång med az role assignment create kommandot så att du kan lägga till en hemlighet i nyckelvalvet i nästa steg.

    Rollen Key Vault Secrets Officer med unik identifierare b86a8fe4-44ce-4948-aee5-eccb2c155cd7 läggs till och du kan använda antingen namnet eller den unika identifieraren. Det är bra att använda rollens unika identifierare för att förhindra problem om rollnamnet ändras.

    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
    

    Det kan ta flera minuter innan rolltilldelningen börjar gälla. Du kan kontrollera att rolltilldelningen skapades med följande kommando:

    az role assignment list \
      --assignee-object-id $MYID \
      --scope $KEYVAULT_ID \
      --query '[].{Role:roleDefinitionName, Scope:scope}' \
      --output table
    
  3. Skapa en oformaterad hemlighet med namnet ExampleSecret i nyckelvalvet med kommandot az keyvault secret set .

    Ditt nyckelvalv kan lagra nycklar, hemligheter och certifikat. Parametern value använder variabeln RANDOM_STRING för att skapa ett unikt värde för hemligheten.

    az keyvault secret set \
      --vault-name $KEYVAULT_NAME \
      --name ExampleSecret \
      --value MyAKSExampleSecret${RANDOM_STRING}
    
  4. Kontrollera att hemligheten har lagts till i nyckelvalvet med kommandot az keyvault secret show .

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

Skapa nytt nyckelvalv

Uppdatera filen main.tf för att skapa ett nytt nyckelvalv med Azure rollbaserad åtkomstkontroll (Azure RBAC) aktiverad.

  1. Skapa ett nytt nyckelvalv med Azure RBAC aktiverat.

    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. Tilldela rollen 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. Skapa ExampleSecret i nyckelvalvet.

    resource "azurerm_key_vault_secret" "example" {
     name         = "ExampleSecret"
     value        = "MyAKSExampleSecret"
     key_vault_id = azurerm_key_vault.kv.id
    }
    
  4. Distribuera konfigurationen. Skapa en Bash-session och kör följande kommandon för att distribuera den uppdaterade konfigurationen:

    terraform plan
    terraform apply
    
  5. Kontrollera att ExampleSecret har lagts till i nyckelvalvet med kommandot az keyvault secret show . Ersätt <keyvault-name> med namnet på nyckelvalvet som du skapade i Terraform-konfigurationen.

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

Uppdatera befintligt nyckelvalv

Uppdatera filen main.tf för att uppdatera ett befintligt nyckelvalv med Azure rollbaserad åtkomstkontroll (Azure RBAC) aktiverad.

  1. Uppdatera befintligt nyckelvalv för att aktivera Azure RBAC.

    resource "azurerm_key_vault" "kv" {
     name                = "<existing-kv>"
     resource_group_name = "<resource-group>"
     enable_rbac_authorization = true
    }
    
  2. Tilldela roll och lägg till hemlighet.

    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. Distribuera konfigurationen. Skapa en Bash-session och kör följande kommandon för att distribuera den uppdaterade konfigurationen:

    terraform plan
    terraform apply
    

Rensa resurser

Om du ska gå till nästa artikel och behöver dessa resurser ignorerar du följande steg. Om du är klar och inte planerar att fortsätta till nästa artikel bör du ta bort resurserna som skapas i den här artikeln för att undvika onödiga kostnader.

  1. Ta bort klustrets autentiseringsuppgifter från din lokala .kube/config-fil .

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. Ta bort resursgruppen och alla resurser i den, inklusive resurser i nodresursgruppen (MC_) med kommandot az group delete .

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

Kommandot terraform destroy tar bort alla resurser som definierats i den aktuella Terraform-konfigurations- och tillståndsfilen. Kör endast det här kommandot från arbetskatalogen som används för den här artikeln.

Varning

Om du arbetar med befintliga eller produktionsresurser, granskar du utförandeplanen noggrant innan du kör:

terraform plan -destroy

Undvik att köra terraform destroy mot delad eller importerad infrastruktur om du inte är säker på att det är säkert att ta bort den. Mer information finns i Terraform-dokumentationen för terraform destroy-kommandot .

  1. Ta bort klustrets autentiseringsuppgifter från din lokala .kube/config-fil .

    KUBE_CONTEXT=$(kubectl config current-context)
    kubectl config delete-context $KUBE_CONTEXT
    
  2. Kör följande kommando för att ta bort resurserna som skapats i den här artikeln:

    terraform destroy
    

Nästa steg

I den här artikeln har du lärt dig hur du använder Azure Key Vault-providern för Secrets Store CSI-drivrutinen i ett AKS-kluster. Nu måste du ange en identitet för att få åtkomst till Azure Key Vault. Fortsätt till nästa artikel om du vill veta mer.