ポリシー
ポリシーの構文
Vaultポリシーの書き方と構文
最終更新: 2026/2/17
ポリシーの構文
Vaultポリシーは、トークンに付与される権限を定義します。HCL(HashiCorp Configuration Language)またはJSON形式で記述します。
ポリシーとは
ポリシーは、特定のパスに対するアクセス権限を定義するルールセットです。
基本構造
# パスに対する権限を定義
path "secret/data/myapp/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
構成要素:
path: アクセス対象のパス(ワイルドカード使用可能)capabilities: 許可する操作
権限(Capabilities)
基本的な権限
| 権限 | 説明 | 用途 |
|---|---|---|
create | 新規作成 | シークレットの作成 |
read | 読み取り | シークレットの取得 |
update | 更新 | シークレットの変更 |
delete | 削除 | シークレットの削除 |
list | 一覧表示 | パスの一覧取得 |
特殊な権限
| 権限 | 説明 | 用途 |
|---|---|---|
sudo | 管理者権限 | 特権操作の実行 |
deny | 明示的な拒否 | アクセスの拒否 |
権限の例
# 読み取り専用
path "secret/data/myapp/*" {
capabilities = ["read", "list"]
}
# 読み書き可能
path "secret/data/myapp/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# 管理者権限
path "sys/policies/*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
# 明示的な拒否
path "secret/data/sensitive/*" {
capabilities = ["deny"]
}
パスの指定
完全一致
# 特定のパスのみ
path "secret/data/myapp/config" {
capabilities = ["read"]
}
ワイルドカード(*)
# 1階層のみマッチ
path "secret/data/myapp/*" {
capabilities = ["read"]
}
# マッチ例:
# ✅ secret/data/myapp/config
# ✅ secret/data/myapp/database
# ❌ secret/data/myapp/prod/config
グロブ(+)
# すべての階層にマッチ
path "secret/data/myapp/+" {
capabilities = ["read"]
}
# マッチ例:
# ✅ secret/data/myapp/config
# ✅ secret/data/myapp/prod/config
# ✅ secret/data/myapp/prod/staging/config
パスの優先順位
より具体的なパスが優先されます。
# 一般的なルール
path "secret/data/*" {
capabilities = ["read"]
}
# より具体的なルール(こちらが優先)
path "secret/data/sensitive/*" {
capabilities = ["deny"]
}
ポリシーの作成
CLIでの作成
# HCLファイルから作成
vault policy write myapp-read myapp-read.hcl
# 標準入力から作成
vault policy write myapp-read - <<EOF
path "secret/data/myapp/*" {
capabilities = ["read", "list"]
}
EOF
ポリシーファイルの例
myapp-read.hcl:
# 読み取り専用ポリシー
path "secret/data/myapp/*" {
capabilities = ["read", "list"]
}
# メタデータの読み取り
path "secret/metadata/myapp/*" {
capabilities = ["read", "list"]
}
myapp-write.hcl:
# 読み書き可能ポリシー
path "secret/data/myapp/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "secret/metadata/myapp/*" {
capabilities = ["read", "list"]
}
ポリシーの管理
ポリシー一覧の表示
vault policy list
出力例:
default
myapp-read
myapp-write
root
ポリシーの内容確認
vault policy read myapp-read
ポリシーの更新
# ファイルから更新
vault policy write myapp-read myapp-read-updated.hcl
ポリシーの削除
vault policy delete myapp-read
高度な機能
パラメータの制限
# 特定のパラメータのみ許可
path "secret/data/myapp/*" {
capabilities = ["create", "update"]
allowed_parameters = {
"username" = []
"password" = []
}
}
パラメータ値の制限
# 特定の値のみ許可
path "secret/data/myapp/*" {
capabilities = ["create", "update"]
allowed_parameters = {
"environment" = ["dev", "staging", "production"]
}
}
パラメータの拒否
# 特定のパラメータを拒否
path "secret/data/myapp/*" {
capabilities = ["create", "read", "update"]
denied_parameters = {
"admin" = []
}
}
必須パラメータ
# 必須パラメータを指定
path "secret/data/myapp/*" {
capabilities = ["create", "update"]
required_parameters = ["username", "password"]
}
最小/最大値の制限
# TTLの範囲を制限
path "auth/token/create" {
capabilities = ["create", "update"]
allowed_parameters = {
"ttl" = []
}
min_wrapping_ttl = "1h"
max_wrapping_ttl = "24h"
}
テンプレート化されたポリシー
Identity情報の使用
# ユーザー名をパスに含める
path "secret/data/users/{{identity.entity.name}}/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# グループ名をパスに含める
path "secret/data/groups/{{identity.groups.names.0}}/*" {
capabilities = ["read", "list"]
}
メタデータの使用
# トークンのメタデータを使用
path "secret/data/{{identity.entity.metadata.team}}/*" {
capabilities = ["read", "list"]
}
実践例
1. 環境ごとのアクセス制御
# 開発環境ポリシー
path "secret/data/myapp/dev/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "secret/data/myapp/staging/*" {
capabilities = ["read", "list"]
}
path "secret/data/myapp/production/*" {
capabilities = ["deny"]
}
2. チームベースのアクセス制御
# チームAのポリシー
path "secret/data/team-a/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
path "secret/data/shared/*" {
capabilities = ["read", "list"]
}
path "secret/data/team-b/*" {
capabilities = ["deny"]
}
3. ロールベースのアクセス制御
開発者ポリシー:
# 開発環境への完全アクセス
path "secret/data/*/dev/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# 本番環境は読み取りのみ
path "secret/data/*/production/*" {
capabilities = ["read", "list"]
}
# 認証情報の取得
path "database/creds/dev-*" {
capabilities = ["read"]
}
運用担当者ポリシー:
# すべての環境への読み取りアクセス
path "secret/data/*" {
capabilities = ["read", "list"]
}
# 本番環境への書き込みアクセス
path "secret/data/*/production/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# 認証情報の取得
path "database/creds/*" {
capabilities = ["read"]
}
# 監査ログの確認
path "sys/audit" {
capabilities = ["read", "list", "sudo"]
}
管理者ポリシー:
# すべてのシークレットへのアクセス
path "secret/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# 認証方法の管理
path "auth/*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
# ポリシーの管理
path "sys/policies/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# 監査の管理
path "sys/audit/*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
# シークレットエンジンの管理
path "sys/mounts/*" {
capabilities = ["create", "read", "update", "delete", "list", "sudo"]
}
4. アプリケーション固有のポリシー
# アプリケーションAのポリシー
path "secret/data/app-a/*" {
capabilities = ["read", "list"]
}
path "database/creds/app-a-*" {
capabilities = ["read"]
}
path "aws/creds/app-a-role" {
capabilities = ["read"]
}
# 自分のトークン情報の確認のみ許可
path "auth/token/lookup-self" {
capabilities = ["read"]
}
path "auth/token/renew-self" {
capabilities = ["update"]
}
デフォルトポリシー
defaultポリシー
すべてのトークンに自動的に付与されます。
# 自分のトークン情報の確認
path "auth/token/lookup-self" {
capabilities = ["read"]
}
# 自分のトークンの更新
path "auth/token/renew-self" {
capabilities = ["update"]
}
# 自分のトークンの失効
path "auth/token/revoke-self" {
capabilities = ["update"]
}
# Cubbyholeへのアクセス
path "cubbyhole/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# 自分のIdentity情報の確認
path "identity/entity/id/{{identity.entity.id}}" {
capabilities = ["read"]
}
rootポリシー
Root Tokenに付与される特別なポリシー。
- すべてのパスへのアクセス
- すべての権限
- ポリシーの制約を受けない
ポリシーのテスト
ポリシーの検証
# ポリシーの構文チェック
vault policy fmt myapp-read.hcl
# ポリシーの適用テスト
vault token create -policy=myapp-read
vault kv get secret/myapp/config
権限の確認
# 現在のトークンの権限を確認
vault token capabilities secret/data/myapp/config
# 特定のトークンの権限を確認
vault token capabilities <token> secret/data/myapp/config
ベストプラクティス
1. 最小権限の原則
必要最小限の権限のみを付与します。
# 悪い例:すべてのパスへのアクセス
path "secret/*" {
capabilities = ["create", "read", "update", "delete", "list"]
}
# 良い例:特定のパスのみ
path "secret/data/myapp/*" {
capabilities = ["read", "list"]
}
2. 明示的な拒否
機密情報へのアクセスは明示的に拒否します。
# 機密情報へのアクセスを拒否
path "secret/data/sensitive/*" {
capabilities = ["deny"]
}
3. 階層的な構造
パスを階層的に構造化します。
secret/
├── myapp/
│ ├── dev/
│ ├── staging/
│ └── production/
4. ドキュメント化
ポリシーにコメントを追加します。
# アプリケーションAの読み取り専用ポリシー
# 用途: 開発環境でのシークレット参照
# 対象: 開発者
path "secret/data/app-a/dev/*" {
capabilities = ["read", "list"]
}
トラブルシューティング
権限エラー
エラー:
Error making API request.
Code: 403. Errors:
* permission denied
確認事項:
# トークンのポリシーを確認
vault token lookup
# パスへの権限を確認
vault token capabilities secret/data/myapp/config
# ポリシーの内容を確認
vault policy read myapp-read
ポリシーが適用されない
確認事項:
# ポリシーが存在するか確認
vault policy list
# トークンにポリシーが付与されているか確認
vault token lookup
次のステップ
ポリシーの構文を理解したら、次はポリシーの例で実践的なポリシーの書き方を学びましょう。
ポリシーの重要性ポリシーは、Vaultのセキュリティの要です。適切なポリシー設計により、最小権限の原則を実現し、セキュリティを大幅に向上させることができます。