Azure Key Vault-provider gebruiken voor geheimenarchief CSI-stuurprogramma in Azure Red Hat OpenShift
Met de Azure Key Vault-provider voor geheimenarchief CSI-stuurprogramma kunt u geheime inhoud ophalen die is opgeslagen in een Azure Key Vault-exemplaar en het stuurprogramma Secrets Store CSI gebruiken om deze te koppelen aan Kubernetes-pods. In dit artikel wordt uitgelegd hoe u Azure Key Vault-provider gebruikt voor het CSI-stuurprogramma geheimenarchief in Azure Red Hat OpenShift.
Notitie
Als alternatief voor de opensource-oplossing die in dit artikel wordt gepresenteerd, kunt u Azure Arc gebruiken om uw ARO-clusters samen met de Azure Key Vault-provider voor de CSI-stuurprogrammaextensie Secrets Store te beheren. Deze methode wordt volledig ondersteund door Microsoft en wordt aanbevolen in plaats van de onderstaande opensource-oplossing.
Vereisten
De volgende vereisten zijn vereist:
- Een Azure Red Hat OpenShift-cluster (zie Een Azure Red Hat OpenShift-cluster maken voor meer informatie.)
- Azure CLI (aangemeld)
- Helm 3.x CLI
Omgevingsvariabelen instellen
Stel de volgende variabelen in die tijdens deze procedure worden gebruikt:
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)
Het CSI-stuurprogramma kubernetes Secrets Store installeren
Een ARO-project maken; u implementeert het CSI-stuurprogramma in dit project:
oc new-project k8s-secrets-store-csi
Stel SecurityContextConstraints in om het CSI-stuurprogramma uit te voeren (anders kan het CSI-stuurprogramma geen pods maken):
oc adm policy add-scc-to-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
Voeg het stuurprogramma Secrets Store CSI toe aan uw Helm-opslagplaatsen:
helm repo add secrets-store-csi-driver \ https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
Werk uw Helm-opslagplaatsen bij:
helm repo update
Installeer het stuurprogramma Secrets Store CSI:
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"
U kunt desgewenst automatischerotatie van geheimen inschakelen door de volgende parameters toe te voegen aan de bovenstaande opdracht:
--set "syncSecret.enabled=true" --set "enableSecretRotation=true"
Controleer of de DaemonSets van het CSI-stuurprogramma worden uitgevoerd:
kubectl --namespace=k8s-secrets-store-csi get pods -l "app=secrets-store-csi-driver"
Nadat u de bovenstaande opdracht hebt uitgevoerd, ziet u het volgende:
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
Azure Key Vault-provider implementeren voor het CSI-stuurprogramma geheimenarchief
Voeg de Azure Helm-opslagplaats toe:
helm repo add csi-secrets-store-provider-azure \ https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
Werk uw lokale Helm-opslagplaatsen bij:
helm repo update
Installeer de CSI-provider van 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
Stel SecurityContextConstraints in om het CSI-stuurprogramma uit te voeren:
oc adm policy add-scc-to-user privileged \ system:serviceaccount:k8s-secrets-store-csi:csi-secrets-store-provider-azure
Een sleutelkluis en een geheim maken
Maak een naamruimte voor uw toepassing.
oc new-project my-application
Maak een Azure-sleutelkluis in uw resourcegroep die ARO bevat.
az keyvault create -n ${KEYVAULT_NAME} \ -g ${KEYVAULT_RESOURCE_GROUP} \ --location ${KEYVAULT_LOCATION}
Maak een geheim in de sleutelkluis.
az keyvault secret set \ --vault-name ${KEYVAULT_NAME} \ --name secret1 --value "Hello"
Maak een service-principal voor de sleutelkluis.
Notitie
Als er een fout optreedt bij het maken van de service-principal, moet u mogelijk uw Azure CLI upgraden naar de nieuwste versie.
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)"
Stel een toegangsbeleid in voor de service-principal.
az keyvault set-policy -n ${KEYVAULT_NAME} \ --secret-permissions get \ --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
Maak en label een geheim voor Kubernetes om toegang te krijgen tot de sleutelkluis.
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
Een toepassing implementeren die gebruikmaakt van het CSI-stuurprogramma
Maak een
SecretProviderClass
om toegang te verlenen tot dit geheim: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
Maak een pod die gebruikmaakt van de
SecretProviderClass
pod die in de vorige stap is gemaakt: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
Controleer of het geheim is gekoppeld:
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
De uitvoer moet overeenkomen met het volgende:
secret1
Het geheim afdrukken:
kubectl exec busybox-secrets-store-inline \ -- cat /mnt/secrets-store/secret1
De uitvoer moet overeenkomen met het volgende:
Hello
Opschonen
Verwijder de Key Vault-provider en het CSI-stuurprogramma.
De Key Vault-provider verwijderen
Helm-grafiek verwijderen:
helm uninstall -n k8s-secrets-store-csi azure-csi-provider
Verwijder de app:
oc delete project my-application
Verwijder de Azure-sleutelkluis:
az keyvault delete -n ${KEYVAULT_NAME}
Verwijder de service-principal:
az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
Het CSI-stuurprogramma voor het Kubernetes-geheimarchief verwijderen
Verwijder het stuurprogramma Secrets Store CSI:
helm uninstall -n k8s-secrets-store-csi csi-secrets-store oc delete project k8s-secrets-store-csi
Verwijder de SecurityContextConstraints:
oc adm policy remove-scc-from-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver