Condividi tramite


Usare il provider di Azure Key Vault per il driver CSI dell'archivio segreti Kubernetes

Si applica a: AKS su Azure Locale 22H2, AKS su Windows Server

Il driver CSI dell'archivio segreti Kubernetes integra gli archivi segreti con Kubernetes tramite un volume CSI (Container Storage Interface). Se si integra il driver CSI dell'archivio segreti con il servizio Azure Kubernetes abilitato da Azure Arc, è possibile montare segreti, chiavi e certificati come volume. I dati vengono quindi montati nel file system del contenitore.

Con il driver CSI dell'archivio segreti è anche possibile integrare un insieme di credenziali delle chiavi con uno dei provider supportati, ad esempio Azure Key Vault.

Operazioni preliminari

Prima di iniziare, verificare di aver soddisfatto i prerequisiti seguenti:

Accedere ai cluster usando kubectl

Eseguire il comando seguente per accedere al cluster usando kubectl. Nel comando sostituire il valore di -name con il nome del cluster esistente. Il nome del cluster usa il file del kubeconfig cluster specificato come file predefinito kubeconfig per kubectl:

Get-AksHciCredential -name mycluster

Installare il driver CSI dell'archivio segreti

Per installare il driver CSI dell'archivio segreti, eseguire il comando Helm seguente:

helm repo add csi-secrets-store-provider-azure https://azure.github.io/secrets-store-csi-driver-provider-azure/charts

Il comando seguente installa sia il driver CSI dell'archivio segreti che il provider di Azure Key Vault:

helm install csi csi-secrets-store-provider-azure/csi-secrets-store-provider-azure --namespace kube-system

Nota

È necessario installare il driver CSI dell'archivio segreti e il provider di Azure Key Vault nello spazio dei kube-system nomi . Questa guida usa lo kube-system spazio dei nomi per tutte le istanze.

Verificare che il driver CSI dell'archivio segreti e il provider di Azure Key Vault siano installati correttamente

Controllare i pod in esecuzione per assicurarsi che il driver CSI dell'archivio segreti e il provider di Azure Key Vault siano installati eseguendo i comandi seguenti:

  • Per verificare che il driver CSI dell'archivio segreti sia installato, eseguire questo comando:

    kubectl get pods -l app=secrets-store-csi-driver -n kube-system
    

    Output di esempio:

    NAME                             READY   STATUS    RESTARTS   AGE
    secrets-store-csi-driver-spbfq   3/3     Running   0          3h52m
    
  • Per verificare che il provider di Azure Key Vault sia installato, eseguire questo comando:

    kubectl get pods -l app=csi-secrets-store-provider-azure -n kube-system
    

    Output di esempio:

    NAME                                         READY   STATUS    RESTARTS   AGE
    csi-csi-secrets-store-provider-azure-tpb4j   1/1     Running   0          3h52m
    

Aggiungere segreti in un insieme di credenziali delle chiavi di Azure

È necessaria una risorsa di Azure Key Vault che contiene i dati segreti. È possibile usare una risorsa di Azure Key Vault esistente o crearne una nuova.

Se è necessario creare una risorsa di Azure Key Vault, eseguire il comando seguente. Assicurarsi di aver eseguito l'accesso az login con le credenziali di Azure. Modificare quindi i valori seguenti nell'ambiente:

az keyvault create -n <keyvault-name> -g <resourcegroup-name> -l eastus

Azure Key Vault può archiviare chiavi, segreti e certificati. Nell'esempio seguente viene configurato un segreto di testo normale denominato ExampleSecret :

az keyvault secret set --vault-name <keyvault-name> -n ExampleSecret --value MyAKSHCIExampleSecret

Creare un'identità in Azure

Usare un'entità servizio per accedere all'istanza di Azure Key Vault creata nel passaggio precedente. È consigliabile registrare gli output quando si eseguono i comandi seguenti. I passaggi successivi usano sia il segreto client che l'ID client.

