シークレット ストア CSI ドライバーの Azure Key Vault プロバイダーを使用すると、Azure Key Vault インスタンスに格納されているシークレット コンテンツを取得し、シークレット ストア CSI ドライバーを使用してそれらを Kubernetes ポッドにマウントできます。 この記事では、Azure Red Hat OpenShift でシークレット ストア CSI ドライバーに Azure Key Vault プロバイダーを使用する方法について説明します。
注
この記事で提示するオープン ソース ソリューションの代わりに、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"
キー コンテナー用のサービス プリンシパルを作成します。
注
サービス プリンシパルの作成時にエラーが発生した場合は、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