2.8.3.5. HashiCorp Vault からのシークレットのマウント
Secrets Store CSI Driver Operator を使用して、HashiCorp Vault から OpenShift Container Platform の Container Storage Interface (CSI) ボリュームにシークレットをマウントできます。
Secrets Store CSI Driver Operator を使用して HashiCorp Vault からシークレットをマウントする機能は、次のクラウドプロバイダーでテストされています。
- Amazon Web Services (AWS)
- Microsoft Azure
他のクラウドプロバイダーも機能する可能性がありますが、まだテストされていません。今後、別のクラウドプロバイダーが追加でテストされる可能性があります。
前提条件
-
cluster-adminロールを持つユーザーとしてクラスターにアクセスできる。 - Secrets Store CSI Driver Operator がインストールされている。手順は、「Secrets Store CSI ドライバーのインストール」を参照してください。
- Helm がインストールされている。
手順
次のコマンドを実行して、HashiCorp Helm リポジトリーを追加します。
$ helm repo add hashicorp https://helm.releases.hashicorp.com次のコマンドを実行して、すべてのリポジトリーを更新し、Helm が最新バージョンを認識するようにします。
$ helm repo updateHashiCorp Vault プロバイダーをインストールします。
次のコマンドを実行して、Vault の新しいプロジェクトを作成します。
$ oc new-project vault次のコマンドを実行して、Pod セキュリティーアドミッション用の
vaultnamespace にラベルを付けます。$ oc label ns vault security.openshift.io/scc.podSecurityLabelSync=false pod-security.kubernetes.io/enforce=privileged pod-security.kubernetes.io/audit=privileged pod-security.kubernetes.io/warn=privileged --overwrite次のコマンドを実行して、
vaultサービスアカウントに特権アクセスを許可します。$ oc adm policy add-scc-to-user privileged -z vault -n vault次のコマンドを実行して、
vault-csi-providerサービスアカウントに特権アクセスを許可します。$ oc adm policy add-scc-to-user privileged -z vault-csi-provider -n vault以下のコマンドを実行して HashiCorp Vault をデプロイします。
$ helm install vault hashicorp/vault --namespace=vault \ --set "server.dev.enabled=true" \ --set "injector.enabled=false" \ --set "csi.enabled=true" \ --set "global.openshift=true" \ --set "injector.agentImage.repository=docker.io/hashicorp/vault" \ --set "server.image.repository=docker.io/hashicorp/vault" \ --set "csi.image.repository=docker.io/hashicorp/vault-csi-provider" \ --set "csi.agent.image.repository=docker.io/hashicorp/vault" \ --set "csi.daemonSet.providersDir=/var/run/secrets-store-csi-providers"次のコマンドを実行して、
vault-csi-driverデーモンセットにパッチを適用し、securityContextをprivilegedに設定します。$ oc patch daemonset -n vault vault-csi-provider --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/securityContext", "value": {"privileged": true} }]'次のコマンドを実行して、
vault-csi-providerPod が正常に起動したことを確認します。$ oc get pods -n vault出力例
NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 24m vault-csi-provider-87rgw 1/2 Running 0 5s vault-csi-provider-bd6hp 1/2 Running 0 4s vault-csi-provider-smlv7 1/2 Running 0 5s
必要なシークレットを保存するように HashiCorp Vault を設定します。
次のコマンドを実行してシークレットを作成します。
$ oc exec vault-0 --namespace=vault -- vault kv put secret/example1 testSecret1=my-secret-value次のコマンドを実行して、シークレットがパス
secret/example1で読み取り可能であることを確認します。$ oc exec vault-0 --namespace=vault -- vault kv get secret/example1出力例
= Secret Path = secret/data/example1 ======= Metadata ======= Key Value --- ----- created_time 2024-04-05T07:05:16.713911211Z custom_metadata <nil> deletion_time n/a destroyed false version 1 === Data === Key Value --- ----- testSecret1 my-secret-value
Kubernetes 認証を使用するように Vault を設定します。
次のコマンドを実行して、Kubernetes 認証方法を有効にします。
$ oc exec vault-0 --namespace=vault -- vault auth enable kubernetes出力例
Success! Enabled kubernetes auth method at: kubernetes/Kubernetes 認証メソッドを設定します。
次のコマンドを実行して、トークンレビューアーを環境変数として設定します。
$ TOKEN_REVIEWER_JWT="$(oc exec vault-0 --namespace=vault -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)"次のコマンドを実行して、Kubernetes サービスの IP アドレスを環境変数として設定します。
$ KUBERNETES_SERVICE_IP="$(oc get svc kubernetes --namespace=default -o go-template="{{ .spec.clusterIP }}")"次のコマンドを実行して、Kubernetes auth メソッドを更新します。
$ oc exec -i vault-0 --namespace=vault -- vault write auth/kubernetes/config \ issuer="https://kubernetes.default.svc.cluster.local" \ token_reviewer_jwt="${TOKEN_REVIEWER_JWT}" \ kubernetes_host="https://${KUBERNETES_SERVICE_IP}:443" \ kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt出力例
Success! Data written to: auth/kubernetes/config
次のコマンドを実行して、アプリケーションのポリシーを作成します。
$ oc exec -i vault-0 --namespace=vault -- vault policy write csi -<<EOF path "secret/data/*" { capabilities = ["read"] } EOF出力例
Success! Uploaded policy: csi次のコマンドを実行して、アプリケーションにアクセスするための認証ロールを作成します。
$ oc exec -i vault-0 --namespace=vault -- vault write auth/kubernetes/role/csi \ bound_service_account_names=default \ bound_service_account_namespaces=default,test-ns,negative-test-ns,my-namespace \ policies=csi \ ttl=20m出力例
Success! Data written to: auth/kubernetes/role/csi
シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。
SecretProviderClassオブジェクトを定義する YAML ファイルを作成します。secret-provider-class-vault.yamlの例apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: my-vault-provider1 namespace: my-namespace2 spec: provider: vault3 parameters:4 roleName: "csi" vaultAddress: "http://vault.vault:8200" objects: | - secretPath: "secret/data/example1" objectName: "testSecret1" secretKey: "testSecret1"次のコマンドを実行して
SecretProviderClassオブジェクトを作成します。$ oc create -f secret-provider-class-vault.yaml
このシークレットプロバイダークラスを使用するデプロイメントを作成します。
Deploymentオブジェクトを定義する YAML ファイルを作成します。deployment.yamlの例apiVersion: apps/v1 kind: Deployment metadata: name: busybox-deployment1 namespace: my-namespace2 labels: app: busybox spec: replicas: 1 selector: matchLabels: app: busybox template: metadata: labels: app: busybox spec: terminationGracePeriodSeconds: 0 containers: - image: registry.k8s.io/e2e-test-images/busybox:1.29-4 name: busybox imagePullPolicy: IfNotPresent 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: "my-vault-provider"3 次のコマンドを実行して、
Deploymentオブジェクトを作成します。$ oc create -f deployment.yaml
検証
次のコマンドを実行して、すべての
vaultPod が正常に実行されていることを確認します。$ oc get pods -n vault出力例
NAME READY STATUS RESTARTS AGE vault-0 1/1 Running 0 43m vault-csi-provider-87rgw 2/2 Running 0 19m vault-csi-provider-bd6hp 2/2 Running 0 19m vault-csi-provider-smlv7 2/2 Running 0 19m次のコマンドを実行して、すべての
secrets-store-csi-driverPod が実行されていることを確認します。$ oc get pods -n openshift-cluster-csi-drivers | grep -E "secrets"出力例
secrets-store-csi-driver-node-46d2g 3/3 Running 0 45m secrets-store-csi-driver-node-d2jjn 3/3 Running 0 45m secrets-store-csi-driver-node-drmt4 3/3 Running 0 45m secrets-store-csi-driver-node-j2wlt 3/3 Running 0 45m secrets-store-csi-driver-node-v9xv4 3/3 Running 0 45m secrets-store-csi-driver-node-vlz28 3/3 Running 0 45m secrets-store-csi-driver-operator-84bd699478-fpxrw 1/1 Running 0 47m- Pod ボリュームマウント内の HashiCorp Vault からシークレットにアクセスできることを確認します。
次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。
$ oc exec busybox-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/出力例
testSecret1次のコマンドを実行して、Pod マウント内のシークレットを表示します。
$ oc exec busybox-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret1出力例
my-secret-value