Dynamic Secrets は「要求時に発行され、期限で自動失効する」短命クレデンシャル。漏えいリスクと運用コストを同時に下げられるのが最大の利点です。
本稿は Vault Associate / Operations レベルで問われやすい概念と運用パターンに絞り、CLI/API の手順と比較表、ASCII 図で全体像をクリアにします。
Vault の Dynamic Secrets は、リクエストごとに固有の資格情報をバックエンドで即時生成し、TTL に達すると自動で無効化または削除されます。これにより、長期共有パスワードのように回収し忘れが残らず、漏えい時の被害範囲を最小化できます。
重要な点は、発行と失効が Vault の Lease 管理下にあることです。発行時に lease_id と lease_duration が付与され、クライアントは必要に応じて更新や明示的な失効が可能です。監査ログとも親和性が高く、誰がいつどの権限を使ったかを追跡できます。
| 項目 | Dynamic Secrets | 長期静的シークレット | 手動ローテーション静的 |
|---|---|---|---|
| 発行方式 | 要求時に都度発行 | 事前配布・共有 | 定期に手作業/ジョブで更新 |
| 有効期間 | 短命(TTL管理)・自動失効 | 無期限/長期 | 中期(更新サイクル次第) |
| 漏えい時の影響 | 限定的(期限切れで無効化) | 広範囲(無効化まで存続) | 更新タイミング次第 |
| 監査容易性 | 高い(各発行にトレース) | 低い(共有で不明瞭) | 中(更新ログのみ) |
| 運用コスト | 初期設定後は低 | 管理負荷高/配布煩雑 | 更新ジョブや調整が必要 |
要求時発行と自動失効の流れ
最小構成の例 (Database Secrets Engine / Postgres)
vault secrets enable database
vault write database/config/my-postgres \
plugin_name=postgresql-database-plugin \
allowed_roles=readonly \
connection_url="postgresql://{{username}}:{{password}}@db.example.com:5432/postgres?sslmode=verify-full" \
username="vault_admin" \
password="s3cr3t"
vault write database/roles/readonly \
db_name=my-postgres \
creation_statements="CREATE ROLE \"{{name}}\" WITH LOGIN PASSWORD '{{password}}' VALID UNTIL '{{expiration}}'; GRANT SELECT ON ALL TABLES IN SCHEMA public TO \"{{name}}\";" \
default_ttl=1h \
max_ttl=24h
# 短命クレデンシャルの取得
vault read database/creds/readonly
# 出力例: username, password, lease_id, lease_duration, renewable などDynamic Secret は lease_id と lease_duration を伴います。lease_duration は発行時の実効 TTL で、必要に応じて lease renew が可能です。ただし、更新はロールに定義された max_ttl およびシステムの最大 TTL を超えられません。
renew が不可のケースは、renewable=false のリー ス、上限を超える延長、またはバックエンド仕様上の制約です。期限切れに達すると Vault は対象システム側の資格情報を無効化または削除します。トークンの TTL とシークレットの TTL は別物で、どちらかが先に失効すると取得・更新に影響します。
| 操作 | 対象 | 効果 | 注意点 |
|---|---|---|---|
| lease renew | 特定の lease_id | TTL を延長(可能な範囲で) | renewable=false や上限超過では失敗 |
| lease revoke | 特定の lease_id | 即時失効 | 接続中アプリは再取得が必要 |
| lease revoke -prefix | パス配下の全リース | 一括失効 | 影響範囲が広いので計画的に実施 |
TTL と更新・失効のタイムライン
Lease 情報の確認と更新・取り消し
# JSON 出力で lease を確認
vault read -format=json database/creds/readonly | jq '.lease_id, .lease_duration, .renewable'
# 更新(延長)
vault lease renew <LEASE_ID>
# 即時取り消し
vault lease revoke <LEASE_ID>
# パス配下を一括取り消し
vault lease revoke -prefix database/creds/readonlyクラウド向けエンジンは、短命の一時クレデンシャルを払い出すことで、長期キーの配布/回収問題を解消します。AWS では STS による一時認証情報を推奨し、IAM ユーザー生成は例外用途に留めるのが一般的です。Azure/GCP も同様に短命トークンや一時鍵の発行が中心です。
試験観点では、credential_type の選択、TTL/Max TTL の整合、ロールの権限境界、失効時の動作(STS の期限切れ、鍵の削除など)が問われやすいポイントです。
| エンジン/モード | 種別 | 典型 TTL | 失効メカニズム |
|---|---|---|---|
| AWS STS | 一時クレデンシャル | 15分〜1時間 | 期限到達で自動無効 |
| AWS IAM User | 長命ユーザー | 固定(削除まで) | revoke でユーザーやキー削除 |
| Azure (SP) | 一時シークレット/割当 | 分〜時間 | シークレット失効/割当解除 |
| GCP (roleset) | 一時鍵/トークン | 分〜時間 | 鍵の失効/削除 |
Vault 経由でのクラウド一時認証情報払い出し
AWS エンジンで STS を使う例
vault secrets enable aws
vault write aws/config/root \
access_key=AKIA... \
secret_key=... \
region=ap-northeast-1
vault write aws/roles/readonly-sts \
credential_type=sts \
role_arn=arn:aws:iam::123456789012:role/ReadOnlyRole \
default_sts_ttl=900 \
max_sts_ttl=3600
vault read aws/sts/readonly-sts # AccessKeyId/SecretAccessKey/SessionToken と TTL を取得アプリに Vault クライアント機能を直接組み込むか、Vault Agent を sidecar/デーモンとして配置し、ファイルに資格情報を書き出す運用が一般的です。Dynamic Secrets は短命のため、ファイル更新とシグナル再読込、または接続再確立の設計が重要になります。
ゼロトラスト観点では、Response Wrapping により資格情報やトークンの受け渡し経路での露出を抑えることができます。試験では Wrapping Token の一回限り・短命性、unwrap の責務が問われることがあります。
| 統合方式 | メリット | 留意点 |
|---|---|---|
| ライブラリ直組み込み | きめ細かな制御 | 実装コスト/言語対応が必要 |
| Vault Agent(サイドカー) | 実装不要・標準化 | ファイル配布・再読込制御が必要 |
| Init + Wrapping | 初期配布の安全性向上 | unwrap 手順と期限管理が必要 |
Agent サイドカーによる資格情報の供給
Vault Agent の最小構成例 (AppRole + Template)
auto_auth {
method "approle" {
mount_path = "auth/approle"
config = {
role_id_file_path = "/etc/vault/role_id"
secret_id_file_path = "/etc/vault/secret_id"
}
}
sink "file" {
config = { path = "/etc/vault/token" }
}
}
template {
source = "/etc/vault/templates/db.tpl"
destination = "/etc/secrets/db.env"
command = "/usr/local/bin/reload-app"
}
vault {
address = "https://vault.example.com:8200"
}
# db.tpl の例:
# export DB_USER="{{ with secret \"database/creds/readonly\" }}{{ .Data.username }}{{ end }}"
# export DB_PASS="{{ with secret \"database/creds/readonly\" }}{{ .Data.password }}{{ end }}"最小権限を実現するため、アプリのトークンには必要な読み取りパス(database/creds/role など)のみ付与します。管理者は revoke -prefix を用いて影響範囲別に一括失効を計画的に実行できます。監査ログは発行・更新・失効のトレースを提供し、インシデント対応を容易にします。
試験で混同しやすい点として、トークン TTL とシークレット TTL の独立性、default_ttl と max_ttl の関係、orphan トークンと revoke 伝播の挙動があります。各概念を切り分けて覚えましょう。
| コマンド/設定 | 効果 | 試験での落とし穴 |
|---|---|---|
| vault lease revoke -prefix path | 配下の動的シークレットを一括失効 | 影響範囲の見積もり不足 |
| vault audit enable file | 監査ログを有効化 | 権限/パス不可で書けないケース |
| policy の read 制御 | 不要な権限を排除 | creds と roles/config の誤読可否の混同 |
Lease の階層と一括失効イメージ
最小権限ポリシーと監査の有効化
# アプリが readonly 資格情報だけ取得可能にする例
path "database/creds/readonly" {
capabilities = ["read"]
}
# 監査ログをファイルで有効化
vault audit enable file file_path=/var/log/vault_audit.logよくある失敗は、ロール名の不一致、max_ttl を超える更新、バックエンド接続権限不足(例: DB 側で CREATE ROLE 権限なし)、またはトークン権限不足(read 不可)です。メッセージに lease TTL too large、permission denied、no handler for route などが出たら、それぞれ TTL 上限、ポリシー、マウント/パスの誤りを疑います。
運用では、プール接続の更新戦略(コネクション再確立)、ネットワーク分断時の再試行窓、監査とメトリクス(発行失敗率/更新失敗率)の可視化が安定稼働の鍵です。
| 症状 | 主な原因 | 対処 |
|---|---|---|
| lease TTL too large | 要求TTLがmax_ttlやシステム上限超過 | roleのmax_ttlやsys上限を見直し |
| permission denied | トークンのcapabilities不足 | policyを修正してread等を付与 |
| no handler for route | パス/マウントの誤り、未有効 | secrets enable とパスを再確認 |
簡易診断フロー
確認系コマンド/API スニペット
# マウント一覧
vault list sys/mounts
# ロール定義の確認
vault read database/roles/readonly
# API 例: 認証後に creds を取得
curl -s \
-H "X-Vault-Token: $VAULT_TOKEN" \
https://vault.example.com/v1/database/creds/readonly | jqAssociate / Ops
問題 1
あるチームは Vault の Database Secrets Engine を用いてアプリの DB アクセスを短命化したい。以下の要件がある: 1) 資格情報は自動で期限切れにしたい、2) 運用は最小限にしたい、3) 期限内に負荷が高い場合のみ資格情報の寿命を延ばしたい。最も適切な設計はどれか。
正解: A
要件1と2は Dynamic Secrets の標準機能で満たせる。要件3は lease renew により default_ttl をベースに必要時のみ延長すればよい。max_ttl は上限として余裕を持たせる。共有ユーザーやトークン TTL の延長ではシークレットの寿命管理にならない。
ネットワーク分断で renew に失敗した場合はどうなる?
renew できなければ TTL 到達で Vault が自動失効します。アプリ側は期限の前に更新を試み、失敗時は新規取得へ切り替える設計(二段階リトライとフェイルオーバー)が推奨です。
DB コネクションプールで資格情報が更新されたら?
短命クレデンシャルでは再認証が必要です。プールを段階的にリフレッシュする仕組み(新規接続は新しい資格情報、古い接続はクローズ)やアプリの再読込フックを用意してください。
TTL はどの程度が適切?
原則は最小権限・最短寿命。平常時のアプリ可用性に支障がない範囲で短く設定し、max_ttl はバースト時の延長余地として設定します。監査・再取得コストとのバランスをモニタリングで調整します。
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...