Podに環境変数でシークレットを渡すのは簡単ですが、更新反映や永続化の観点でリスクが残ります。Vault CSI DriverはSecrets Store CSI DriverとVault Providerを用いて、Pod内のtmpfsにシークレットをファイルとして安全にマウントします。
本稿では、実務で迷いがちな同期の是非、ローテーション、権限設計を押さえつつ、オペレーション系の試験で頻出の論点を短時間で復習できるようにまとめます。挙動はVault公式ドキュメントに基づく安定動作を前提に説明します。
Vault CSI Driverを使うと、Podにシークレットをファイルとしてマウントできます。ファイルはノード上のtmpfsに置かれ、Pod終了とともに消去されるため、Kubernetesのetcdに平文を残さずに済むのが特徴です。
Secrets Store CSI Driverの「同期」機能を併用すると、必要に応じてKubernetes Secretへ複製できます。ただし、この場合はetcdに平文が残るため、運用ポリシーに応じて使い分けが必要です。
Secrets Store CSI DriverのNodeプラグインが、Vault Providerを介してVaultへアクセスします。PodはCSIボリュームを介してファイルを参照するだけで、直接Vault APIを呼びません。認証は通常、PodのServiceAccountのJWTを用いたVaultのKubernetes認証で行います。
以下は代表的なデータフローです。
Vault CSI DriverによるPod内シークレット投入フロー
Secrets Store CSI Driver本体とVault Providerをクラスターに導入します。VaultサーバーはKubernetesから到達可能で、Kubernetes認証メソッドが有効化済みである必要があります。Vault側では、PodのServiceAccountとVaultロールの対応付け、および必要最小限のポリシーを作成します。
ネットワーク的には、各ノードからVaultアドレスへのアウトバウンド通信が必要です。証明書の検証に使うCAは、Vault Providerの設定で渡すか、ノードの信頼ストアに配置します。
SecretProviderClassでVaultへの到達情報、認証ロール、取得対象のシークレットを記述します。Pod側ではCSIボリュームをマウントし、必要に応じてKubernetes Secretへの同期を有効化します(同期を有効にするとetcdに保存される点に注意)。
以下は代表的な設定例です。実際のパラメータ名や詳細はVault Providerのバージョンにより差分があるため、導入時は公式ドキュメントの該当バージョンを参照してください。
SecretProviderClassとPodの最小構成例(YAML)
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: vault-db-creds
namespace: app
spec:
provider: vault
parameters:
vaultAddress: "https://vault.example.com"
roleName: "app-readonly"
# VaultのKubernetes認証メソッドのマウントパス(環境に合わせて調整)
# vaultKubernetesMountPath: "kubernetes"
# Vault Enterpriseで名前空間を使う場合
# namespace: "platform/app"
# 取得対象(objectNameはファイル名になる)
objects: |
- objectName: "db-username"
secretPath: "database/creds/readonly"
secretKey: "username"
- objectName: "db-password"
secretPath: "database/creds/readonly"
secretKey: "password"
# 同期が必要な場合のみ設定(Kubernetes Secretに複製される)
secretObjects:
- secretName: db-creds
type: Opaque
data:
- objectName: "db-username"
key: username
- objectName: "db-password"
key: password
---
apiVersion: v1
kind: Pod
metadata:
name: app
namespace: app
spec:
serviceAccountName: app-sa
containers:
- name: web
image: ghcr.io/example/app:1.0
volumeMounts:
- name: secrets-store
mountPath: "/mnt/secrets"
readOnly: true
# K8s Secretへ同期した場合のみ、環境変数で参照可能
envFrom:
- secretRef:
name: db-creds
volumes:
- name: secrets-store
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "vault-db-creds"ローテーションはドライバの更新サイクルとVault側の有効期限・ロール設定の両輪で成立します。Podを落とさずファイル内容を更新できる一方、アプリ側がファイル再読込を実装していないと反映されません。シグナルによる再読込やinotifyでの監視など、アプリ特性に合わせた再読込戦略を用意しましょう。
Kubernetes Secretへの同期はユースケース次第です。ConfigMap/Secretと同じ操作性を得られますが、etcdに平文が保存されます。クラスターの暗号化設定、RBAC、監査ログなどを合わせて設計しましょう。
| 方式 | デリバリー形態 | etcdへの平文保存 | ローテーション反映 |
|---|---|---|---|
| Vault CSI Driver(同期なし) | Pod内ファイル(tmpfs) | なし | ドライバ更新+アプリ再読込 |
| Vault CSI Driver(同期あり) | Pod内ファイル+K8s Secret | あり | 同期でSecret更新(アプリ側は参照方法に依存) |
| Vault Agent Injector | Sidecarがファイル/テンプレート出力 | なし(設定次第) | Agentのテンプレート再描画で反映 |
| Kubernetes Secretのみ | 環境変数/volume | あり | Secret更新だがPod再起動が発生しがち |
オペレーション系の試験では、シークレットがどこに保存され、どの権限で誰が取得でき、どう更新されるかが頻出です。特に「同期の是非」「環境変数ではなくファイル提供」「ServiceAccountとVaultロールのひも付け」を正しく選択できるかがポイントです。
トラブル事例としては、ServiceAccountとVaultロールのネームスペース不一致、Vaultのポリシー不足、VaultのCA未設定によるTLS検証失敗、アプリがファイル更新を再読込しない、などがあります。
Ops
問題 1
運用チームはVaultの動的DB資格情報をKubernetesのアプリPodへ安全に配布したい。Pod再起動なくローテーションを反映し、etcdに平文を残さないことが必須である。最も適切な構成はどれか。
正解: A
要件はPod再起動なしのローテーション反映とetcdへ平文を残さないこと。同期なしのVault CSI Driverはtmpfs上のファイル提供でetcdへ保存しないため適合する。BとDはKubernetes Secretに複製される前提となり要件に反する。CはVaultを使わず、かつetcdに平文が残る。
環境変数で直接シークレットを渡せますか?
Vault CSI Driver自体はファイルとして提供します。環境変数で使いたい場合はKubernetes Secretへの同期を有効化し、envFromやvalueFromで参照します。ただし、この場合はetcdに平文が保存される点を理解したうえで採用してください。
シークレット更新はPodを再起動しないと反映されませんか?
ドライバのローテーション機能が有効な場合、ファイル内容はPodを落とさず更新されます。ただし、アプリケーションがファイルを再読込できる必要があります。SIGHUPでの再読込やinotify等の監視を実装してください。
複数ネームスペースから同じVaultシークレットを参照できますか?
可能です。ただし、各ネームスペースのServiceAccountごとに対応するVaultロールとポリシーを用意し、最小権限でアクセスを許可してください。Vault Enterpriseの名前空間を利用している場合は、SecretProviderClassの設定でnamespaceを正しく指定します。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Vault のコア概念を最短距離で理解する:Secret / Auth / Policy / Token
HashiCorp Vault Associate レベルで押さえるべきコア概念(Secret Engine、Auth ...
Vault Operations Professional: 上位資格としての範囲を実務目線で押さえる
HashiCorp Vault Operations Professional(Ops Pro)の出題範囲を、Assoc...
Vaultにおけるパスベースのルーティング: マウントとAPI構造を読み解く
HashiCorp Vaultのパスベースのルーティングを、マウント設計とAPIパスの観点から整理。Associateレ...
Vault Tokens の基礎: 認証の起点となる概念
HashiCorp Vault におけるトークンの役割、種類、ライフサイクル、ポリシー連携、設計パターンをAssocia...
Vault のトークン種類を正しく使い分ける: service / batch 実践
HashiCorp Vault Associate 向けの試験対策と実務運用を両立させた、service トークンと b...