Specificare il segreto client eseguendo il comando seguente:

az ad sp create-for-rbac --role Contributor --scopes /subscriptions/<subscription-id> --name http://secrets-store-test --query 'password' -otsv

Specificare l'ID client eseguendo il comando seguente:

az ad sp show --id http://secrets-store-test --query 'appId' -otsv

Fornire l'identità per accedere all'insieme di credenziali delle chiavi di Azure

Usare i valori del passaggio precedente per impostare le autorizzazioni come illustrato nel comando seguente:

az keyvault set-policy -n <keyvault-name> --secret-permissions get --spn <client-id>

Creare il segreto Kubernetes con le credenziali

Per creare il segreto Kubernetes con le credenziali dell'entità servizio, eseguire il comando seguente. Sostituire i valori seguenti con l'ID client e il segreto client appropriati del passaggio precedente:

kubectl create secret generic secrets-store-creds --from-literal clientid=<client-id> --from-literal clientsecret=<client-secret>

Per impostazione predefinita, il provider dell'archivio segreti ha filtrato l'espressione di controllo abilitata per i segreti. È possibile consentire al comando di trovare il segreto nella configurazione predefinita aggiungendo l'etichetta secrets-store.csi.k8s.io/used=true al segreto:

kubectl label secret secrets-store-creds secrets-store.csi.k8s.io/used=true

Creare e applicare un oggetto SecretProviderClass personalizzato

Per usare e configurare il driver CSI dell'archivio segreti per il cluster Kubernetes, creare una SecretProviderClass risorsa personalizzata. Verificare che la objects matrice corrisponda agli oggetti archiviati nell'istanza di Azure Key Vault:

apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
  name: <keyvault-name>                  # The name of the Azure Key Vault
  namespace: kube-system
spec:
  provider: azure
  parameters:
    keyvaultName: "<keyvault-name>"       # The name of the Azure Key Vault
    useVMManagedIdentity: "false"         
    userAssignedIdentityID: "false" 
    cloudName: ""                         # [OPTIONAL for Azure] if not provided, Azure environment defaults to AzurePublicCloud 
    objects:  |
      array:
        - |
          objectName: <secret-name>       # In this example, 'ExampleSecret'   
          objectType: secret              # Object types: secret, key or cert
          objectVersion: ""               # [OPTIONAL] object versions, default to latest if empty
    tenantId: "<tenant-id>"               # the tenant ID containing the Azure Key Vault instance

Applicare SecretProviderClass al cluster

Per distribuire l'oggetto SecretProviderClass creato nel passaggio precedente, usare il comando seguente:

kubectl apply -f ./new-secretproviderclass.yaml

Aggiornare e applicare il file YAML di distribuzione del cluster

Per assicurarsi che il cluster usi la nuova risorsa personalizzata, aggiornare il file YAML di distribuzione. Ad esempio:

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: "<keyvault-name>"
        nodePublishSecretRef:                       # Only required when using service principal mode
          name: secrets-store-creds                 # Only required when using service principal mode

Applicare quindi il file YAML di distribuzione aggiornato al cluster:

kubectl apply -f ./my-deployment.yaml 

Convalidare la distribuzione dell'archivio segreti

Per visualizzare i segreti contenuti in secrets-store, eseguire il comando seguente:

kubectl exec busybox-secrets-store-inline --namespace kube-system -- ls /mnt/secrets-store/

L'output dovrebbe mostrare il nome del segreto. In questo esempio viene visualizzato l'output seguente:

ExampleSecret

Per visualizzare il segreto di test mantenuto in secrets-store, eseguire il comando seguente:

kubectl exec busybox-secrets-store-inline --namespace kube-system -- cat /mnt/secrets-store/ExampleSecret 

L'output dovrebbe mostrare il valore del segreto. In questo esempio viene illustrato l'output seguente:

MyAKSHCIExampleSecret

Passaggi successivi