Kubernetes クラスタでの権限付与を最小化しつつ、自動化基盤やワークロードに短命な認証情報を配布したい――この要件に対し、Vault の Kubernetes シークレットエンジンは、Kubernetes の TokenRequest API を呼び出して Service Account のトークンを動的に払い出します。
本稿では、公式ドキュメントに基づく安定挙動を前提に、導入ステップ、RBAC 設計、運用パターン、試験で狙われやすい差異(Kubernetes 認証方式との違い)を具体的に解説します。
Vault の Kubernetes シークレットエンジンは、既存の Service Account(SA)に対して Kubernetes API の TokenRequest サブリソースを呼び出し、短い有効期限の JWT を取得してクライアントに返します。Vault はこの発行処理に必要な Kubernetes への接続情報と、どの SA/Namespace への発行を許可するかをロールで制御します。
この方式は、Kubernetes 側で署名・検証される標準の SA トークンを用いるため互換性が高く、かつ TTL による自然失効を前提とする運用にフィットします(一般に早期の強制失効は不可。短寿命・頻繁な再取得が前提)。
動的発行の全体像
Vault からトークンを取得する最小例(概念)
## 概念的な例(実際のパス名やフィールドはバージョンで差異あり。公式ドキュメントで要確認)
# 役割名 my-role で SA トークンを払い出し
vault read kubernetes/issue/my-role \
service_account_name=my-app \
namespace=apps \
ttl=15m \
audiences=https://kubernetes.default.svc
# 出力例(概略)
# token : eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
# expiration : 2026-04-19T12:34:56Z
# namespace : apps
# service_account: my-appVault が TokenRequest を実行できるように、Kubernetes 側で serviceaccounts/token の create 権限を付与します。広範な権限は避け、原則は Namespace 単位・必要最小限の Service Account に絞るロール設計を推奨します。
Vault のシークレットエンジン側では、Kubernetes API サーバーのエンドポイント、CA 証明書、そして前述の RBAC が付与された Service Account トークン(Vault が Kubernetes に接続する際に用いる)を設定します。
RBAC と Vault シークレットエンジンの接続設定(例)
# Kubernetes 側(最小権限の例: apps Namespace 内の TokenRequest のみ許可)
apiVersion: v1
kind: ServiceAccount
metadata:
name: vault-k8s-se
namespace: vault
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: tokenrequest-minimal
namespace: apps
rules:
- apiGroups: [""]
resources: ["serviceaccounts/token"]
verbs: ["create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: vault-k8s-se-binding
namespace: apps
subjects:
- kind: ServiceAccount
name: vault-k8s-se
namespace: vault
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: tokenrequest-minimal
# Vault 側(概念例。実際のフィールド名は公式ドキュメントを確認)
# Kubernetes シークレットエンジン有効化
vault secrets enable kubernetes
# 接続設定(in-cluster を想定)
vault write kubernetes/config \
kubernetes_host="https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT}" \
kubernetes_ca_cert=@/var/run/secrets/kubernetes.io/serviceaccount/ca.crt \
token=@/var/run/secrets/kubernetes.io/serviceaccount/token発行対象をロールで定義します。ロールでは、許可する Namespace と Service Account、許可 Audience、TTL の上限などを縛ります。これにより、Vault 側の権限分離と最小権限を維持できます。
発行時はロール名を指定して読み取り(または書き込み)操作を実行します。返却されるトークンは Kubernetes で署名・検証される JWT で、Kubernetes 側の設定により TTL が短縮される場合があります。
ロール作成と発行(概念コマンド例)
# ロール作成(概念例。ご利用の Vault 版のロールパラメータ名は公式ドキュメントで確認)
vault write kubernetes/roles/ci-deployer \
allowed_namespaces=apps,staging \
allowed_service_accounts=deployer \
allowed_audiences=https://kubernetes.default.svc \
ttl=15m \
max_ttl=1h
# 発行(ロールに許可された SA/Namespace の組み合わせで実行)
vault read kubernetes/issue/ci-deployer \
service_account_name=deployer \
namespace=apps \
audiences=https://kubernetes.default.svc \
ttl=10m
# 返却値(概略): token, expiration, namespace, service_account などワークロードにトークンを配る実装では、Vault Agent(サイドカー)で定期的に再取得し、ファイルに書き出してプロセスに読み込ませる方法が現実的です。CI/CD では、ジョブ開始時に 1 回だけ取得し、TTL をジョブ時間内に収まるよう設計します。
可観測性の観点では、リース期限の監視、発行失敗のメトリクス化、監査ログの収集を最低限そろえます。早期失効が不要でも、短 TTL と自動再取得の検証は定期的に行いましょう。
Vault Agent(サイドカー)でのテンプレート出力例
# Agent 設定(概念): kubernetes/issue/ci-deployer から取得しファイル出力
exit_after_auth = false
pid_file = "/tmp/vault-agent.pid"
auth {
method = "approle" # 例: AppRole で Agent を認証
mount_path = "auth/approle"
config = {
role_id_file_path = "/vault/secrets/role_id"
secret_id_file_path = "/vault/secrets/secret_id"
}
}
template {
destination = "/work/token"
contents = <<EOF
{{ with secret "kubernetes/issue/ci-deployer" (printf "service_account_name=%s namespace=%s ttl=%s" "deployer" "apps" "10m") }}{{ .Data.token }}{{ end }}
EOF
}
# ワークロードは /work/token を読み、期限前に Agent が置換する設計Vault の Kubernetes 認証方式(auth method)は「Pod が Vault にログインするため」の仕組みです。一方、本稿の Kubernetes シークレットエンジンは「Vault が Kubernetes の認証情報(SA トークン)を払い出す」仕組みです。方向の違いを取り違えると設計ミスになります。
また、Kubernetes の TokenRequest で払い出されたトークンは時間で自然失効します。Vault のリース取り消しは Vault 内部の管理にすぎず、Kubernetes 側で発行済みトークンの強制失効は一般にできません。したがって短 TTL と自動ローテーションが前提運用です。
| 機能 | 想定ユースケース | 認証の向き | 主な利点 |
|---|---|---|---|
| Kubernetes 認証方式(auth) | Pod が Vault にログインして Vault 内のシークレットにアクセス | Kubernetes → Vault | Pod ID によるきめ細かいアクセス制御 |
| Kubernetes シークレットエンジン(本稿) | Kubernetes の SA トークンを動的に取得(CI/CD・自動化基盤向け) | Vault → Kubernetes | 短命トークン、TokenRequest による標準互換 |
| 静的 Service Account トークン | 長期固定の運用・手動配布 | SA → クライアント(直接) | シンプルで依存が少ない |
試験で押さえる最小ポリシー例(Vault 側で発行ロールの読み取り許可)
# Vault ポリシー(例): 指定ロールの発行のみ許可
auth "*" {
# 認証方法は別途
}
path "kubernetes/issue/ci-deployer" {
capabilities = ["read"]
}
# 実務では対象ロールごとに最小権限で切り分けるTokenRequest の RBAC 不足が最頻出です。serviceaccounts/token の create が対象 Namespace/SA に付いているか、ResourceName で過度に縛っていないか確認します。TTL が期待より短い場合は Kubernetes 側の上限設定を疑います。
監査では Vault の audit デバイスを有効化し、誰がどのロールでいつ発行したかを追跡可能にします。Kubernetes 側の API 監査と突合せができると尚良いです。
監査・確認の実用コマンド
# リース確認(Vault 側)
vault list sys/leases/lookup/kubernetes
# 直近の発行リクエスト(Vault 監査ログから grep)
# 例: file 監査デバイスを /var/log/vault_audit.log に設定済みとする
grep 'kubernetes/issue/ci-deployer' /var/log/vault_audit.log | tail -n 20
# Kubernetes 側の権限テスト(権限レビュー)
kubectl auth can-i create serviceaccounts/token --as=system:serviceaccount:vault:vault-k8s-se -n appsOps
問題 1
Vault の Kubernetes シークレットエンジンで動的に Service Account トークンを発行する設計について正しい説明はどれか。
正解: A
シークレットエンジンは TokenRequest を使って短命な SA トークンを発行する。一般に発行済みトークンの早期失効はできないため短 TTL と自動ローテーション設計が前提。Kubernetes 認証方式は Pod→Vault のログイン用途であり別物。TokenRequest の実行には serviceaccounts/token の create 権限が必要。TTL は Kubernetes 側の上限により短縮され得る。
早期失効はどうやって実現しますか?
TokenRequest で発行された SA トークンは時間で自然失効する設計で、一般に早期取り消しはできません。短 TTL・頻繁な再取得・ロール/権限の粒度を細かくする方針を取り、万一の際は該当 Service Account の権限縮小や削除で影響範囲を抑えます。
TTL を長めに設定しても有効期限が短くなります。
Kubernetes クラスタ側の TokenRequest 上限(expirationSeconds の上限)により切り詰められています。Vault 側の ttl/max_ttl を長くしても超えられません。クラスタ設定の見直し、または運用要件に合わせてジョブ時間側を調整してください。
Kubernetes 認証方式とシークレットエンジンは併用できますか?
はい。ワークロードの Vault へのログイン(Kubernetes 認証方式)と、別のワークロードや CI/CD が Kubernetes 用の短命資格情報を取得(Kubernetes シークレットエンジン)という形で併用されます。役割と権限を分離し、ポリシーで相互干渉を避けて設計してください。
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...