Używanie dostawcy usługi Azure Key Vault dla sterownika CSI magazynu wpisów tajnych w usłudze Azure Red Hat OpenShift
Dostawca usługi Azure Key Vault dla sterownika CSI magazynu wpisów tajnych umożliwia pobranie zawartości wpisu tajnego przechowywanego w wystąpieniu usługi Azure Key Vault i użycie sterownika CSI magazynu wpisów tajnych, aby zainstalować je w zasobnikach Kubernetes. W tym artykule wyjaśniono, jak używać dostawcy usługi Azure Key Vault dla sterownika CSI magazynu wpisów tajnych w usłudze Azure Red Hat OpenShift.
Uwaga
Alternatywą dla rozwiązania typu open source przedstawionego w tym artykule jest użycie usługi Azure Arc do zarządzania klastrami ARO wraz z jego dostawcą usługi Azure Key Vault dla rozszerzenia sterownika CSI magazynu wpisów tajnych. Ta metoda jest w pełni obsługiwana przez firmę Microsoft i jest zalecana zamiast poniższego rozwiązania typu open source.
Wymagania wstępne
Wymagane są następujące wymagania wstępne:
- Klaster usługi Azure Red Hat OpenShift (zobacz Tworzenie klastra usługi Azure Red Hat OpenShift, aby dowiedzieć się więcej).
- Interfejs wiersza polecenia platformy Azure (zalogowany)
- Interfejs wiersza polecenia programu Helm 3.x
Ustawianie zmiennych środowiskowych
Ustaw następujące zmienne, które będą używane w tej procedurze:
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)
Instalowanie sterownika CSI magazynu wpisów tajnych kubernetes
Tworzenie projektu usługi ARO; W tym projekcie wdrożysz sterownik CSI:
oc new-project k8s-secrets-store-csi
Ustaw wartość SecurityContextConstraints, aby umożliwić uruchamianie sterownika CSI (w przeciwnym razie sterownik CSI nie będzie mógł tworzyć zasobników):
oc adm policy add-scc-to-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
Dodaj sterownik CSI magazynu wpisów tajnych do repozytoriów programu Helm:
helm repo add secrets-store-csi-driver \ https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
Zaktualizuj repozytoria programu Helm:
helm repo update
Zainstaluj sterownik CSI magazynu wpisów tajnych:
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"
Opcjonalnie możesz włączyć autorotytację wpisów tajnych, dodając następujące parametry do powyższego polecenia:
--set "syncSecret.enabled=true" --set "enableSecretRotation=true"
Sprawdź, czy zestawy DaemonSet sterownika CSI są uruchomione:
kubectl --namespace=k8s-secrets-store-csi get pods -l "app=secrets-store-csi-driver"
Po uruchomieniu powyższego polecenia powinny zostać wyświetlone następujące elementy:
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
Wdrażanie dostawcy usługi Azure Key Vault dla sterownika CSI magazynu wpisów tajnych
Dodaj repozytorium usługi Azure Helm:
helm repo add csi-secrets-store-provider-azure \ https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
Zaktualizuj lokalne repozytoria programu Helm:
helm repo update
Zainstaluj dostawcę CSI usługi 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
Ustaw wartość SecurityContextConstraints, aby umożliwić uruchamianie sterownika CSI:
oc adm policy add-scc-to-user privileged \ system:serviceaccount:k8s-secrets-store-csi:csi-secrets-store-provider-azure
Tworzenie magazynu kluczy i wpisu tajnego
Utwórz przestrzeń nazw dla aplikacji.
oc new-project my-application
Utwórz magazyn kluczy platformy Azure w grupie zasobów zawierającej usługę ARO.
az keyvault create -n ${KEYVAULT_NAME} \ -g ${KEYVAULT_RESOURCE_GROUP} \ --location ${KEYVAULT_LOCATION}
Utwórz wpis tajny w magazynie kluczy.
az keyvault secret set \ --vault-name ${KEYVAULT_NAME} \ --name secret1 --value "Hello"
Utwórz jednostkę usługi dla magazynu kluczy.
Uwaga
Jeśli podczas tworzenia jednostki usługi wystąpi błąd, może być konieczne uaktualnienie interfejsu wiersza polecenia platformy Azure do najnowszej wersji.
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)"
Ustaw zasady dostępu dla jednostki usługi.
az keyvault set-policy -n ${KEYVAULT_NAME} \ --secret-permissions get \ --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
Tworzenie i etykietowanie wpisu tajnego dla platformy Kubernetes w celu uzyskania dostępu do magazynu kluczy.
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
Wdrażanie aplikacji korzystającej ze sterownika CSI
Utwórz element ,
SecretProviderClass
aby udzielić dostępu do tego wpisu tajnego: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
Utwórz zasobnik, który używa utworzonego
SecretProviderClass
w poprzednim kroku: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
Sprawdź, czy wpis tajny jest zainstalowany:
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
Dane wyjściowe powinny być zgodne z następującymi elementami:
secret1
Wydrukuj wpis tajny:
kubectl exec busybox-secrets-store-inline \ -- cat /mnt/secrets-store/secret1
Dane wyjściowe powinny być zgodne z następującymi elementami:
Hello
Czyszczenie
Odinstaluj dostawcę usługi Key Vault i sterownik CSI.
Odinstalowywanie dostawcy usługi Key Vault
Odinstaluj pakiet Helm:
helm uninstall -n k8s-secrets-store-csi azure-csi-provider
Usuń aplikację:
oc delete project my-application
Usuń magazyn kluczy platformy Azure:
az keyvault delete -n ${KEYVAULT_NAME}
Usuń jednostkę usługi:
az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
Odinstalowywanie sterownika CSI magazynu wpisów tajnych Kubernetes
Usuń sterownik CSI magazynu wpisów tajnych:
helm uninstall -n k8s-secrets-store-csi csi-secrets-store oc delete project k8s-secrets-store-csi
Usuń ograniczenia SecurityContext:
oc adm policy remove-scc-from-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver