Freigeben über


Verwenden des Azure Key Vault Provider for Secrets Store CSI-Treibers in Azure Red Hat OpenShift

Mit dem Azure Key Vault-Anbieter für den Secrets Store CSI-Treiber können Sie Geheimnisinhalte abrufen, die in einer Azure Key Vault-Instanz gespeichert sind. Anschließend können Sie den Secrets Store CSI-Treiber dann nutzen, um diese Geheimnisinhalte in Kubernetes-Pods einzubinden. In diesem Artikel wird erläutert, wie Sie den Azure Key Vault-Anbieter für den Secrets Store CSI-Treiber auf Azure Red Hat OpenShift verwenden.

Hinweis

Als Alternative zur in diesem Artikel vorgestellten Open-Source-Lösung können Sie Azure Arc verwenden, um Ihre ARO-Cluster zusammen mit ihrer Erweiterung Azure Key Vault-Anbieter für den Secrets Store CSI-Treiber zu verwalten. Diese Methode wird vollständig von Microsoft unterstützt und wird anstelle der unten aufgeführten Open-Source-Lösung empfohlen.

Voraussetzungen

Die folgenden Voraussetzungen müssen erfüllt sein:

Festlegen von Umgebungsvariablen

Legen Sie die folgenden Variablen fest, die in diesem Verfahren verwendet werden:

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)

Installieren des Kubernetes Secrets Store CSI-Treibers

  1. Erstellen eines ARO-Projekts; Sie stellen den CSI-Treiber in diesem Projekt bereit:

    oc new-project k8s-secrets-store-csi
    
  2. Legen Sie SecurityContextConstraints fest, damit der CSI-Treiber ausgeführt werden kann (andernfalls kann der CSI-Treiber keine Pods erstellen):

    oc adm policy add-scc-to-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
    
  3. Fügen Sie Ihrem Helm-Repository den CSI-Treiber für die Secrets Store-Instanz hinzu:

    helm repo add secrets-store-csi-driver \
      https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
    
  4. Aktualisieren Sie Ihre Helm-Repositorys:

    helm repo update
    
  5. Installieren Sie den Secrets Store CSI-Treiber:

    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"
    

    Optional können Sie die automatische Rotation von Geheimnissen aktivieren, indem Sie dem obigen Befehl die folgenden Parameter hinzufügen:

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

  6. Überprüfen Sie, ob die DaemonSets des CSI-Treibers ausgeführt werden:

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

    Nachdem Sie den obigen Befehl ausgeführt haben, sollte Folgendes angezeigt werden:

    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
    

Bereitstellen des Azure Key Vault-Anbieters für den Secrets Store CSI-Treiber

  1. Fügen Sie das Azure Helm-Repository hinzu:

    helm repo add csi-secrets-store-provider-azure \
       https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
    
  2. Aktualisieren Sie Ihre lokalen Helm-Repositorys:

    helm repo update
    
  3. Installieren Sie den Azure Key Vault CSI-Anbieter:

    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. Legen Sie SecurityContextConstraints fest, damit der CSI-Treiber ausgeführt werden kann:

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

Erstellen eines Schlüsseltresors und eines Geheimnisses

  1. Erstellen Sie einen Namespace für Ihre Anwendung.

    oc new-project my-application
    
  2. Erstellen Sie eine Azure Key Vault-Instanz in Ihrer Ressourcengruppe, die ARO enthält.

    az keyvault create -n ${KEYVAULT_NAME} \
       -g ${KEYVAULT_RESOURCE_GROUP} \
       --location ${KEYVAULT_LOCATION}
    
  3. Erstellen Sie ein Geheimnis im Schlüsseltresor.

    az keyvault secret set \
       --vault-name ${KEYVAULT_NAME} \
       --name secret1 --value "Hello"
    
  4. Erstellen Sie einen Dienstprinzipals für den Schlüsseltresor.

    Hinweis

    Wenn beim Erstellen des Dienstprinzipals eine Fehlermeldung angezeigt wird, müssen Sie möglicherweise Ihre Azure CLI auf die neueste Version upgraden.

    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. Legen Sie eine Zugriffsrichtlinie für den Dienstprinzipal fest.

    az keyvault set-policy -n ${KEYVAULT_NAME} \
       --secret-permissions get \
       --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
    
  6. Erstellen und bezeichnen Sie ein Geheimnis für Kubernetes, um auf den Schlüsseltresor zuzugreifen.

    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
    

Bereitstellen einer Anwendung, die den CSI-Treiber verwendet

  1. Erstellen Sie eine SecretProviderClass, um Zugriff auf dieses Geheimnis zu gewähren:

    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. Erstellen Sie einen Pod, der die im vorherigen Schritt erstellte SecretProviderClass verwendet:

    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. Überprüfen Sie, ob das Geheimnis bereitgestellt ist:

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

    Die Ausgabe sollte wie im folgenden Screenshot aussehen:

    secret1
    
  4. Drucken Sie das Geheimnis:

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

    Die Ausgabe sollte wie im folgenden Screenshot aussehen:

    Hello
    

Bereinigung

Deinstallieren Sie den Key Vault-Anbieter und den CSI-Treiber.

Deinstallieren des Key Vault-Anbieters

  1. Deinstallieren Sie Helm-Charts:

    helm uninstall -n k8s-secrets-store-csi azure-csi-provider
    
  2. Löschen Sie die App:

    oc delete project my-application
    
  3. Löschen Sie die Azure Key Vault-Instanz:

    az keyvault delete -n ${KEYVAULT_NAME}
    
  4. Löschen Sie den Dienstprinzipal:

    az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
    

Deinstallieren des Kubernetes Secrets Store CSI-Treibers

  1. Löschen Sie den Secrets Store CSI-Treiber:

    helm uninstall -n k8s-secrets-store-csi csi-secrets-store
    oc delete project k8s-secrets-store-csi
    
  2. Löschen Sie die SecurityContextConstraints:

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