ポリシー

ポリシーの構文

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のセキュリティの要です。適切なポリシー設計により、最小権限の原則を実現し、セキュリティを大幅に向上させることができます。
© 2026 IBM Corporation. Licensed under CC BY 4.0.