加密引擎(Secrets Engine)是Vault架构中非常重要的一个组件,它负责管理存储在Vault中的所有私密信息,包括静态密码的存储、动态密码的生成以及数据的加密。它支持多种加密引擎,云资源包括AliCloud,AWS,Azure,Google Cloud等,数据库包括Elastic Search、MySql、PostgreSql、MongoDB等,以及RabbitMQ、PKI等等。Vault不仅可以存储静态数据,也可以动态生成具有时效性的token或access key来访问数据库或云资源,并且可以周期性的自动更新密码。Vault使用AES-GCM生成256位随机数对数据进行加密并写入持久化存储,所以存储后端看不到原始数据,即使有攻击者直接访问了存储后端,也并不能读到原始信息。
kv加密引擎是Vault 所有支持的加密引擎中最基础的一个,用来存储静态key-vaule类型密码、api key、 数据库证书等。目前kv引擎支持v1和v2两个版本,v1和v2的区别是v2支持多版本的私密信息存储以及回滚,防止多人写时覆盖,默认支持10个版本的存储, 旧版本的私密信息也可以被查找。Vault中对于动态生成的密码以及认证token等,有一个租期(lease)的概念,即TTL(time to live),过期的信息会被更新或回收,也可以在任意时刻使用Vault revoke命令来手动回收。但是存储在KV引擎中的私密信息永远不会自动过期,即使设置了TTL,也只是给用户一个参考。
利用开发模式启动的Vault,默认是v2版本,非开发模式,默认是v1,可以通过CLI命令来设置启用哪个版本:
启用kv引擎时指定v2版本:
$ vault secrets enable -version=2 kv 或者 $ vault secrets enable kv-v2
如果当前kv secret engine的版本是v1,那么可以使用命令
$vault kv enable-versioning secret/ 去升级到v2, [secret/]是我们要升级的kv引擎的路径。
下面再介绍一些使用kv加密引擎的常用CLI命令:
1. 查看当前Vault所启用的加密引擎:
$ vault secrets list
或者$ vault secrets list -detaild 可以查看详细信息,比如租期设置,版本等。
$ vault kv list secret 列出kv引擎secret下的所有路径
2. 启用kv加密引擎
$ vault secrets enable kv 相当于 $ vault secrets enable -path=kv kv
即在路径kv下启用一个kv类型的加密引擎,还可以加-max-lease-ttl,-plugin-name,-description等参数,更多参数详细信息可以使用vault secrets enable path -help来查看。如果设置成功会出现 Success! Enabled the kv secrets engine at: kv/
3. 写入私密信息
$ vault kv put kv/personal name=jiayin, age=24
向[kv/personal]路径下写入了两个键值对信息。
$ vault kv patch kv/personal hobby=music 和put不同,patch命令会同时保留之前的信息和新写入的信息。
再次向相同路径写入会生成新版本的私密信息,version号码也会随着递增。
如果是写入文件,则在value前加上@符号,如
$ vault kv put kv-v1/prod/cert/mysql cert=@cert.pem 或者$ vault kv put secret/foo @data.json
4. 查找某一版本的私密信息
$ vault kv get -version=3 kv/personal
如果没有版本参数,默认检索出最新版本的信息。
5. 查看某路径下的元数据
$ vault kv metadata get kv/personal 【kv/personal 】是想要查看的存储路径
会列出当前kv加密引擎以及每一个版本的创建时间。
6. 设置kv-v2保存的信息最大版本数
$ vault write kv/config max_versions=3 【kv】是要修改的kv引擎路径,向其下的config路径写入 max_versions=3
7. 设置某kv引擎某路径的最大版本数
$ vault kv metadata put -max-versions=4 kv/personal 【kv/personal】是具体的存储路径,可以用这个命令修改具体存储路径的配置而不是整个kv引擎的配置。
8. 读取某kv引擎下的配置信息
$ vault read kv/config
9.删除某些版本的私密信息
$ vault kv delete -versions="4,5" kv/personal 删除第4,5版本的数据
10. 恢复误删了的某些版本的信息
$ vault kv undelete -versions="4,5" kv/personal
11. 永久的删除某些版本的私密信息
$ vault kv destroy -versions=4 kv/personal 永久的删除使用destory命令
12. 删除某路劲下的所有私密信息
$ vault kv metadata delete kv/personal
13. 配置私密信息的自动删除
$ vault kv metadata put -delete-version-after=40s secret/test
使用delete-version-after参数可以配置自动删除私密信息的时间,注意在设置此参数之前存入的私密信息是不会在指定时间后删除的,设置之后存入的信息才会应用此参数。
14. 配置CAS(check and set)
$ vault write kv/config cas-required=true 即在整个kv引擎下设置CAS
$ vault kv metadata put -cas-required=true kv/partner 只在【kv/partner】路径下设置CAS
Check-And-Set 操作是Vault为防止多人协作导致的数据被覆盖问题提供的一个解决方案,当你不想要覆盖某路径下存在的信息,可以传入-cas=0,这样当某路径下已经存在信息的时候,你的写入操作会失败,错误码为400,error message: * check-and-set parameter did not match the current version。
当你非常确定想要覆盖某路径下的私密信息,即传入-cas=[verison],version为私密信息版本号。
如果不启用CAS操作,那么默认所有的写入操作都会被允许。
15. 回滚到某个指定版本的私密信息
$ vault kv rollback -version=2 kv/creds
将【kv/creds】路径下的私密信息的版本2恢复到当前最新版本,如果当前最新版本号是5,那么回滚之后的最新版本号将变成6。
Tips: 如果不想让自己输入的私密信息出现在shell history里,可以键入“-”然后enter,会另起一行写入密码,用Ctrl+d结束,或者将私密信息存入文件中。如果不想让跟Vault相关的所有命令出现在history里,可以执行
$export HISTIGNORE="&:vault*"
Vault提供REST API和CLI两种方式与之进行交互,并且Vaule的一切都是基于路径的,大部分Vault的CLI命令都会被转换成HTTP请求,而有些操作只能通过HTTP请求去完成。
关于KV引擎常用的HTTP方法有:
1. GET 读取某路径下的信息,包括配置信息和私密信息
eg. $ curl --header "X-Vault-Token: ..." https://127.0.0.1:8200/v1/secret/data/my-secret
2. POST 创建、更新或删除私密信息或配置
eg.$ curl --header "X-Vault-Token: ..." --request POST --data @payload.json https://127.0.0.1:8200/v1/secret/data/my-secret
eg.$ curl --header "X-Vault-Token: ..." --request POST --data @payload.json https://127.0.0.1:8200/v1/secret/delete/my-secret
3. LIST 查看某路径下的信息,会列出该路径下的key
eg.$ curl --header "X-Vault-Token: ..." --request LIST https://127.0.0.1:8200/v1/secret/metadata/my-secret