前回のエントリの残件だった「更新」と「削除」についてまとめ。
CLIはサブコマンド毎にページが分かれてるけど、RESTは全部以下に集約されてる。
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の場合は以下で、DELETE
でAPIをたたく。
$ 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するとこの通り、destroyed
がtrue
になっている。
/ $ 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になる。