Usare l'estensione del provider di segreti di Azure Key Vault per recuperare i segreti nei cluster Kubernetes abilitati per Azure Arc

Il provider di Azure Key Vault per il driver CSI dell'archivio segreti consente l'integrazione di Azure Key Vault come archivio segreti con un cluster Kubernetes tramite un volume CSI. Per i cluster Kubernetes abilitati per Azure Arc, è possibile installare l'estensione Del provider di segreti di Azure Key Vault per recuperare i segreti.

Le funzionalità dell'estensione del provider di segreti di Azure Key Vault includono:

  • Monta segreti,chiavi/certificati nel pod usando un volume inline CSI
  • Supporta la portabilità dei pod con secretProviderClass CRD
  • Supporta contenitori Linux e Windows
  • Supporta la sincronizzazione con i segreti kubernetes
  • Supporta la rotazione automatica dei segreti
  • I componenti di estensione vengono distribuiti nelle zone di disponibilità, rendendoli ridondanti della zona

Prerequisiti

  • Un cluster con una distribuzione Kubernetes supportata che è già stata connessa ad Azure Arc. Per questo scenario sono attualmente supportate le distribuzioni kubernetes seguenti:
    • Cluster API Azure
    • cluster servizio Azure Kubernetes (AKS) in Azure Stack HCI
    • Servizio Azure Kubernetes abilitato da Azure Arc
    • Motore di Google Kubernetes
    • Distribuzione di OpenShift Kubernetes
    • Distribuzione di Kubernetes canonica
    • Servizio Elastic Kubernetes
    • Tanzu Kubernetes Grid
    • Azure Red Hat OpenShift
  • Assicurarsi di aver soddisfatto i prerequisiti generali per le estensioni del cluster. È necessario usare la versione 0.4.0 o successiva dell'estensione dell'interfaccia della k8s-extension riga di comando di Azure.

Installare l'estensione del provider di segreti di Azure Key Vault in un cluster Kubernetes abilitato per Arc

È possibile installare l'estensione del provider di segreti di Azure Key Vault nel cluster connesso nel portale di Azure usando l'interfaccia della riga di comando di Azure o distribuendo un modello di Resource Manager.

È possibile distribuire una sola istanza dell'estensione in ogni cluster Kubernetes abilitato per Azure Arc.

Suggerimento

Se il cluster si trova dietro un server proxy in uscita, assicurarsi di connetterlo ad Azure Arc usando l'opzione di configurazione proxy prima di installare l'estensione.

Azure portal

  1. Nella portale di Azure passare a Kubernetes - Azure Arc e selezionare il cluster.

  2. Selezionare Estensioni (in Impostazioni) e quindi + Aggiungi.

    Screenshot showing the Extensions page for an Arc-enabled Kubernetes cluster in the Azure portal.

  3. Nell'elenco delle estensioni disponibili selezionare Provider di segreti di Azure Key Vault per distribuire la versione più recente dell'estensione.

    Screenshot of the Azure Key Vault Secrets Provider extension in the Azure portal.

  4. Seguire le istruzioni per distribuire l'estensione. Se necessario, personalizzare l'installazione modificando le opzioni predefinite nella scheda Configurazione .

Interfaccia della riga di comando di Azure

  1. Impostare le variabili di ambiente:

    export CLUSTER_NAME=<arc-cluster-name>
    export RESOURCE_GROUP=<resource-group-name>
    
  2. Installare il driver CSI dell'archivio segreti e l'estensione del provider di segreti di Azure Key Vault eseguendo il comando seguente:

    az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider
    

L'output dovrebbe essere simile a questo esempio. Potrebbero essere necessari alcuni minuti prima che il grafico Helm del provider di segreti venga distribuito nel cluster.

{
  "aksAssignedIdentity": null,
  "autoUpgradeMinorVersion": true,
  "configurationProtectedSettings": {},
  "configurationSettings": {},
  "customLocationSettings": null,
  "errorInfo": null,
  "extensionType": "microsoft.azurekeyvaultsecretsprovider",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Kubernetes/connectedClusters/$CLUSTER_NAME/providers/Microsoft.KubernetesConfiguration/extensions/akvsecretsprovider",
  "identity": {
    "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "tenantId": null,
    "type": "SystemAssigned"
  },
  "location": null,
  "name": "akvsecretsprovider",
  "packageUri": null,
  "provisioningState": "Succeeded",
  "releaseTrain": "Stable",
  "resourceGroup": "$RESOURCE_GROUP",
  "scope": {
    "cluster": {
      "releaseNamespace": "kube-system"
    },
    "namespace": null
  },
  "statuses": [],
  "systemData": {
    "createdAt": "2022-05-12T18:35:56.552889+00:00",
    "createdBy": null,
    "createdByType": null,
    "lastModifiedAt": "2022-05-12T18:35:56.552889+00:00",
    "lastModifiedBy": null,
    "lastModifiedByType": null
  },
  "type": "Microsoft.KubernetesConfiguration/extensions",
  "version": "1.1.3"
}

