Cubbyholeは、各トークンに専用のプライベート名前空間を与えるVaultの組み込みシークレットエンジンです。トークンが失効すれば中身も消えるため、短期的なシークレットの保管や受け渡しに適しています。
本稿では、Cubbyholeの仕組み、ライフサイクル、レスポンスラッピングとの連携、実践手順、運用上の制約、試験で問われやすい落とし穴をまとめます。
CubbyholeはVaultにデフォルト搭載されるシークレットエンジンで、各アクセストークンに1つずつ固有の保管領域を割り当てます。あるトークンで書き込んだ値は、そのトークンでのみ読み出せます。他のトークンやポリシーによる委譲でアクセスすることはできません。
APIは単純で、バージョニングやメタデータ管理はありません。TTLはシークレットに付くのではなく、紐づくトークンのライフサイクルに従います。トークンが失効・取り消しされると、Cubbyhole内のデータは自動的に消えます。
| 観点 | Cubbyhole | KV v2 | レスポンスラッピング |
|---|---|---|---|
| アクセス範囲 | トークン専用 (同一トークンのみ) | ポリシーに基づく共有可 | ラップトークン所持者のみ (一回性) |
| 保持期間 | トークンの存続中 | 任意 (バージョン保持/削除可) | wrap-ttl中 (unwrapで即破棄) |
| バージョニング | なし | あり | 対象の応答を一時格納 (実体は元のエンジン) |
| 共有のしやすさ | 不可 (意図的に閉域) | 可 (ポリシー設計次第) | 一方向の安全な手渡しに最適 |
| 主用途 | ブートストラップ/一時保管 | 永続的なキー値管理 | シークレットの安全な配送 |
| 削除タイミング | トークン失効/取り消し時 | 明示削除/TTL/バージョン規約 | unwrapまたはwrap-ttl満了 |
基本操作 (CLI)
vault write cubbyhole/bootstrap token=child-abc note="startup"
vault read cubbyhole/bootstrap
vault delete cubbyhole/bootstrapCubbyholeの可用期間は、格納したエントリではなく、紐づくトークンに従います。トークンを更新すればデータは維持され、トークンを取り消せば即座に消えます。これにより「置きっぱなし」を避けられます。
親子トークンの関係は注意点です。子トークンは独自のCubbyholeを持ち、親とは分離されています。親トークンの取り消しが子に連鎖する設定では、子も含めて無効化され、各自のCubbyholeも到達不能になります。
トークンの更新/取り消しとCubbyholeの挙動 (CLI例)
# トークン発行 (例)
vault token create -ttl=1h -policy=default -format=json | jq -r .auth.client_token > parent.token
# 子トークン発行 (親の権限範囲内)
VAULT_TOKEN=$(cat parent.token) vault token create -ttl=15m -format=json | jq -r .auth.client_token > child.token
# 子でCubbyholeへ保存
VAULT_TOKEN=$(cat child.token) vault write cubbyhole/boot key=value
# 親を取り消すと、親由来の子も無効化されアクセス不能に
vault token revoke $(cat parent.token)
# 以降の child.token での read は失敗する想定
VAULT_TOKEN=$(cat child.token) vault read cubbyhole/boot起動直後のプロセスが、最小権限の子トークンで一時的な設定値や次段の取得トークンを受け取る、というブートストラップでCubbyholeは有効です。配布側は対象プロセスの持つトークンにだけ見える場所へ書き込み、プロセスは起動後すぐ取り出して破棄する、という運用が安全です。
直接のCubbyhole読み書きは「一回限り」ではありません。使い捨てを保証したい場合は、後述のレスポンスラッピングを使います。
CLI/HTTP APIでの一時保管
# CLI: 子トークンで書き込み/読み出し
VAULT_TOKEN=$CHILD_TOKEN vault write cubbyhole/config db_user=app db_pass=s3cr3t
VAULT_TOKEN=$CHILD_TOKEN vault read cubbyhole/config
# HTTP API: 書き込み
curl \
-H "X-Vault-Token: $CHILD_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"db_user":"app","db_pass":"s3cr3t"}' \
$VAULT_ADDR/v1/cubbyhole/config
# HTTP API: 読み出し
curl -H "X-Vault-Token: $CHILD_TOKEN" $VAULT_ADDR/v1/cubbyhole/configレスポンスラッピングは、Vaultの応答をラップトークンに封入し、一回限りで取り出せるようにする仕組みです。内部的にはCubbyholeが使われ、wrap-ttl内にunwrapされなければ自動的に破棄されます。これにより、シークレットを直接配布せず、トークンのみを配送できます。
配布側は任意の読み取り操作に -wrap-ttl を付与し、受け取り側は vault unwrap または /sys/wrapping/unwrap にラップトークンを渡します。unwrapが成功すると内容が返り、トークンは無効化されます。
レスポンスラッピングのハンドオフ
レスポンスラッピングの例
# 秘密データを読む際にラップ (例: kv v2 上のシークレット)
# ここでは対象エンジンが何であれ、応答をラップトークン化する点がポイント
vault kv get -wrap-ttl=60s kv/app/api
# 出力: wrapping_token=... (一度だけ使用可能)
# 受け取り側: unwrap して中身を取得 (トークンは失効)
VAULT_TOKEN=$WRAPPING_TOKEN vault unwrap
# HTTP APIでも同様
curl -s -H "X-Vault-Token: $VAULT_TOKEN" \
"$VAULT_ADDR/v1/kv/data/app/api?wrap_ttl=60s"
# レスポンスJSONの auth.client_token がラップトークン
# unwrap
curl -s -H "X-Vault-Token: $WRAPPING_TOKEN" \
-X POST "$VAULT_ADDR/v1/sys/wrapping/unwrap"Cubbyholeは軽量な一時保管に最適ですが、大きなバイナリや長期保管の設定ファイルには不向きです。サイズ上限は実ストレージや運用方針に依存するため、原則として小さなシークレットとトークンを対象にします。
監査ログを有効化しておけば、cubbyhole/ 以下のアクセスも記録されます (データ本体はマスクされます)。漏えい検知、ラップトークンの取り扱い監視に役立ちます。
後始末の明示化
# 取り出し後に削除
VAULT_TOKEN=$CHILD_TOKEN vault delete cubbyhole/config
# 役目が終わった子トークンを取り消す
vault token revoke $CHILD_TOKENCubbyholeは「トークンに付随するプライベート保管」であり、ポリシーで他者に見せる設計ではありません。KV v2のような共有・バージョニングと混同しないことが重要です。
レスポンスラッピングは「一回限りの取り出し」を実現するための仕組みで、内部的にCubbyholeを使っている点を押さえてください。wrap-ttl満了やunwrap成功で中身は破棄されます。
理解度チェック用ワンライナー
# Cubbyholeはこのトークンでしか読めるべきでない
VAULT_TOKEN=$OTHER_TOKEN vault read cubbyhole/boot # -> 権限外エラーになる想定Associate
問題 1
VaultのCubbyholeに関する正しい説明はどれか。Associateレベルを想定する。
正解: A
Cubbyholeはトークン単位で分離され、同一トークンのみが読み書きできます。トークンの取り消しや失効により中身も到達不能になります。ACLで他トークンのCubbyholeを共有することはできず、バージョニングもありません。レスポンスラッピングは内部的にCubbyholeを用いて一回限りの取り出しを実現します。
CubbyholeにTTLを直接設定できますか?
できません。Cubbyholeの有効期間は紐づくトークンのライフサイクルに従います。期限を制御したい場合はトークンTTL/Max TTL/更新、またはレスポンスラッピングのwrap-ttlを使います。
Cubbyholeは無効化や別パスへの再マウントが可能ですか?
CubbyholeはVaultに組み込みのエンジンとして提供され、デフォルトのcubbyhole/パスで利用します。通常のエンジンのように自由に無効化・再マウントする前提では設計されていません。
単回での受け渡しを保証したいのですが、どうすればよいですか?
レスポンスラッピングを使用してください。-wrap-ttlを付けて応答をラップし、受け取り側はunwrapします。unwrap成功または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...