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:
- Ein Azure Red Hat OpenShift-Cluster (Weitere Informationen finden Sie unter Erstellen eines Azure Red Hat OpenShift-Clusters.)
- Azure CLI (angemeldet)
- Helm 3.x CLI
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
Erstellen eines ARO-Projekts; Sie stellen den CSI-Treiber in diesem Projekt bereit:
oc new-project k8s-secrets-store-csi
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
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
Aktualisieren Sie Ihre Helm-Repositorys:
helm repo update
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"
Ü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
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
Aktualisieren Sie Ihre lokalen Helm-Repositorys:
helm repo update
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
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
Erstellen Sie einen Namespace für Ihre Anwendung.
oc new-project my-application
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}
Erstellen Sie ein Geheimnis im Schlüsseltresor.
az keyvault secret set \ --vault-name ${KEYVAULT_NAME} \ --name secret1 --value "Hello"
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)"
Legen Sie eine Zugriffsrichtlinie für den Dienstprinzipal fest.
az keyvault set-policy -n ${KEYVAULT_NAME} \ --secret-permissions get \ --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
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
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
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
Ü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
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
Deinstallieren Sie Helm-Charts:
helm uninstall -n k8s-secrets-store-csi azure-csi-provider
Löschen Sie die App:
oc delete project my-application
Löschen Sie die Azure Key Vault-Instanz:
az keyvault delete -n ${KEYVAULT_NAME}
Löschen Sie den Dienstprinzipal:
az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
Deinstallieren des Kubernetes Secrets Store CSI-Treibers
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
Löschen Sie die SecurityContextConstraints:
oc adm policy remove-scc-from-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver