🐾

HashiCorp Vaultを何となく理解する(4): Policy

2024/04/25に公開

イオン⁠⁠⁠⁠⁠⁠⁠スマートテクノロジーのCTO室SREチームの@hikkie13です。

過去の記事に記載がある通り、弊社ではHCP Vaultの導入を進めています。
https://zenn.dev/aeonpeople/articles/6625a900552311
https://zenn.dev/aeonpeople/articles/0b4492898a0fd3

導入には教育・学習が欠かせません。
その過程で得た知識を何回かに分けてまとめていこうと思います。(心が折れない限り)

今回は、VaultのPolicyについてです。

Vault Policyとは

https://developer.hashicorp.com/vault/docs/concepts/policies


https://developer.hashicorp.com/vault/docs/concepts/policiesより引用

Vault Policyは、Vault内の特定のパスやアクションへのアクセスを許可または拒否する。

  • このPolicyにより誰がどのsecretにアクセスできるかを制御する。
    • 当然、最小権限の原則に従うことが重要
  • JSONまたはHCLで記載する。
  • デフォルトで拒否(暗黙の拒否)となる。
  • 明示的なDENYは他のどの許可よりも優先される。
  • ポリシーはトークンにattachされる。1つのTokenは複数のPolicyをattachできる。

初期状態で存在するPolicy

Root Policy

  • すべての権限を持つ。
  • 変更や削除が不可
  • Root Tokenにattach

Default Policy

  • 一般的な権限を持つ。
  • 変更は可能だが、削除は不可
  • 非Root Tokenにデフォルトでattach(attachの解除は可能)

Policyの設定方法

HCLもしくはjsonで記法可能。
以下はHCLでの記法を示す。

path "<path>" {
capabilities = ["<list of permissions>"]
}
path "<path>" {
capabilities = ["<list of permissions>"]
}

path "kv\data\apps\backend-app" {
capabilities = ["read","update","delete"]
}
path "sys/policies/*" {
capabilities = ["create","update","list","delete"]
}
path "aws/creds/web-app" {
capabilities = ["read"]
}

Pathについて

HashiCorp Vaultを何となく理解する(1):アーキテクチャ #PATHについて で記載している通り、Vaultの全てはPATHベースである。

PATHの例

  • sys/rekey
  • kv/apps/web-app
  • auth/ldap/group/operators
  • database/creds/production-database
  • secrets/data/order-service/app01

その中には、以下のような特殊なPATHも存在する。

Root保護PATH

https://developer.hashicorp.com/vault/tutorials/policies/policies#root-protected-api-endpoints

  • Vault内のPATHでは、使用するためにRoot Tokenまたはsudo権限が必要となる。

Root保護PATHの例:

  • auth/token/create-orphan(Orphan Tokenを作成)
  • pki/root/sign-self-issued(自己署名証明書を署名)
  • sys/rotate(暗号キーをローテート)
  • sys/seal(Vaultを手動でseal)

PolicyにおけるPATHのmatch条件

PolicyにPATHを記載する際は、wildcard (+)とglob (*)を使用可能。

  • glob (*)は、PATHの最後の階層にのみ使用可能。prefixでのmatchを指示する。
    • secret/apps/service-*
    • secret/apps/web-app/*
  • PATHの途中ではwildcard (+)が使える。1つのパスセグメントで区切られた任意の数の文字を示す。
    • 以下のように、複数のPATH階層に使用可能
      • secret/+/+/hogehoge
  • wildcard (+)とglob (*)も組み合わせて利用可能
    • secret/+/+/hoge-*
  • 変数置換も可能

matchの条件を以下にまとめる。

  • glob (*)パターン: secret/apps/serviceA/* と設定した場合
PATH マッチする
secret/apps/serviceA ×
secret/apps/serviceA/db
secret/apps/serviceA/data/production
secret/apps/serviceA/web-app
secret/apps/serviceA/keys/key1
secret/apps/database ×
secret/apps/serviceB ×
secret/apps/data/backend ×
kv/secret/app/service ×

secret/apps/serviceA はマッチしないことに注意。

  • wildcard (+)を使ったパターン: secret/data/+/apps/backend1 と設定した場合
PATH マッチする
secret/data/production/apps/backend1
secret/data/dev/apps/backend1
secret/data/hogehoge/apps/backend1
secret/data/1234567890/apps/backend1
secret/data/apps/backend1 ×
secret/env/dev ×
secret/data/frontend/apps ×
secret/dev/apps/frontend ×

capabilitiesについて

権限については、以下の種類がある。

capability 説明
Create 新しいエントリーを作成
Read 資格情報、設定などを読む
Update 既存の値を更新
Delete 削除する
List リスト化する(読み取りは許可されない)
Patch パスのデータを部分的に更新する
Sudo Root保護パスの実行に使用
Deny アクセスを拒否する ※他のあらゆるcapabilityより優先される

参考

https://developer.hashicorp.com/vault/docs/concepts/policies
https://developer.hashicorp.com/vault/tutorials/policies/policies
https://developer.hashicorp.com/vault/docs
https://youtube.com/playlist?list=PLFkEchqXDZx7CuMTbxnlGVflB7UKwf_N3&si=uJE2c_GhjxQ4FmMA
HashiCorp Certified: Vault Associate 2024 (w/ Hands-On Labs)
HashiCorp Certified: Vault Operations Professional

最後に(採用のお知らせ)

イオンスマートテクノロジーではエンジニアをはじめとした様々な職種を積極的に採用中です!
これからとてもおもしろいフェーズへ突入していくと思いますので興味のある方は是非カジュアル面談などで話を聞いてください!

https://engineer-recuruiting.aeon.info/

AEON TECH HUB

Discussion