Share via


Utiliser le fournisseur Azure Key Vault pour le pilote CSI du magasin de secrets sur Azure Red Hat OpenShift

Le fournisseur Azure Key Vault pour le pilote CSI du magasin de secrets vous permet d’obtenir le contenu secret stocké dans une instance Azure Key Vault et d’utiliser le pilote CSI du magasin de secrets pour les monter dans des pods Kubernetes. Cet article explique comment utiliser le fournisseur Azure Key Vault pour le pilote CSI du magasin de secrets sur Azure Red Hat OpenShift.

Remarque

En guise d’alternative à la solution code source ouvert présentée dans cet article, vous pouvez utiliser Azure Arc pour gérer vos clusters ARO, ainsi que son fournisseur Azure Key Vault pour l’extension csi du magasin de secrets. Cette méthode est entièrement prise en charge par Microsoft et est recommandée au lieu de la solution code source ouvert ci-dessous.

Prérequis

Les prérequis suivants sont obligatoires :

  • Un cluster Azure Red Hat OpenShift (consultez Créer un cluster Azure Red Hat OpenShift pour en savoir plus.)
  • Azure CLI (connecté)
  • Helm 3.x CLI

Définir des variables d’environnement

Définissez les variables suivantes qui seront utilisées tout au long de cette procédure :

export KEYVAULT_RESOURCE_GROUP=${AZR_RESOURCE_GROUP:-"openshift"}
export KEYVAULT_LOCATION=${AZR_RESOURCE_LOCATION:-"eastus"}
export KEYVAULT_NAME=secret-store-$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 10 | head -n 1)
export AZ_TENANT_ID=$(az account show -o tsv --query tenantId)

Installer le pilote CSI du magasin de secrets Kubernetes

  1. Créer un projet ARO ; Vous allez déployer le pilote CSI dans ce projet :

    oc new-project k8s-secrets-store-csi
    
  2. Définissez SecurityContextConstraints pour autoriser le pilote CSI à s’exécuter (sinon, le pilote CSI ne pourra pas créer de pods) :

    oc adm policy add-scc-to-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
    
  3. Ajoutez le pilote CSI du magasin de secrets à vos référentiels Helm :

    helm repo add secrets-store-csi-driver \
      https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
    
  4. Mettez à jour vos référentiels Helm :

    helm repo update
    
  5. Installez le pilote CSI du magasin des secrets :

    helm install -n k8s-secrets-store-csi csi-secrets-store \
       secrets-store-csi-driver/secrets-store-csi-driver \
       --version v1.3.1 \
       --set "linux.providersDir=/var/run/secrets-store-csi-providers"
    

    Si vous le souhaitez, vous pouvez activer l’autorotation des secrets en ajoutant les paramètres suivants à la commande ci-dessus :

    --set "syncSecret.enabled=true" --set "enableSecretRotation=true"

  6. Vérifiez que les daemonSets du pilote CSI sont en cours d’exécution :

    kubectl --namespace=k8s-secrets-store-csi get pods -l "app=secrets-store-csi-driver"
    

    Après avoir exécuté la commande ci-dessus, vous devez voir ce qui suit :

    NAME                                               READY   STATUS    RESTARTS   AGE
     csi-secrets-store-secrets-store-csi-driver-cl7dv   3/3     Running   0          57s
     csi-secrets-store-secrets-store-csi-driver-gbz27   3/3     Running   0          57s
    

Déployer le fournisseur Azure Key Vault pour le pilote CSI du magasin de secrets

  1. Ajoutez le référentiel Azure Helm :

    helm repo add csi-secrets-store-provider-azure \
       https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
    
  2. Mettez à jour vos référentiels Helm locaux :

    helm repo update
    
  3. Installez le fournisseur CSI Azure Key Vault :

    helm install -n k8s-secrets-store-csi azure-csi-provider \
       csi-secrets-store-provider-azure/csi-secrets-store-provider-azure \
       --set linux.privileged=true --set secrets-store-csi-driver.install=false \
       --set "linux.providersDir=/var/run/secrets-store-csi-providers" \
       --version=v1.4.1
    
  4. Définissez SecurityContextConstraints pour permettre au pilote CSI d’exécuter :

    oc adm policy add-scc-to-user privileged \
       system:serviceaccount:k8s-secrets-store-csi:csi-secrets-store-provider-azure
    

