Carpe Diem

備忘録

VaultのTokenとLease

概要

HashiCorp VaultのTokenにはLeaseという概念があります。
この概念によってよりローテーションを強制し、秘密情報のセキュアな管理をすることが可能です。

環境

  • Vault 1.2.1

default_lease_ttlmax_lease_ttl

root tokenを除く全てのtokenにはdefault_lease_ttlmax_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を持って強制することでセキュリティを担保しています。
ルールや運用ではなくこのようにシステムによって確立することでセキュアなシステムを構築することができます。

ソース