Modello ARM

  1. Creare un file .json usando il formato seguente. Assicurarsi di aggiornare il <valore cluster-name> per fare riferimento al cluster.

    {
        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "parameters": {
            "ConnectedClusterName": {
                "defaultValue": "<cluster-name>",
                "type": "String",
                "metadata": {
                    "description": "The Connected Cluster name."
                }
            },
            "ExtensionInstanceName": {
                "defaultValue": "akvsecretsprovider",
                "type": "String",
                "metadata": {
                    "description": "The extension instance name."
                }
            },
            "ExtensionVersion": {
                "defaultValue": "",
                "type": "String",
                "metadata": {
                    "description": "The version of the extension type."
                }
            },
            "ExtensionType": {
                "defaultValue": "Microsoft.AzureKeyVaultSecretsProvider",
                "type": "String",
                "metadata": {
                    "description": "The extension type."
                }
            },
            "ReleaseTrain": {
                "defaultValue": "stable",
                "type": "String",
                "metadata": {
                    "description": "The release train."
                }
            }
        },
        "functions": [],
        "resources": [
            {
                "type": "Microsoft.KubernetesConfiguration/extensions",
                "apiVersion": "2021-09-01",
                "name": "[parameters('ExtensionInstanceName')]",
                "identity": {
                 "type": "SystemAssigned"
                },
                "properties": {
                    "extensionType": "[parameters('ExtensionType')]",
                    "releaseTrain": "[parameters('ReleaseTrain')]",
                    "version": "[parameters('ExtensionVersion')]"
                },
                "scope": "[concat('Microsoft.Kubernetes/connectedClusters/', parameters('ConnectedClusterName'))]"
            }
        ]
    }
    
  2. Impostare ora le variabili di ambiente usando il comando dell'interfaccia della riga di comando di Azure seguente:

    export TEMPLATE_FILE_NAME=<template-file-path>
    export DEPLOYMENT_NAME=<desired-deployment-name>
    
  3. Eseguire infine questo comando dell'interfaccia della riga di comando di Azure per installare l'estensione del provider di segreti di Azure Key Vault:

    az deployment group create --name $DEPLOYMENT_NAME --resource-group $RESOURCE_GROUP --template-file $TEMPLATE_FILE_NAME
    

Dovrebbe ora essere possibile visualizzare le risorse del provider segreto e usare l'estensione nel cluster.

Convalidare l'installazione dell'estensione

Per confermare l'installazione dell'estensione del provider di segreti di Azure Key Vault, eseguire il comando seguente.

az k8s-extension show --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider

L'output dovrebbe essere simile a questo esempio.

{
  "aksAssignedIdentity": null,
  "autoUpgradeMinorVersion": true,
  "configurationProtectedSettings": {},
  "configurationSettings": {},
  "customLocationSettings": null,
  "errorInfo": null,
  "extensionType": "microsoft.azurekeyvaultsecretsprovider",
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Kubernetes/connectedClusters/$CLUSTER_NAME/providers/Microsoft.KubernetesConfiguration/extensions/akvsecretsprovider",
  "identity": {
    "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    "tenantId": null,
    "type": "SystemAssigned"
  },
  "location": null,
  "name": "akvsecretsprovider",
  "packageUri": null,
  "provisioningState": "Succeeded",
  "releaseTrain": "Stable",
  "resourceGroup": "$RESOURCE_GROUP",
  "scope": {
    "cluster": {
      "releaseNamespace": "kube-system"
    },
    "namespace": null
  },
  "statuses": [],
  "systemData": {
    "createdAt": "2022-05-12T18:35:56.552889+00:00",
    "createdBy": null,
    "createdByType": null,
    "lastModifiedAt": "2022-05-12T18:35:56.552889+00:00",
    "lastModifiedBy": null,
    "lastModifiedByType": null
  },
  "type": "Microsoft.KubernetesConfiguration/extensions",
  "version": "1.1.3"
}