Créer un coffre de clés et un secret

  1. Créez un espace de noms pour votre application.

    oc new-project my-application
    
  2. Créez un coffre de clés Azure dans votre groupe de ressources qui contient ARO.

    az keyvault create -n ${KEYVAULT_NAME} \
       -g ${KEYVAULT_RESOURCE_GROUP} \
       --location ${KEYVAULT_LOCATION}
    
  3. Créez un secret dans le coffre de clés.

    az keyvault secret set \
       --vault-name ${KEYVAULT_NAME} \
       --name secret1 --value "Hello"
    
  4. Créez un principal de service pour le coffre de clés.

    Remarque

    Si vous recevez une erreur lors de la création du principal de service, vous devrez peut-être mettre à niveau votre interface Azure CLI vers la dernière version.

    export SERVICE_PRINCIPAL_CLIENT_SECRET="$(az ad sp create-for-rbac --skip-assignment --name http://$KEYVAULT_NAME --query 'password' -otsv)"
    export SERVICE_PRINCIPAL_CLIENT_ID="$(az ad sp list --display-name http://$KEYVAULT_NAME --query '[0].appId' -otsv)"
    
  5. Définissez une stratégie d’accès pour le principal de service.

    az keyvault set-policy -n ${KEYVAULT_NAME} \
       --secret-permissions get \
       --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
    
  6. Créez et étiquetez un secret pour Kubernetes à utiliser pour accéder au coffre de clés.

    kubectl create secret generic secrets-store-creds \
       -n my-application \
       --from-literal clientid=${SERVICE_PRINCIPAL_CLIENT_ID} \
       --from-literal clientsecret=${SERVICE_PRINCIPAL_CLIENT_SECRET}
    kubectl -n my-application label secret \
       secrets-store-creds secrets-store.csi.k8s.io/used=true
    

Déployer une application qui utilise le pilote CSI

  1. Créez un SecretProviderClass élément pour accorder l’accès à ce secret :

    cat <<EOF | kubectl apply -f -
     apiVersion: secrets-store.csi.x-k8s.io/v1
     kind: SecretProviderClass
     metadata:
       name: azure-kvname
       namespace: my-application
     spec:
       provider: azure
       parameters:
         usePodIdentity: "false"
         useVMManagedIdentity: "false"
         userAssignedIdentityID: ""
         keyvaultName: "${KEYVAULT_NAME}"
         objects: |
           array:
             - |
               objectName: secret1
               objectType: secret
               objectVersion: ""
         tenantId: "${AZ_TENANT_ID}"
    EOF
    
  2. Créez un pod qui utilise le SecretProviderClass pod créé à l’étape précédente :

    cat <<EOF | kubectl apply -f -
     kind: Pod
     apiVersion: v1
     metadata:
       name: busybox-secrets-store-inline
       namespace: my-application
     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: "azure-kvname"
             nodePublishSecretRef:
               name: secrets-store-creds
    EOF
    
  3. Vérifiez que le secret est monté :

    kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
    

    La sortie doit correspondre à ce qui suit :

    secret1
    
  4. Imprimez le secret :

    kubectl exec busybox-secrets-store-inline \
       -- cat /mnt/secrets-store/secret1
    

    La sortie doit correspondre à ce qui suit :

    Hello
    

Nettoyage

Désinstallez le fournisseur Key Vault et le pilote CSI.

Désinstaller le fournisseur Key Vault

  1. Désinstaller le graphique Helm :

    helm uninstall -n k8s-secrets-store-csi azure-csi-provider
    
  2. Supprimez l’application :

    oc delete project my-application
    
  3. Supprimez le coffre de clés Azure :

    az keyvault delete -n ${KEYVAULT_NAME}
    
  4. Supprimez le principal de service :

    az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
    

Désinstaller le pilote CSI du Magasin secret Kubernetes

  1. Supprimez le pilote CSI du magasin de secrets :

    helm uninstall -n k8s-secrets-store-csi csi-secrets-store
    oc delete project k8s-secrets-store-csi
    
  2. Supprimez securityContextConstraints :

    oc adm policy remove-scc-from-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver