Dela via


Använda Azure Key Vault-providern för Secrets Store CSI Driver på Azure Red Hat OpenShift

Med Azure Key Vault Provider for Secrets Store CSI Driver kan du hämta hemligt innehåll som lagras i en Azure Key Vault-instans och använda CSI-drivrutinen för Secrets Store för att montera dem i Kubernetes-poddar. Den här artikeln beskriver hur du använder Azure Key Vault Provider for Secrets Store CSI Driver på Azure Red Hat OpenShift.

Kommentar

Som ett alternativ till den öppen källkod lösning som visas i den här artikeln kan du använda Azure Arc för att hantera dina ARO-kluster tillsammans med tillägget Azure Key Vault Provider for Secrets Store CSI Driver. Den här metoden stöds fullt ut av Microsoft och rekommenderas i stället för den öppen källkod lösningen nedan.

Förutsättningar

Följande krav krävs:

Ange miljövariabler

Ange följande variabler som ska användas under hela den här proceduren:

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)

Installera CSI-drivrutinen för Kubernetes Secrets Store

  1. Skapa ett ARO-projekt; du distribuerar CSI-drivrutinen till det här projektet:

    oc new-project k8s-secrets-store-csi
    
  2. Ange SecurityContextConstraints så att CSI-drivrutinen kan köras (annars kommer CSI-drivrutinen inte att kunna skapa poddar):

    oc adm policy add-scc-to-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
    
  3. Lägg till CSI-drivrutinen för Secrets Store i dina Helm-lagringsplatser:

    helm repo add secrets-store-csi-driver \
      https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
    
  4. Uppdatera dina Helm-lagringsplatser:

    helm repo update
    
  5. Installera CSI-drivrutinen för Secrets Store:

    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"
    

    Du kan också aktivera autorotation av hemligheter genom att lägga till följande parametrar i kommandot ovan:

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

  6. Kontrollera att CSI-drivrutinsdaemonuppsättningarna körs:

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

    När du har kört kommandot ovan bör du se följande:

    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
    

Distribuera Azure Key Vault-provider för Secrets Store CSI-drivrutin

  1. Lägg till Azure Helm-lagringsplatsen:

    helm repo add csi-secrets-store-provider-azure \
       https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
    
  2. Uppdatera dina lokala Helm-lagringsplatser:

    helm repo update
    
  3. Installera Azure Key Vault CSI-providern:

    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. Ange SecurityContextConstraints så att CSI-drivrutinen kan köras:

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

Skapa nyckelvalv och en hemlighet

  1. Skapa ett namnområde för ditt program.

    oc new-project my-application
    
  2. Skapa ett Azure-nyckelvalv i resursgruppen som innehåller ARO.

    az keyvault create -n ${KEYVAULT_NAME} \
       -g ${KEYVAULT_RESOURCE_GROUP} \
       --location ${KEYVAULT_LOCATION}
    
  3. Skapa en hemlighet i nyckelvalvet.

    az keyvault secret set \
       --vault-name ${KEYVAULT_NAME} \
       --name secret1 --value "Hello"
    
  4. Skapa ett huvudnamn för tjänsten för nyckelvalvet.

    Kommentar

    Om du får ett fel när du skapar tjänstens huvudnamn kan du behöva uppgradera Azure CLI till den senaste versionen.

    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. Ange en åtkomstprincip för tjänstens huvudnamn.

    az keyvault set-policy -n ${KEYVAULT_NAME} \
       --secret-permissions get \
       --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
    
  6. Skapa och märka en hemlighet som Kubernetes kan använda för att komma åt nyckelvalvet.

    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
    

Distribuera ett program som använder CSI-drivrutinen

  1. Skapa en SecretProviderClass för att ge åtkomst till den här hemligheten:

    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. Skapa en podd som använder den SecretProviderClass som skapades i föregående steg:

    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. Kontrollera att hemligheten är monterad:

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

    Utdata ska matcha följande:

    secret1
    
  4. Skriv ut hemligheten:

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

    Utdata ska matcha följande:

    Hello
    

Rensa

Avinstallera Key Vault-providern och CSI-drivrutinen.

Avinstallera Key Vault-providern

  1. Avinstallera Helm-diagram:

    helm uninstall -n k8s-secrets-store-csi azure-csi-provider
    
  2. Ta bort appen:

    oc delete project my-application
    
  3. Ta bort Azure-nyckelvalvet:

    az keyvault delete -n ${KEYVAULT_NAME}
    
  4. Ta bort tjänstens huvudnamn:

    az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
    

Avinstallera CSI-drivrutinen för Kubernetes Secret Store

  1. Ta bort CSI-drivrutinen för Secrets Store:

    helm uninstall -n k8s-secrets-store-csi csi-secrets-store
    oc delete project k8s-secrets-store-csi
    
  2. Ta bort SecurityContextConstraints:

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