Creare o selezionare un insieme di credenziali delle chiavi di Azure

Specificare quindi Azure Key Vault da usare con il cluster connesso. Se non è già disponibile, creare un nuovo insieme di credenziali delle chiavi usando i comandi seguenti. Tenere presente che il nome dell'insieme di credenziali delle chiavi deve essere univoco a livello globale.

Impostare le seguenti variabili di ambiente:

export AKV_RESOURCE_GROUP=<resource-group-name>
export AZUREKEYVAULT_NAME=<AKV-name>
export AZUREKEYVAULT_LOCATION=<AKV-location>

Eseguire quindi il comando seguente:

az keyvault create -n $AZUREKEYVAULT_NAME -g $AKV_RESOURCE_GROUP -l $AZUREKEYVAULT_LOCATION

Azure Key Vault può archiviare chiavi, segreti e certificati. Per questo esempio, è possibile impostare un segreto di testo normale chiamato DemoSecret usando il comando seguente:

az keyvault secret set --vault-name $AZUREKEYVAULT_NAME -n DemoSecret --value MyExampleSecret

Prima di passare alla sezione successiva, prendere nota delle proprietà seguenti:

  • Nome dell'oggetto segreto in Key Vault
  • Tipo di oggetto (segreto, chiave o certificato)
  • Nome della risorsa di Key Vault
  • ID tenant di Azure per la sottoscrizione a cui appartiene l'insieme di credenziali delle chiavi

Fornire l'identità per accedere ad Azure Key Vault

Attualmente, è possibile accedere al driver CSI dell'archivio segreti nei cluster abilitati per Arc tramite un'entità servizio. Seguire questa procedura per fornire un'identità che possa accedere all'insieme di credenziali delle chiavi.

  1. Seguire la procedura per creare un'entità servizio in Azure. Prendere nota dell'ID client e del segreto client generato in questo passaggio.

  2. Verificare quindi che Azure Key Vault disponga dell'autorizzazione GET per l'entità servizio creata.

  3. Usare l'ID client e il segreto client dal primo passaggio per creare un segreto Kubernetes nel cluster connesso:

    kubectl create secret generic secrets-store-creds --from-literal clientid="<client-id>" --from-literal clientsecret="<client-secret>"
    
  4. Etichettare il segreto creato:

    kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true
    
  5. Creare un SecretProviderClass oggetto con il codice YAML seguente, inserendo i valori per il nome dell'insieme di credenziali delle chiavi, l'ID tenant e gli oggetti da recuperare dall'istanza di AKV:

    # This is a SecretProviderClass example using service principal to access Keyvault
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: akvprovider-demo
    spec:
      provider: azure
      parameters:
        usePodIdentity: "false"
        keyvaultName: <key-vault-name>
        cloudName:                           # Defaults to AzurePublicCloud
        objects:  |
          array:
            - |
              objectName: DemoSecret
              objectType: secret             # object types: secret, key or cert
              objectVersion: ""              # [OPTIONAL] object versions, default to latest if empty
        tenantId: <tenant-Id>                # The tenant ID of the Azure Key Vault instance
    

    Per l'uso con i cloud nazionali, passare cloudName a AzureUSGovernmentCloud per Azure per enti pubblici o a per AzureChinaCloud Microsoft Azure gestito da 21Vianet.

  6. Applicare SecretProviderClass al cluster:

    kubectl apply -f secretproviderclass.yaml
    
  7. Creare un pod con il codice YAML seguente, inserendo il nome dell'identità:

    # This is a sample pod definition for using SecretProviderClass and service principal to access Keyvault
    kind: Pod
    apiVersion: v1
    metadata:
      name: busybox-secrets-store-inline
    spec:
      containers:
        - name: busybox
          image: k8s.gcr.io/e2e-test-images/busybox:1.29
          command:
            - "/bin/sleep"
            - "10000"
          volumeMounts:
          - name: secrets-store-inline
            mountPath: "/mnt/secrets-store"
            readOnly: true
      volumes:
        - name: secrets-store-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "akvprovider-demo"
            nodePublishSecretRef:                       
              name: secrets-store-creds
    
  8. Applicare il pod al cluster:

    kubectl apply -f pod.yaml
    

Convalidare i segreti

Dopo l'avvio del pod, il contenuto montato nel percorso del volume specificato nella distribuzione YAML è disponibile.

## show secrets held in secrets-store
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/

