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

  1. Tworzenie projektu usługi ARO; W tym projekcie wdrożysz sterownik CSI:

    oc new-project k8s-secrets-store-csi
    
  2. 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
    
  3. 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
    
  4. Zaktualizuj repozytoria programu Helm:

    helm repo update
    
  5. 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"

  6. 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

  1. 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
    
  2. Zaktualizuj lokalne repozytoria programu Helm:

    helm repo update
    
  3. 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
    
  4. 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

  1. Utwórz przestrzeń nazw dla aplikacji.

    oc new-project my-application
    
  2. 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}
    
  3. Utwórz wpis tajny w magazynie kluczy.

    az keyvault secret set \
       --vault-name ${KEYVAULT_NAME} \
       --name secret1 --value "Hello"
    
  4. 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)"
    
  5. Ustaw zasady dostępu dla jednostki usługi.

    az keyvault set-policy -n ${KEYVAULT_NAME} \
       --secret-permissions get \
       --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
    
  6. 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

  1. 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
    
  2. 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
    
  3. 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
    
  4. 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

  1. Odinstaluj pakiet Helm:

    helm uninstall -n k8s-secrets-store-csi azure-csi-provider
    
  2. Usuń aplikację:

    oc delete project my-application
    
  3. Usuń magazyn kluczy platformy Azure:

    az keyvault delete -n ${KEYVAULT_NAME}
    
  4. Usuń jednostkę usługi:

    az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
    

Odinstalowywanie sterownika CSI magazynu wpisów tajnych Kubernetes

  1. Usuń sterownik CSI magazynu wpisów tajnych:

    helm uninstall -n k8s-secrets-store-csi csi-secrets-store
    oc delete project k8s-secrets-store-csi
    
  2. Usuń ograniczenia SecurityContext:

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