zaki work log

作業ログやら生活ログやらなんやら

[HashiCorp Vault] KVシークレットエンジンのデータの更新と削除メモ (CLI/REST)

前回のエントリの残件だった「更新」と「削除」についてまとめ。

zaki-hmkc.hatenablog.com

CLIはサブコマンド毎にページが分かれてるけど、RESTは全部以下に集約されてる。

developer.hashicorp.com

update

データの更新は、単に対象のKVシークレットエンジンへのデータ書き込みを再度実行すれば良い。
writeを実行するたびにversionが更新されていく。

CLI

kv put - Command | Vault | HashiCorp Developer

初期データ(version 1)

/ $ vault kv put -mount=sample-kv-secret server username=zaki password=curry_tabetai host=192.168.10.10
======== Secret Path ========
sample-kv-secret/data/server

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-29T05:30:11.515903469Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1
/ $

同じserverへデータを追加putする

/ $ vault kv put -mount=sample-kv-secret server username=zaki password=curry_tabetaina host=192.168.10.10
======== Secret Path ========
sample-kv-secret/data/server

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-29T05:30:19.847267254Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            2
/ $ 

この通りversion 2になる。

REST

RESTの場合もCLI同様に同じキーへ書き込む。

$ curl -s -H "X-Vault-Token: $VAULT_TOKEN" \
  -X POST \
  -d '{ "data": { "username":"zaki", "password":"curry_tabetaiyo!", "host":"192.168.10.10" } }' \
  http://192.168.0.12:8200/v1/sample-kv-secret/data/server
{"request_id":"8b11461d-0818-6656-46a6-8b40da0b7f3e","lease_id":"","renewable":false,"lease_duration":0,"data":{"created_time":"2024-07-29T08:08:16.453487783Z","custom_metadata":null,"deletion_time":"","destroyed":false,"version":3},"wrap_info":null,"warnings":null,"auth":null,"mount_type":"kv"}

CLIで更新したserverへPOSTすることで、version 3となった。

delete

kv delete - Command | Vault | HashiCorp Developer

latest(最新)バージョンの削除

初期状態は以下、version=3のデータまで保存されている。

/ $ vault kv get -mount=sample-kv-secret server
======== Secret Path ========
sample-kv-secret/data/server

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-29T08:08:16.453487783Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            3

====== Data ======
Key         Value
---         -----
host        192.168.10.10
password    curry_tabetaiyo!
username    zaki
/ $

ここで最新バージョンのデータを削除するには以下を実行。

/ $ vault kv delete -mount=sample-kv-secret server
Success! Data deleted (if it existed) at: sample-kv-secret/data/server

するとlatestであるversion=3のデータが削除される。

/ $ vault kv get -mount=sample-kv-secret server
======== Secret Path ========
sample-kv-secret/data/server

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-29T08:08:16.453487783Z
custom_metadata    <nil>
deletion_time      2024-07-31T00:33:09.784974867Z
destroyed          false
version            3

/ $ 

「最新がversion=2になる」のではなく、「version=3は削除済み」という状態になるのが正しい表現かな?
version=2はこの通りデータを確認できる。

/ $ vault kv get -mount=sample-kv-secret -version=2 server
======== Secret Path ========
sample-kv-secret/data/server

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-29T05:30:19.847267254Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            2

====== Data ======
Key         Value
---         -----
host        192.168.10.10
password    curry_tabetaina
username    zaki
/ $ 

RESTの場合は以下で、DELETEAPIをたたく。

$ curl -s -H "X-Vault-Token: $VAULT_TOKEN" \
  -X DELETE \
  http://192.168.0.12:8200/v1/sample-kv-secret/data/server

レスポンスボディはなく、応答コードは204となる。

指定バージョンの削除

version=2を削除する場合は以下。

/ $ vault kv delete -mount=sample-kv-secret -versions=2 server
Success! Data deleted (if it existed) at: sample-kv-secret/data/server
/ $ 

これでversion=2のデータも削除済み状態となる。

/ $ vault kv get -mount=sample-kv-secret -version=2 server
======== Secret Path ========
sample-kv-secret/data/server

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-29T05:30:19.847267254Z
custom_metadata    <nil>
deletion_time      2024-07-31T01:10:27.66996371Z
destroyed          false
version            2

