kv这种engine还有一个很有意思的功能:Versioning,即每个path上的键-值对(key-value pair)都可以保存多个版本,即每次不会直接override旧的值,而是加入一个新的版本,这个功能叫做versioning,这和aws s3 object的versioning功能很像很像。kv刚出现时是没有这个功能的,那时的版本现在称为KV Version 1,而如果不指定任何版本,Vault的dev版默认启动的secret/会用最新版kv,即Version 2,也就是有了这个Versioning功能的版本。上一张的例子中csubc/这个engine就是没有启动versioning的,下面主要讲解和对比v2的versioning。
vault server -dev
vault secrets enable -version=2 -path=bank/ kv # 启动path为bank/的kv-v2
vault secrets enable -path=bank/ kv-v2 # 一样的也是启动v2的kv
vault kv put bank/saving/0 password=notverystrongpassword
vault kv get bank/saving/0
观察这里和csubc/路径下get出来的不同,多了很多信息:
多出来的这些称为这个kv的metadata,即形容这个kv的data。其中可看到“version”字段为1,表示这是它的第一个版本。而kv get会默认返回version最大的值,如果想要取出某个过去的值的话,就要添加“-version=version_number”。接下来可以增加更多的版本:
vault kv put bank/saving/0 password=betterpassword1234
vault kv put bank/saving/0 password=111111 # 手残了
然后会看到password更新了,并且version变为了3,因为bank/saving/0已经写入了三次值。最后一次时不小心写入了一个很危险的密码,那怎样删掉他呢?我们只希望删掉这一个版本,却希望保留别的版本,这是要指定删除的版本:
vault kv delete -versions=3 bank/saving/0
vault kv get -version=3 bank/saving/0 # 再看看第3版的值
这是会发现,version为3的值已经不见了,只剩下metadata。这里虽然删除了第3版的值,但并不是说下一个值会取代第3版:
vault kv put bank/saving/0 password=c001pa33word # 此时version将为4
vault kv get -version=3 bank/saving/0
version 3的值依旧是空的,这里的值其实还在,只是被标记为deleted,这种方式俗称tombstone,及并不删除值,也不会因而更改其他值的位置。那也就是说,如果哪天你还想看到过去狠心删去的值:
vault kv undelete -versions=3 bank/saving/0 # 复活
vault kv get -version=3 bank/saving/0
所以说delete只是在试图掩盖过去的不堪,要真正做到断舍离的话可使用kv destroy:
vault kv destroy -versions=3 bank/saving/0 # 永久删除这个版本
这时可以尝试:
vault kv undelete -versions=3 bank/saving/0 # 试着复活
然后Vault还会好心的忽悠你一下并提示:"Success! Data written to: bank/undelete/saving/0",但是version 3永远不会回来了,很真实。