Templated Policiesは、ポリシー内でidentity情報を変数として参照し、リクエスト時に動的にパス解決する仕組みです。ユーザーごと・チームごとに個別のシークレット空間を切る最小権限設計を、少数のポリシーで表現できます。
本稿では、entityやgroupに紐づく情報をどのようにテンプレート展開へ使うか、評価順序と落とし穴、実務的な設定手順、試験で押さえるべき要点を扱います。
VaultのTemplated Policiesは、ACLポリシー内に{{...}}形式のプレースホルダを記述し、リクエストを実行するトークンに結び付くIdentityコンテキスト(entityやそのaliases、metadataなど)で置換する機能です。置換はサーバー側で行われ、マッチしたパスに対して通常のcapabilities判定が行われます。
実務では、ユーザー自身の名前や所属チームなどをパスに埋め込むことで、1本のポリシーを多人数に安全に適用できます。試験の観点では、どのidentityフィールドが使用できるか、トークンにentityが無い場合の挙動、deny優先、kv v2のパス(dataとmetadataの違い)といった基本を確実に押さえることが重要です。
最小例: ユーザー自身の領域のみ許可(kv v2)
path "kv/data/users/{{identity.entity.name}}/*" {
capabilities = ["create", "update", "read", "delete"]
}
# list用(kv v2のメタデータパス)
path "kv/metadata/users/{{identity.entity.name}}/*" {
capabilities = ["list"]
}同じ最小権限でも、単純な静的ACLを大量に作る、テンプレートで集約する、外部の高度なポリシーエンジン(例: Sentinel)で制御する、といった選択肢があります。運用規模・動的性・審査要件に応じて選びます。
Associate/Ops試験では、まずACLとTemplated Policiesの使い分けを理解していれば十分です。Sentinelの詳細は上位資格やEnterprise機能の文脈で問われます。
| 観点 | 静的ACLポリシー | Templated Policies | 外部ポリシーエンジン |
|---|---|---|---|
| 定義数 | 利用者ごとに増えやすい | 1本で多数の利用者をカバー | ルールは集約できるがランタイム評価が増える |
| 表現力 | 固定パスのみ | identity由来の可変パス | 時間・環境・属性など複雑条件 |
| 運用コスト | 命名・配布が煩雑 | 属性更新で自動追従しやすい | 設計・審査・運用に専門性が必要 |
| 試験頻出度 | 高 | 高(テンプレート構文・評価順序) | 中〜低(上位資格向け) |
テンプレートは、要求トークンに紐づくentityコンテキストで都度展開されます。展開後の文字列パスに対して通常のACLマッチングが行われ、最終的なcapabilitiesが決まります(deny優先)。
groupは、誰にポリシーを付けるかをコントロールする単位です。グループ名そのものをパスに差し込むのではなく、グループに所属する各entityの属性(例: entity.metadata.team)でテンプレートを解決させるのが基本です。
テンプレート展開と評価の概念図
エイリアス(認証メソッドのユーザー名)で展開する例
# userpassのアクセサを環境変数に保持した想定
# 例: ACCESSOR=auth_userpass_12345678
path "kv/data/users/{{identity.entity.aliases.${ACCESSOR}.name}}/*" {
capabilities = ["create", "update", "read", "delete"]
}
path "kv/metadata/users/{{identity.entity.aliases.${ACCESSOR}.name}}/*" {
capabilities = ["list"]
}個人領域の切り出しは最もよくあるパターンです。entity.nameは自動生成名になる場合があるため、認証メソッド側のユーザー名で安定させたい場合はaliases.<mount_accessor>.nameを使います。
チーム単位の領域は、entity.metadata.teamのような属性で分岐します。チーム変更時はmetadataを更新するだけで権限が自動的に移るため、ポリシーの再配布が不要です。
HCL例: 個人領域とチーム領域を1本で表現
# 個人領域(ユーザー名)
path "kv/data/users/{{identity.entity.aliases.${ACCESSOR}.name}}/*" {
capabilities = ["create", "update", "read", "delete"]
}
path "kv/metadata/users/{{identity.entity.aliases.${ACCESSOR}.name}}/*" {
capabilities = ["list"]
}
# チーム領域(entity.metadata.team)。teamが未設定なら一致せずdeny
path "kv/data/teams/{{identity.entity.metadata.team}}/*" {
capabilities = ["read", "list"]
}
path "kv/metadata/teams/{{identity.entity.metadata.team}}/*" {
capabilities = ["list"]
}以下は、userpassを使ってログインしたユーザーに対し、ユーザー名ベースで個人領域を許可する最小構成例です。aliases.<mount_accessor>.nameを使うため、userpassのマウントアクセサを取得してテンプレートに固定します。
本番運用では、entityのmetadata初期化、groupへのポリシー付与、ユーザー加入・離脱フローの自動化を併せて設計します。
CLI一連コマンド例
# 1) kv v2を有効化
vault secrets enable -path=kv kv-v2
# 2) userpassを有効化し、ユーザー作成
auth_path=userpass
vault auth enable ${auth_path}
vault write auth/${auth_path}/users/alice password="S3cret!"
# 3) userpassのマウントアクセサ取得
ACCESSOR=$(vault auth list -format=json | jq -r '."'${auth_path}'/".accessor')
echo "ACCESSOR=${ACCESSOR}"
# 4) テンプレート化ポリシーを作成
cat > user-scoped.hcl <<EOF
path "kv/data/users/{{identity.entity.aliases.${ACCESSOR}.name}}/*" {
capabilities = ["create", "update", "read", "delete"]
}
path "kv/metadata/users/{{identity.entity.aliases.${ACCESSOR}.name}}/*" {
capabilities = ["list"]
}
EOF
vault policy write user-scoped user-scoped.hcl
# 5) Identity groupを作成し、ポリシー付与
gid=$(vault write -field=id identity/group name="ops" policies="user-scoped")
echo "GROUP_ID=${gid}"
# 6) aliceで一度ログインしてentityを自動作成
VAULT_TOKEN=$(vault login -method=${auth_path} -format=json username=alice password="S3cret!" | jq -r .auth.client_token)
ENTITY_ID=$(VAULT_TOKEN=$VAULT_TOKEN vault token lookup -format=json | jq -r .data.entity_id)
echo "ENTITY_ID=${ENTITY_ID}"
# 7) グループにaliceのentityを追加
vault write identity/group/id/${gid} member_entity_ids=${ENTITY_ID}
# 8) シークレット作成(管理者トークンで代入例)
vault kv put kv/users/alice/api key=abc123
# 9) aliceトークンでアクセス検証
VAULT_TOKEN=$VAULT_TOKEN vault kv get kv/users/alice/api # 成功
VAULT_TOKEN=$VAULT_TOKEN vault kv get kv/users/bob/api # 失敗(パス不一致)テンプレート展開は便利ですが、属性不足やパス種別の取り違えで意図せずdenyになることがあります。監査・メンテナンス観点も含めてチェックリスト化しておくと安全です。
試験では、deny優先、テンプレートに使えるidentityフィールド、listでのkv/metadataの必要性、エンティティが存在しない場合の挙動が頻出です。
監査ログでの確認例(抜粋イメージ)
# file auditデバイスを有効化している前提
# request.path が展開後の実パスにマッチしているかを確認
{
"type": "request",
"auth": {"entity_id": "...", "policies": ["user-scoped"]},
"request": {"path": "kv/data/users/alice/api", "operation": "read"},
"response": {"policy_results": {"allowed": true}}
}Associate / Ops
問題 1
userpassでログインしたユーザーに、ユーザー名と同名のパス配下のみkv v2でアクセスを許可したい。テンプレート化ポリシーで正しい書き方はどれか(list権限は考慮しない)。
正解: A
userpassのマウントアクセサを用いた aliases.<accessor>.name が、認証メソッド側のユーザー名での安定した展開方法です。kv v2の読み書きはkv/data/配下で行います。Bは無効なプレースホルダ、Cは名前空間が誤り、Dはmetadataパスでread/updateは不適切です(list用途)。
トークンにentityが存在しない場合、テンプレートはどう評価されますか?
identityコンテキストが無い場合、多くのテンプレート値は空として扱われ、結果としてパスが一致せずdenyになります。テンプレート化ポリシーを前提にする場合は、必ず認証メソッドでentity/aliasが作成される経路を用意してください。
ユーザー名を変更した場合、ポリシーの更新は必要ですか?
aliases.<accessor>.nameを使っていれば、認証メソッド側のユーザー名変更に追随します。ただしマウントアクセサが変わる(認証メソッド再作成など)場合は、ポリシー内の<accessor>を更新する必要があります。entity.metadataを使う場合は、そのキー値を更新すれば展開結果が自動的に切り替わります。
group情報はテンプレート展開に直接使えますか?
グループは一般にポリシー付与の単位として用い、テンプレート展開にはメンバーのentity属性(例: entity.metadata.team、aliases)を使うのが基本です。つまり、グループで誰に適用するかを決め、各メンバーのentity情報でどのパスに届くかを決める、という役割分担になります。
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...