VaultのPolicyに入門する

目次

  1. 初めに
  2. 動作環境
  3. Policyの追加
  4. 終わりに

1. 初めに

今回はPolicyについて書いていきたいと思います。 今回もHashiCorp Learnにそって進め、その都度調べたことなどを書いていきます。

learn.hashicorp.com

2. 動作環境

3. Policyとは

まずはPolicyについて説明したいと思います。Policyはログインしたアカウントに対してアクセス制限をかけるものになります。

アクセス制限は読み込み、書き込み制限などを行うことができSecretのパスごとに制限をかけることができます。

下記がPolicyのフォーマットになります。

path "secret/*" {
  capabilities = ["create"]
}
path "secret/foo" {
  capabilities = ["read"]
}

path "secret/data/*" {
  capabilities = ["create"]
}
path "secret/data/foo" {
  capabilities = ["read"]
}

このPolicyは secret/ 配下にSecretの書き込みはできますが、secret/foo に対しては読み込みしかできません。

Policyはデフォルトで拒否の設定となるため指定されてないパスに対してはアクセスができないようになっています。

また、capabilities には下記のものが指定できます。

  • create
  • read
  • update
  • delete
  • list

ざっくりではありますがPolicyについて説明しましたので次は実際にPolicyを使ってアクセス制限をしていきたいと思います。

4. Policyの追加

では実際にPolicyを追加したいと思います。下記のコマンドで追加することができます。

$ vault policy write my-policy my-policy.hcl
Success! Uploaded policy: my-policy

無事にPolicyを追加することができました。Policyは下記のコマンドで確認することができます。

$ vault policy list
default
my-policy
test
root

また、Policyの情報は read コマンドで確認することができます。

$ vault policy read my-policy
path "secret/*" {
  capabilities = ["create"]
}

path "secret/foo" {
  capabilities = ["read"]
}

path "secret/data/*" {
  capabilities = ["create"]
}

path "secret/data/foo" {
  capabilities = ["read"]
}

PolicyはTokenに割り当てることでそのTokenでログインしたアカウントに対してPolicyでのアクセス制限をすることができます。 では早速、新規にTokenを作成しPolicyを割り当ててみたいと思います。

$ vault token create -policy=my-policy
Key                  Value
---                  -----
token                s.78IsL4osG8n7wslFIOu5stAS
token_accessor       CIshIIuaE2xLedKkHopdG3b6
token_duration       768h
token_renewable      true
token_policies       ["default" "my-policy"]
identity_policies    []
policies             ["default" "my-policy"]

$ vault login  s.78IsL4osG8n7wslFIOu5stAS
Success! You are now authenticated. The token information displayed below
is already stored in the token helper. You do NOT need to run "vault login"
again. Future Vault requests will automatically use this token.

Key                  Value
---                  -----
token                s.78IsL4osG8n7wslFIOu5stAS
token_accessor       CIshIIuaE2xLedKkHopdG3b6
token_duration       767h59m37s
token_renewable      true
token_policies       ["default" "my-policy"]
identity_policies    []
policies             ["default" "my-policy"]

作成し、ログインすることまでできましたのでPolicyのアクセス制限がされているか確認してみます。

$ vault kv put secret/bar robot=beepboop
Key              Value
---              -----
created_time     2019-12-24T12:44:02.999777645Z
deletion_time    n/a
destroyed        false
version          1

$ vault kv put secret/foo robot=beepboop
Error writing data to secret/data/foo: Error making API request.

URL: PUT http://127.0.0.1:8200/v1/secret/data/foo
Code: 403. Errors:

* 1 error occurred:
        * permission denied

Policy通り、 secret/foo への追加は権限でエラーとなりました。 想定通りの動きとなりますね。

ちなみに、作成したPolicyを既存のRoleなどに適用することもできます。

$ vault write auth/gcp/role/gcp-role policies=my-policy
$ vault read auth/gcp/role/gcp-role
Key                        Value
---                        -----
add_group_aliases          false
allow_gce_inference        true
bound_projects             [sandbox-262701]
bound_service_accounts     [user01@sample-project.iam.gserviceaccount.com]
max_jwt_exp                900
policies                   [my-policy]
token_bound_cidrs          []
token_explicit_max_ttl     0s
token_max_ttl              0s
token_no_default_policy    false
token_num_uses             0
token_period               0s
token_policies             [my-policy]
token_ttl                  0s
token_type                 default
type                       iam

4. 終わりに

簡単ではありますが、Policyを作成し実際のアクセス制限についてみてみました。 アクセス制限をすることでread onlyのアカウントを作成したり、特定の環境にだけSecretを作成できるようにしたりすることができます。

Policyもまだパラメータの設定などを細かく指定することができるみたいなので、機会があるときにやってみたいと思います。