Bagikan melalui


Menggunakan Penyedia Azure Key Vault untuk Driver Secrets Store CSI di Azure Red Hat OpenShift

Penyedia Azure Key Vault untuk Driver Secrets Store CSI memungkinkan Anda untuk mendapatkan konten rahasia yang disimpan dalam instans Azure Key Vault dan menggunakan Driver Secrets Store CSI untuk memasangnya ke dalam pod Kubernetes. Artikel ini menjelaskan cara menggunakan Penyedia Azure Key Vault untuk Secrets Store CSI Driver di Azure Red Hat OpenShift.

Nota

Sebagai alternatif untuk solusi sumber terbuka yang disajikan dalam artikel ini, Anda dapat menggunakan Azure Arc untuk mengelola kluster ARO Anda bersama dengan ekstensi Driver Azure Key Vault Provider for Secrets Store CSI-nya. Metode ini didukung sepenuhnya oleh Microsoft dan direkomendasikan alih-alih solusi sumber terbuka di bawah ini.

Prasyarat

Prasyarat berikut diperlukan:

  • Kluster Azure Red Hat OpenShift (Lihat Membuat kluster Azure Red Hat OpenShift untuk mempelajari selengkapnya.)
  • Azure CLI (masuk)
  • Helm 3.x CLI (antarmuka baris perintah)

Atur variabel lingkungan

Atur variabel berikut yang akan digunakan di seluruh prosedur ini:

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)

Menginstal Driver CSI Penyimpanan Rahasia Kubernetes

  1. Membuat proyek ARO; Anda akan menyebarkan Driver CSI ke dalam proyek ini:

    oc new-project k8s-secrets-store-csi
    
  2. Atur SecurityContextConstraints untuk memungkinkan Driver CSI berjalan (jika tidak, Driver CSI tidak akan dapat membuat pod):

    oc adm policy add-scc-to-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
    
  3. Tambahkan Driver Secrets Store CSI ke repositori Helm Anda:

    helm repo add secrets-store-csi-driver \
      https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
    
  4. Perbarui repositori Helm Anda:

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

    Secara opsional, Anda dapat mengaktifkan autorotasi rahasia dengan menambahkan parameter berikut ke perintah di atas:

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

  6. Verifikasi bahwa DaemonSet Driver CSI sedang berjalan:

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

    Setelah menjalankan perintah di atas, Anda akan melihat hal berikut:

    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
    

Menyebarkan Penyedia Azure Key Vault untuk Driver Secrets Store CSI

  1. Tambahkan repositori Azure Helm:

    helm repo add csi-secrets-store-provider-azure \
       https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
    
  2. Perbarui repositori Helm lokal Anda:

    helm repo update
    
  3. Instal penyedia CSI 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. Atur SecurityContextConstraints untuk memungkinkan driver CSI berjalan:

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

Membuat brankas kunci dan rahasia

  1. Buat namespace layanan untuk aplikasi Anda.

    oc new-project my-application
    
  2. Buat brankas kunci Azure di grup sumber daya Anda yang berisi ARO.

    az keyvault create -n ${KEYVAULT_NAME} \
       -g ${KEYVAULT_RESOURCE_GROUP} \
       --location ${KEYVAULT_LOCATION}
    
  3. Buat rahasia di brankas kunci.

    az keyvault secret set \
       --vault-name ${KEYVAULT_NAME} \
       --name secret1 --value "Hello"
    
  4. Buat perwakilan layanan untuk brankas kunci.

    Nota

    Jika Anda menerima kesalahan saat membuat perwakilan layanan, Anda mungkin perlu meningkatkan Azure CLI Anda ke versi terbaru.

    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. Tetapkan kebijakan akses untuk perwakilan layanan.

    az keyvault set-policy -n ${KEYVAULT_NAME} \
       --secret-permissions get \
       --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
    
  6. Buat dan beri label rahasia untuk digunakan Kubernetes untuk mengakses brankas kunci.

    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
    

Menyebarkan aplikasi yang menggunakan Driver CSI

  1. SecretProviderClass Buat untuk memberikan akses ke rahasia ini:

    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. Buat pod yang menggunakan yang SecretProviderClass dibuat pada langkah sebelumnya:

    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. Periksa apakah rahasia dipasang:

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

    Output harus cocok dengan yang berikut ini:

    secret1
    
  4. Cetak rahasia:

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

    Output harus cocok dengan yang berikut ini:

    Hello
    

Pembersihan

Hapus instalan Penyedia Key Vault dan Driver CSI.

Menghapus instalan Penyedia Key Vault

  1. Hapus instalan bagan Helm:

    helm uninstall -n k8s-secrets-store-csi azure-csi-provider
    
  2. Hapus aplikasi:

    oc delete project my-application
    
  3. Hapus brankas kunci Azure:

    az keyvault delete -n ${KEYVAULT_NAME}
    
  4. Hapus perwakilan layanan:

    az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
    

Hapus instalan Driver CSI Penyimpanan Rahasia Kubernetes

  1. Hapus Driver Secrets Store CSI:

    helm uninstall -n k8s-secrets-store-csi csi-secrets-store
    oc delete project k8s-secrets-store-csi
    
  2. Hapus SecurityContextConstraints:

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