Carpe Diem

備忘録

HashiCorp VaultのKVの基本的な使い方

概要

HashiCorp VaultのKey/Valueの基本的な使い方を紹介します。
このKey/Valueは少し前にv2が出ているため、v1と混同しないよう注意してください。

今回はKey/Valueのバージョン管理が可能なv2を想定して説明します。

環境

  • Vault v0.10.4
  • KV Secrets Engine v2

設定

v2でパスkv/に用意します。

$ vault secrets enable -version=2 kv

ちなみにパスsecret/はv1のデフォルトになっているため、v2として使いたいときは

$ vault kv enable-versioning secret/

とします。

コマンド(基本)

kv put & kv get

追加コマンドです。

$ vault kv put kv/test hoge=fuga
Key              Value
---              -----
created_time     2018-08-06T22:00:25.880185038Z
deletion_time    n/a
destroyed        false
version          1

取得はkv getです。

$ vault kv get kv/test
====== Metadata ======
Key              Value
---              -----
created_time     2018-08-06T22:00:25.880185038Z
deletion_time    n/a
destroyed        false
version          1

==== Data ====
Key     Value
---     -----
hoge    fuga

注意として宣言的なコマンドなため、別フィールドをputしようとすると前のフィールドが消えます

$ vault kv put kv/test piyo=dazo
Key              Value
---              -----
created_time     2018-08-06T22:04:54.411033075Z
deletion_time    n/a
destroyed        false
version          2

もう一度取得してみましょう

$ vault kv get kv/test
====== Metadata ======
Key              Value
---              -----
created_time     2018-08-06T22:04:54.411033075Z
deletion_time    n/a
destroyed        false
version          2

==== Data ====
Key     Value
---     -----
piyo    dazo

前のキーhogeが消えています。

kv patch

上書きが嫌な場合はこのkv patchコマンドを使います。

$ vault kv patch kv/test piyo2=dazo2
Key              Value
---              -----
created_time     2018-08-06T22:05:53.719345063Z
deletion_time    n/a
destroyed        false
version          3

$ vault kv get kv/test
====== Metadata ======
Key              Value
---              -----
created_time     2018-08-06T22:05:53.719345063Z
deletion_time    n/a
destroyed        false
version          3

==== Data ====
Key      Value
---      -----
piyo     dazo
piyo2    dazo2

前のキーを残したまま保存できました。

まだドキュメントには明記されてないですが以下のプルリクでマージされてます。

github.com

kv delete

deleteをすると論理削除が行われます。

$ vault kv delete kv/test
Success! Data deleted (if it existed) at: kv/test

取得しても返ってきません。

$ vault kv get kv/test
====== Metadata ======
Key              Value
---              -----
created_time     2018-08-06T22:05:53.719345063Z
deletion_time    2018-08-06T22:09:28.872598368Z
destroyed        false
version          3

v2はバージョン管理されてますが、deleteしたから自動で古いバージョンが返るようになるかというと、そうではありませんので注意してください。

コマンド(応用)

kv get -version=n

KVのv2ではバージョン管理が行えるため、古いバージョンの値を取得することが可能です。

$ vault kv get -version=1 kv/test
====== Metadata ======
Key              Value
---              -----
created_time     2018-08-06T22:00:25.880185038Z
deletion_time    n/a
destroyed        false
version          1

==== Data ====
Key     Value
---     -----
hoge    fuga

kv undelete

deleteは論理削除と言いました。なので戻すことも可能です。

$ vault kv undelete -versions=3 kv/test
Success! Data written to: kv/undelete/test

$ vault kv get kv/test
====== Metadata ======
Key              Value
---              -----
created_time     2018-08-06T22:05:53.719345063Z
deletion_time    n/a
destroyed        false
version          3

==== Data ====
Key      Value
---      -----
piyo     dazo
piyo2    dazo2

kv destroy

deleteは論理削除と言いましたが、destroyは完全に削除します。

$ vault kv destroy -versions=2 kv/test
Success! Data written to: kv/destroy/test

$ vault kv get -version=2 kv/test
====== Metadata ======
Key              Value
---              -----
created_time     2018-08-06T22:04:54.411033075Z
deletion_time    n/a
destroyed        true
version          2

undeleteしても戻りません。

$ vault kv undelete -versions=2 kv/test
Success! Data written to: kv/undelete/test

$ vault kv get -version=2 kv/test
====== Metadata ======
Key              Value
---              -----
created_time     2018-08-06T22:04:54.411033075Z
deletion_time    n/a
destroyed        true
version          2

destroy自動で古いバージョンが返ってくるわけじゃないので注意してください。単に空のレスポンスです。

kv rollback

まだドキュメントには書かれてませんが、以下のプルリクでrollbackができるようになってます。

github.com

間違ってkv patchしてしまっても特定のフィールドを消せず不便に感じていましたが、このrollbackによって前のバージョンの状態に戻すことが容易になったので問題が解消されました。

$ vault kv rollback -version=1 kv/test
Key              Value
---              -----
created_time     2018-08-06T22:15:58.888084232Z
deletion_time    n/a
destroyed        false
version          4

$ vault kv get kv/test
====== Metadata ======
Key              Value
---              -----
created_time     2018-08-06T22:15:58.888084232Z
deletion_time    n/a
destroyed        false
version          4

==== Data ====
Key     Value
---     -----
hoge    fuga

のように使います。
ロールバックしたKey/Value新しいバージョンとして保存されます。

kv metadata

バージョンをいくつまで保持するか、といった設定も可能です。
現状は上限がないため4つ保持していますが、

$ vault kv metadata get kv/test
======= Metadata =======
Key                Value
---                -----
cas_required       false
created_time       2018-08-06T22:00:25.880185038Z
current_version    4
max_versions       0
oldest_version     0
updated_time       2018-08-06T22:15:58.888084232Z

====== Version 1 ======
Key              Value
---              -----
created_time     2018-08-06T22:00:25.880185038Z
deletion_time    n/a
destroyed        false

====== Version 2 ======
Key              Value
---              -----
created_time     2018-08-06T22:04:54.411033075Z
deletion_time    n/a
destroyed        true

====== Version 3 ======
Key              Value
---              -----
created_time     2018-08-06T22:05:53.719345063Z
deletion_time    n/a
destroyed        false

====== Version 4 ======
Key              Value
---              -----
created_time     2018-08-06T22:15:58.888084232Z
deletion_time    n/a
destroyed        false

ここで1つしか保持しないとします

$ vault kv metadata put -max-versions 1 kv/test
Success! Data written to: kv/metadata/test

この時点ではまだ古いデータも取得可能ですが、新しいデータを入れると

$ vault kv put kv/test meta=test
Key              Value
---              -----
created_time     2018-08-06T22:17:55.618939739Z
deletion_time    n/a
destroyed        false
version          5

$ vault kv metadata get kv/test
======= Metadata =======
Key                Value
---                -----
cas_required       false
created_time       2018-08-06T22:00:25.880185038Z
current_version    5
max_versions       1
oldest_version     5
updated_time       2018-08-06T22:17:55.618939739Z

====== Version 5 ======
Key              Value
---              -----
created_time     2018-08-06T22:17:55.618939739Z
deletion_time    n/a
destroyed        false

このようにmetadataも1つしか出なくなり、kv getしても

$ vault kv get -version=1 kv/test
No value found at kv/data/test

古いデータは取得できなくなります。

ソース