Azure Red Hat OpenShift でシークレット ストア CSI ドライバーに Azure Key Vault プロバイダーを使用する

シークレット ストア CSI ドライバーの Azure Key Vault プロバイダーを使用すると、Azure Key Vault インスタンスに格納されているシークレット コンテンツを取得し、シークレット ストア CSI ドライバーを使用してそれらを Kubernetes ポッドにマウントできます。 この記事では、Azure Red Hat OpenShift でシークレット ストア CSI ドライバーに Azure Key Vault プロバイダーを使用する方法について説明します。

Note

この記事で提示するオープン ソース ソリューションの代わりに、Azure Arc を使用して、ARO クラスターと、シークレット ストア CSI ドライバーの Azure Key Vault プロバイダー拡張機能を管理できます。 この方法は Microsoft によって完全にサポートされており、以下のオープン ソース ソリューションの代わりに推奨されます。

前提条件

以下の前提条件が必要です。

環境変数を設定する

この手順全体で使用される、次の変数を設定します。

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)

Kubernetes シークレット ストア CSI ドライバーをインストールする

  1. ARO プロジェクトを作成します。CSI ドライバーをこのプロジェクトに展開します。

    oc new-project k8s-secrets-store-csi
    
  2. CSI ドライバーの実行を許可するように SecurityContextConstraints を設定します (それ以外の場合、CSI ドライバーはポッドを作成できません)。

    oc adm policy add-scc-to-user privileged \
      system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
    
  3. Helm リポジトリにシークレット ストア CSI ドライバーを追加します。

    helm repo add secrets-store-csi-driver \
      https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
    
  4. Helm リポジトリを更新します。

    helm repo update
    
  5. シークレット ストア 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"
    

    必要に応じて、上記のコマンドに次のパラメーターを追加することで、シークレットの自動ローテーションを有効にすることができます。

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

  6. CSI ドライバー DaemonSets が実行されていることを確認します。

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

    上記のコマンドを実行すると、次のように表示されます。

    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
    

シークレット ストア CSI ドライバーの Azure Key Vault プロバイダーを展開する

  1. Azure Helm リポジトリを追加します。

    helm repo add csi-secrets-store-provider-azure \
       https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
    
  2. ローカル Helm リポジトリを更新します。

    helm repo update
    
  3. Azure Key Vault CSI プロバイダーをインストールします。

    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. CSI ドライバーの実行を許可するように SecurityContextConstraints を設定します。

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

キー コンテナーとシークレットを作成する

  1. アプリケーションの名前空間を作成します。

    oc new-project my-application
    
  2. ARO を含むリソース グループに Azure キー コンテナーを作成します。

    az keyvault create -n ${KEYVAULT_NAME} \
       -g ${KEYVAULT_RESOURCE_GROUP} \
       --location ${KEYVAULT_LOCATION}
    
  3. キー コンテナーにシークレットを作成します。

    az keyvault secret set \
       --vault-name ${KEYVAULT_NAME} \
       --name secret1 --value "Hello"
    
  4. キー コンテナー用のサービス プリンシパルを作成します。

    Note

    サービス プリンシパルの作成時にエラーが発生した場合は、Azure CLI を最新バージョンにアップグレードすることが必要になる場合があります。

    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. サービス プリンシパルのアクセス ポリシーを設定します。

    az keyvault set-policy -n ${KEYVAULT_NAME} \
       --secret-permissions get \
       --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
    
  6. キー コンテナーへのアクセスに使用する Kubernetes のシークレットを作成してラベル付けします。

    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
    

CSI ドライバーを使用するアプリケーションを展開する

  1. SecretProviderClass を作成して、このシークレットへのアクセス権を付与します。

    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. 前の手順で作成した SecretProviderClass を使用するポッドを作成します。

    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. シークレットがマウントされていることを確認します。

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

    出力は、次と一致する必要があります。

    secret1
    
  4. シークレットを出力します。

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

    出力は、次と一致する必要があります。

    Hello
    

クリーンアップ

Key Vault プロバイダーと CSI ドライバーをアンインストールします。

Key Vault プロバイダーをアンインストールする

  1. Helm グラフをアンインストールします。

    helm uninstall -n k8s-secrets-store-csi azure-csi-provider
    
  2. アプリを削除します。

    oc delete project my-application
    
  3. Azure キー コンテナーを削除します。

    az keyvault delete -n ${KEYVAULT_NAME}
    
  4. サービス プリンシパルを削除します。

    az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
    

Kubernetes シークレット ストア CSI ドライバーをアンインストールする

  1. シークレット ストア CSI ドライバーを削除します。

    helm uninstall -n k8s-secrets-store-csi csi-secrets-store
    oc delete project k8s-secrets-store-csi
    
  2. SecurityContextConstraints を削除します。

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