## print a test secret 'DemoSecret' held in secrets-store
kubectl exec busybox-secrets-store-inline -- cat /mnt/secrets-store/DemoSecret

Opzioni di configurazione aggiuntive

L'estensione provider di segreti di Azure Key Vault supporta le configurazioni del grafico Helm.

Le impostazioni di configurazione seguenti vengono usate di frequente con l'estensione del provider di segreti di Azure Key Vault:

Impostazione di configurazione Default Descrizione
enableSecretRotation false Tipo booleano. Se true, aggiorna periodicamente il montaggio del pod e il segreto Kubernetes con il contenuto più recente dall'archivio segreti esterni
rotationPollInterval 2 m Se enableSecretRotation è true, questa impostazione specifica la durata dell'intervallo di polling della rotazione dei segreti. Questa durata può essere modificata in base alla frequenza con cui è necessario risincronizzare il contenuto montato per tutti i pod e i segreti Kubernetes alla versione più recente.
syncSecret.enabled false Input booleano. In alcuni casi, è possibile creare un segreto Kubernetes per eseguire il mirroring del contenuto montato. Se true, SecretProviderClass consente al secretObjects campo di definire lo stato desiderato degli oggetti Segreto Kubernetes sincronizzati.

Queste impostazioni possono essere specificate quando l'estensione viene installata usando il az k8s-extension create comando :

az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider --configuration-settings secrets-store-csi-driver.enableSecretRotation=true secrets-store-csi-driver.rotationPollInterval=3m secrets-store-csi-driver.syncSecret.enabled=true

È anche possibile modificare queste impostazioni dopo l'installazione usando il az k8s-extension update comando :

az k8s-extension update --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --name akvsecretsprovider --configuration-settings secrets-store-csi-driver.enableSecretRotation=true secrets-store-csi-driver.rotationPollInterval=3m secrets-store-csi-driver.syncSecret.enabled=true

È possibile usare altre impostazioni di configurazione in base alle esigenze per la distribuzione. Ad esempio, per modificare la directory radice kubelet durante la creazione di un cluster, modificare il az k8s-extension create comando:

az k8s-extension create --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --cluster-type connectedClusters --extension-type Microsoft.AzureKeyVaultSecretsProvider --name akvsecretsprovider --configuration-settings linux.kubeletRootDir=/path/to/kubelet secrets-store-csi-driver.linux.kubeletRootDir=/path/to/kubelet

Disinstallare l'estensione del provider di segreti di Azure Key Vault

Per disinstallare l'estensione, eseguire il comando seguente:

az k8s-extension delete --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP --name akvsecretsprovider

Nota

La disinstallazione dell'estensione non elimina le definizioni di risorse personalizzate create durante l'installazione dell'estensione.

Per verificare che l'istanza dell'estensione sia stata eliminata, eseguire il comando seguente:

az k8s-extension list --cluster-type connectedClusters --cluster-name $CLUSTER_NAME --resource-group $RESOURCE_GROUP

Se l'estensione è stata rimossa correttamente, non verrà visualizzata l'estensione del provider di segreti di Azure Key Vault elencata nell'output. Se nel cluster non sono installate altre estensioni, verrà visualizzata una matrice vuota.

Se non è più necessario, assicurarsi di eliminare il segreto Kubernetes associato all'entità servizio eseguendo il comando seguente:

kubectl delete secret secrets-store-creds

Riconciliazione e risoluzione dei problemi

L'estensione del provider di segreti di Azure Key Vault è di correzione automatica. Se qualcuno tenta di modificare o eliminare un componente di estensione distribuito al momento dell'installazione dell'estensione, tale componente viene riconciliato con lo stato originale. Le uniche eccezioni sono relative alle definizioni di risorse personalizzate.The only exceptions are for Custom Resource Definitions (CRD). Se i CRL vengono eliminati, non verranno riconciliati. Per ripristinare i CRL eliminati, usare di nuovo il az k8s-extension create comando con il nome dell'istanza di estensione esistente.

Per altre informazioni sulla risoluzione dei problemi comuni, vedere le guide alla risoluzione dei problemi open source per il provider di Azure Key Vault per il driver CSI dell'archivio segreti e il driver CSI dell'archivio segreti.

Passaggi successivi

  • Vuoi provare le cose? Iniziare rapidamente a usare uno scenario di avvio rapido di Azure Arc con l'API cluster.
  • Altre informazioni su Azure Key Vault.