/ $ vault kv get -mount=sample-kv-secret -version=1 server
======== Secret Path ========
sample-kv-secret/data/server

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-29T05:30:11.515903469Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            1

====== Data ======
Key         Value
---         -----
host        192.168.10.10
password    curry_tabetai
username    zaki
/ $ 

-versionでなく-versionsであることに注意。

/ $ vault kv delete -mount=sample-kv-secret -version=2 server
flag provided but not defined: -version

RESTの場合は以下で、POSTでバージョンをリクエストする。
エンドポイントも若干変更され、/data/でなく削除用の/delete/になる。

$ curl -s -H "X-Vault-Token: $VAULT_TOKEN" \
  -X POST \
  -d '{ "versions": [2] }' \
  http://192.168.0.12:8200/v1/sample-kv-secret/delete/server

これもlatestの削除同様にレスポンスボディは無く、応答コードは204となる。

削除データの復元

deleteで削除したデータは復元することができる。

/ $ vault kv undelete -mount=sample-kv-secret -versions=3 server
Success! Data written to: sample-kv-secret/undelete/server

以下の通り削除したデータが復元される。

/ $ vault kv get -mount=sample-kv-secret -version=3 server
======== Secret Path ========
sample-kv-secret/data/server

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-29T08:08:16.453487783Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          false
version            3

====== Data ======
Key         Value
---         -----
host        192.168.10.10
password    curry_tabetaiyo!
username    zaki
/ $ 

RESTの場合は以下で、削除のときと書式は同じでエンドポイントが/undelete/になる。
以下はversion 2と3をまとめて復元する場合。

$ curl -s -H "X-Vault-Token: $VAULT_TOKEN" \
  -X POST \
  -d '{ "versions": [2, 3] }' \
  http://192.168.0.12:8200/v1/sample-kv-secret/undelete/server

これもレスポンスボディはなく、応答コードは204

シークレットキーもろとも削除

ここまでの例でいうとserver毎削除するには、metadataを削除する。

/ $ vault kv metadata delete -mount=sample-kv-secret server
Success! Data deleted (if it existed) at: sample-kv-secret/metadata/server
/ $ 

これでデータが消える。

/ $ vault kv get -mount=sample-kv-secret server
No value found at sample-kv-secret/data/server
/ $ 

RESTの場合は以下の通りで、/metadata/に対してDELETEする。

$ curl -s -H "X-Vault-Token: $VAULT_TOKEN" \
  -X DELETE \
  http://192.168.0.12:8200/v1/sample-kv-secret/metadata/server

これもレスポンスボディはなく、応答コードは204になる。

destroy

deleteと異なり永久に削除され、復元も不可。

CLI

kv metadata - Command | Vault | HashiCorp Developer

/ $ vault kv destroy -mount=sample-kv-secret -versions=3 server
Success! Data written to: sample-kv-secret/destroy/server

getするとこの通り、destroyedtrueになっている。

/ $ vault kv get -mount=sample-kv-secret -version=3 server
======== Secret Path ========
sample-kv-secret/data/server

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-29T08:08:16.453487783Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          true
version            3

/ $ 

ここでundeleteすると見た目成功したように見えるけど仕様なのかな?

/ $ vault kv undelete -mount=sample-kv-secret -versions=3 server
Success! Data written to: sample-kv-secret/undelete/server
/ $ vault kv get -mount=sample-kv-secret -version=3 server
======== Secret Path ========
sample-kv-secret/data/server

======= Metadata =======
Key                Value
---                -----
created_time       2024-07-29T08:08:16.453487783Z
custom_metadata    <nil>
deletion_time      n/a
destroyed          true
version            3

/ $ 

REST

RESTでversion 3をdestroyするには以下で、PUTを使用する。

$ curl -s -H "X-Vault-Token: $VAULT_TOKEN" \
  -X PUT \
  -d '{ "versions": [3] }' \
  http://192.168.0.12:8200/v1/sample-kv-secret/destroy/server

他の削除系と同じくレスポンスボディは無く、応答コードは204になる。