概要
HashiCorp VaultのTokenにはLeaseという概念があります。
この概念によってよりローテーションを強制し、秘密情報のセキュアな管理をすることが可能です。
環境
- Vault 1.2.1
default_lease_ttl
とmax_lease_ttl
root tokenを除く全てのtokenにはdefault_lease_ttl
とmax_lease_ttl
の2つのTTLがあります。
$ vault read sys/auth/token/tune Key Value --- ----- default_lease_ttl 768h force_no_cache false max_lease_ttl 768h token_type default-service
説明すると以下です。
TTL | 説明 |
---|---|
default_lease_ttl | tokenをcreate, renewした時のTTL |
max_lease_ttl | renewの上限値expire_time >issue_time +max_lease_ttl となるrenewはNGデフォルト32日 |
このように2つの期限でvaultのtokenは管理されています。
設定方法
通常のTokenと特定のSecret Engineで異なるのでそれぞれ説明します。
Tokens and Leases - Guides - Vault by HashiCorp
通常のTokenの場合
sys/auth/token/tune
を設定します。
$ vault write sys/auth/token/tune default_lease_ttl=10m max_lease_ttl=30m Success! Data written to: sys/auth/token/tune
確認してみます。
$ vault read sys/auth/token/tune Key Value --- ----- default_lease_ttl 10m force_no_cache false max_lease_ttl 30m token_type default-service
特定のSecret Engineの場合
sys/mounts/:name/tune
というパスになります。例えばaws
だと
$ vault read sys/mounts/aws/tune Key Value --- ----- default_lease_ttl 768h force_no_cache false max_lease_ttl 768h
変更方法は先程と同じです。
$ vault write sys/mounts/aws/tune default_lease_ttl=10m max_lease_ttl=30m Success! Data written to: sys/mounts/aws/tune
確認します。
$ vault read sys/mounts/aws/tune Key Value --- ----- default_lease_ttl 10m force_no_cache false max_lease_ttl 30m
検証してみる
準備
root policyだとTTLが無限になってしまうので、以下を参考にあらかじめadmin policyを作っておきます。
HashiCorp VaultのPolicyを使った運用 - Carpe Diem
生成
10分有効なtokenを生成してみます。
$ vault token create -policy=admin Key Value --- ----- token s.6AUvcFPx6l8zbVM0UMmZ9Jkd token_accessor dGopmgfD8jkKn2jlXy726wbE token_duration 10m token_renewable true token_policies ["admin" "default"] identity_policies [] policies ["admin" "default"]
詳細を確認してみます。
$ VAULT_TOKEN=s.6AUvcFPx6l8zbVM0UMmZ9Jkd vault token lookup Key Value --- ----- accessor dGopmgfD8jkKn2jlXy726wbE creation_time 1565591302 creation_ttl 10m display_name token entity_id n/a expire_time 2019-08-12T15:38:22.975741+09:00 explicit_max_ttl 0s id s.6AUvcFPx6l8zbVM0UMmZ9Jkd issue_time 2019-08-12T15:28:22.975741+09:00 meta <nil> num_uses 0 orphan false path auth/token/create policies [admin default] renewable true ttl 7m37s type service
Renewしてみる(max_lease_ttl内)
renewしてみます。
$ VAULT_TOKEN=s.6AUvcFPx6l8zbVM0UMmZ9Jkd vault token renew Key Value --- ----- token s.6AUvcFPx6l8zbVM0UMmZ9Jkd token_accessor dGopmgfD8jkKn2jlXy726wbE token_duration 10m token_renewable true token_policies ["admin" "default"] identity_policies [] policies ["admin" "default"]
確認してみます。
$ VAULT_TOKEN=s.6AUvcFPx6l8zbVM0UMmZ9Jkd vault token lookup Key Value --- ----- accessor dGopmgfD8jkKn2jlXy726wbE creation_time 1565591302 creation_ttl 10m display_name token entity_id n/a expire_time 2019-08-12T15:41:21.971079+09:00 explicit_max_ttl 0s id s.6AUvcFPx6l8zbVM0UMmZ9Jkd issue_time 2019-08-12T15:28:22.975741+09:00 last_renewal 2019-08-12T15:31:21.971079+09:00 last_renewal_time 1565591481 meta <nil> num_uses 0 orphan false path auth/token/create policies [admin default] renewable true ttl 8m55s type service
expire_time
が延びてますね。
Renewしてみる(max_lease_ttl超える)
$ VAULT_TOKEN=s.6AUvcFPx6l8zbVM0UMmZ9Jkd vault token lookup WARNING! The following warnings were returned from Vault: * TTL of "10m0s" exceeded the effective max_ttl of "6m19s"; TTL value is capped accordingly Key Value --- ----- token s.6AUvcFPx6l8zbVM0UMmZ9Jkd token_accessor dGopmgfD8jkKn2jlXy726wbE token_duration 6m19s token_renewable true token_policies ["admin" "default"] identity_policies [] policies ["admin" "default"]
renewするとexpire_time
>issue_time
+max_lease_ttl
となってしまう場合はmax_lease_ttl
までしか延長されません。
Revoke
手動でrevokeする場合は-self
をつけるか
$ VAULT_TOKEN=s.KOeFPVA6rFP29CMMrwrje4HS vault token revoke -self Success! Revoked token (if it existed)
自身の権限や上記の権限を持つtokenによってrevokeします。
$ VAULT_TOKEN=s.KOeFPVA6rFP29CMMrwrje4HS vault token revoke s.KOeFPVA6rFP29CMMrwrje4HS Success! Revoked token (if it existed)
その他
max_lease_ttlの変更は既存のtokenにも影響する
max_lease_ttl
を変更すると、それが既存のtokenをrenewしようとした際にも反映されます。
なので短くすると既存のtokenがrenewできなくなったり、といったことが発生するので注意してください。
まとめ
鍵のローテーションにはいつも悩まされますが、VaultのtokenはデフォルトでTTLを持って強制することでセキュリティを担保しています。
ルールや運用ではなくこのようにシステムによって確立することでセキュアなシステムを構築することができます。