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 がインストールされている。

手順

  1. 次のコマンドを実行して、HashiCorp Helm リポジトリーを追加します。

    $ helm repo add hashicorp https://helm.releases.hashicorp.com
  2. 次のコマンドを実行して、すべてのリポジトリーを更新し、Helm が最新バージョンを認識するようにします。

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

    1. 次のコマンドを実行して、Vault の新しいプロジェクトを作成します。

      $ oc new-project vault
    2. 次のコマンドを実行して、Pod セキュリティーアドミッション用の vault namespace にラベルを付けます。

      $ 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
    3. 次のコマンドを実行して、vault サービスアカウントに特権アクセスを許可します。

      $ oc adm policy add-scc-to-user privileged -z vault -n vault
    4. 次のコマンドを実行して、vault-csi-provider サービスアカウントに特権アクセスを許可します。

      $ oc adm policy add-scc-to-user privileged -z vault-csi-provider -n vault
    5. 以下のコマンドを実行して 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"
    6. 次のコマンドを実行して、vault-csi-driver デーモンセットにパッチを適用し、securityContextprivileged に設定します。

      $ oc patch daemonset -n vault vault-csi-provider --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/securityContext", "value": {"privileged": true} }]'
    7. 次のコマンドを実行して、vault-csi-provider Pod が正常に起動したことを確認します。

      $ 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

  4. 必要なシークレットを保存するように HashiCorp Vault を設定します。

    1. 次のコマンドを実行してシークレットを作成します。

      $ oc exec vault-0 --namespace=vault -- vault kv put secret/example1 testSecret1=my-secret-value
    2. 次のコマンドを実行して、シークレットがパス 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

  5. Kubernetes 認証を使用するように Vault を設定します。

    1. 次のコマンドを実行して、Kubernetes 認証方法を有効にします。

      $ oc exec vault-0 --namespace=vault -- vault auth enable kubernetes

      出力例

      Success! Enabled kubernetes auth method at: kubernetes/

    2. Kubernetes 認証メソッドを設定します。

      1. 次のコマンドを実行して、トークンレビューアーを環境変数として設定します。

        $ TOKEN_REVIEWER_JWT="$(oc exec vault-0 --namespace=vault -- cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
      2. 次のコマンドを実行して、Kubernetes サービスの IP アドレスを環境変数として設定します。

        $ KUBERNETES_SERVICE_IP="$(oc get svc kubernetes --namespace=default -o go-template="{{ .spec.clusterIP }}")"
      3. 次のコマンドを実行して、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

    3. 次のコマンドを実行して、アプリケーションのポリシーを作成します。

      $ oc exec -i vault-0 --namespace=vault -- vault policy write csi -<<EOF
        path "secret/data/*" {
        capabilities = ["read"]
        }
        EOF

      出力例

      Success! Uploaded policy: csi

    4. 次のコマンドを実行して、アプリケーションにアクセスするための認証ロールを作成します。

      $ 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

  6. シークレットプロバイダークラスを作成して、シークレットストアプロバイダーを定義します。

    1. SecretProviderClass オブジェクトを定義する YAML ファイルを作成します。

      secret-provider-class-vault.yaml の例

      apiVersion: secrets-store.csi.x-k8s.io/v1
      kind: SecretProviderClass
      metadata:
        name: my-vault-provider                   
      1
      
        namespace: my-namespace                   
      2
      
      spec:
        provider: vault                           
      3
      
        parameters:                               
      4
      
          roleName: "csi"
          vaultAddress: "http://vault.vault:8200"
          objects:  |
            - secretPath: "secret/data/example1"
              objectName: "testSecret1"
              secretKey: "testSecret1"

      1
      シークレットプロバイダークラスの名前を指定します。
      2
      シークレットプロバイダークラスの namespace を指定します。
      3
      プロバイダーは vault として指定します。
      4
      プロバイダー固有の設定パラメーターを指定します。
    2. 次のコマンドを実行して SecretProviderClass オブジェクトを作成します。

      $ oc create -f secret-provider-class-vault.yaml
  7. このシークレットプロバイダークラスを使用するデプロイメントを作成します。

    1. Deployment オブジェクトを定義する YAML ファイルを作成します。

      deployment.yaml の例

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: busybox-deployment                                    
      1
      
        namespace: my-namespace                                     
      2
      
        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

      1
      デプロイメントの名前を指定します。
      2
      デプロイメントの namespace を指定します。これは、シークレットプロバイダークラスと同じ namespace である必要があります。
      3
      シークレットプロバイダークラスの名前を指定します。
    2. 次のコマンドを実行して、Deployment オブジェクトを作成します。

      $ oc create -f deployment.yaml

検証

  1. 次のコマンドを実行して、すべての vault Pod が正常に実行されていることを確認します。

    $ 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

  2. 次のコマンドを実行して、すべての secrets-store-csi-driver Pod が実行されていることを確認します。

    $ 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

    1. Pod ボリュームマウント内の HashiCorp Vault からシークレットにアクセスできることを確認します。
  3. 次のコマンドを実行して、Pod マウント内のシークレットをリスト表示します。

    $ oc exec busybox-deployment-<hash> -n my-namespace -- ls /mnt/secrets-store/

    出力例

    testSecret1

  4. 次のコマンドを実行して、Pod マウント内のシークレットを表示します。

    $ oc exec busybox-deployment-<hash> -n my-namespace -- cat /mnt/secrets-store/testSecret1

    出力例

    my-secret-value

Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

Red Hat ドキュメントについて

Legal Notice

Theme

© 2026 Red Hat
トップに戻る