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 によって完全にサポートされており、以下のオープン ソース ソリューションの代わりに推奨されます。
前提条件
以下の前提条件が必要です。
- Azure Red Hat OpenShift クラスター (詳細については「Azure Red Hat OpenShift クラスターを作成する」を参照してください)。
- Azure CLI (ログイン済み)
- Helm 3.x CLI
環境変数を設定する
この手順全体で使用される、次の変数を設定します。
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 ドライバーをインストールする
ARO プロジェクトを作成します。CSI ドライバーをこのプロジェクトに展開します。
oc new-project k8s-secrets-store-csi
CSI ドライバーの実行を許可するように SecurityContextConstraints を設定します (それ以外の場合、CSI ドライバーはポッドを作成できません)。
oc adm policy add-scc-to-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver
Helm リポジトリにシークレット ストア CSI ドライバーを追加します。
helm repo add secrets-store-csi-driver \ https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
Helm リポジトリを更新します。
helm repo update
シークレット ストア 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"
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 プロバイダーを展開する
Azure Helm リポジトリを追加します。
helm repo add csi-secrets-store-provider-azure \ https://azure.github.io/secrets-store-csi-driver-provider-azure/charts
ローカル Helm リポジトリを更新します。
helm repo update
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
CSI ドライバーの実行を許可するように SecurityContextConstraints を設定します。
oc adm policy add-scc-to-user privileged \ system:serviceaccount:k8s-secrets-store-csi:csi-secrets-store-provider-azure
キー コンテナーとシークレットを作成する
アプリケーションの名前空間を作成します。
oc new-project my-application
ARO を含むリソース グループに Azure キー コンテナーを作成します。
az keyvault create -n ${KEYVAULT_NAME} \ -g ${KEYVAULT_RESOURCE_GROUP} \ --location ${KEYVAULT_LOCATION}
キー コンテナーにシークレットを作成します。
az keyvault secret set \ --vault-name ${KEYVAULT_NAME} \ --name secret1 --value "Hello"
キー コンテナー用のサービス プリンシパルを作成します。
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)"
サービス プリンシパルのアクセス ポリシーを設定します。
az keyvault set-policy -n ${KEYVAULT_NAME} \ --secret-permissions get \ --spn ${SERVICE_PRINCIPAL_CLIENT_ID}
キー コンテナーへのアクセスに使用する 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 ドライバーを使用するアプリケーションを展開する
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
前の手順で作成した
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
シークレットがマウントされていることを確認します。
kubectl exec busybox-secrets-store-inline -- ls /mnt/secrets-store/
出力は、次と一致する必要があります。
secret1
シークレットを出力します。
kubectl exec busybox-secrets-store-inline \ -- cat /mnt/secrets-store/secret1
出力は、次と一致する必要があります。
Hello
クリーンアップ
Key Vault プロバイダーと CSI ドライバーをアンインストールします。
Key Vault プロバイダーをアンインストールする
Helm グラフをアンインストールします。
helm uninstall -n k8s-secrets-store-csi azure-csi-provider
アプリを削除します。
oc delete project my-application
Azure キー コンテナーを削除します。
az keyvault delete -n ${KEYVAULT_NAME}
サービス プリンシパルを削除します。
az ad sp delete --id ${SERVICE_PRINCIPAL_CLIENT_ID}
Kubernetes シークレット ストア CSI ドライバーをアンインストールする
シークレット ストア CSI ドライバーを削除します。
helm uninstall -n k8s-secrets-store-csi csi-secrets-store oc delete project k8s-secrets-store-csi
SecurityContextConstraints を削除します。
oc adm policy remove-scc-from-user privileged \ system:serviceaccount:k8s-secrets-store-csi:secrets-store-csi-driver