私密信息管理工具 Vault 快速入门
什么是 Vault
Vault 是一个基于身份的秘密和加密管理系统。秘密是您想要严格控制访问的任何内容,例如 API 加密密钥、密码和证书。 Vault 提供由身份验证和授权方法控制的加密服务。使用 Vault 的 UI、CLI 或 HTTP API,可以安全地存储和管理、严格控制(限制)和审核对机密和其他敏感数据的访问。
为什么需要 Vault
执行密码轮换策略很痛苦
掌握机密的员工离职后可能泄密或是恶意报复
开发者不小心把机密信息随着代码上传到公网的源码仓库造成泄密
管理多个系统的机密非常麻烦
需要将机密信息安全地加密后存储,但又不想将密钥暴露给应用程序,以防止应用程序被入侵后连带密钥一起泄漏
Vault 架构图
Vault 只暴漏了存储后端(Storage Backend) 和 API,其他部分都被保护起来了。Vault 并不信任后端存储,存放的都是密文。

安装
此处以 Mac 为例,其他平台参考官方文档Vault 安装向导
启动 Vault(Dev 模式)
查看服务状态
写入第一个密码
如果报这个错误:
vault write kv/infini value=infinilabs
Error writing data to kv/cheng: Error making API request.URL: PUT http://127.0.0.1:8200/v1/kv/cheng
Code: 404. Errors:
no handler for route 'kv/cheng'
是因为 kv 存储没有启动(不同版本默认初始设置不同),执行:
读取一条数据
使用 Consul 作为数据存储的 Backend
Vault 自身不存储数据,需要提供存储后台。 支持多种后台。
启动 Consul
启动 Vault(生产模式)
创建配置文件,使用刚刚启动的 Consul 作为存储后台。
注意: 这种方式启动,为生产模式,需要手动配置和管理秘钥。
执行命令,启动
注意: 此时虽然服务启动了,但是 Vault 处于封印状态(sealed), 不可用。
此时我们执行操作,会看到如下提示:
上面 Dev 模式启动的 Vault 实际上帮助我们自动地把创建主密钥、解封的步骤都完成了。生产模式,则需要手动配置后续步骤。
补充点小知识

Vault 保存在 Backend 中的数据都是加密的
Vault 密钥称为 Master Key 主密钥,Vault 默认使用 Shamir 算法,把主密钥切分成 M 份,管理员必须至少提供其中的 N 份才能还原出主密钥(这里的 M 和 N 都是可配置的,M>=N)理想状态下,我们必须把这 M 份密钥分配给公司内 M 个不同的人,只有在获取其中 N 个人的授权后,Vault 才可以成功解密主密钥。
Vault 初始化(生产模式)
注意看,接下来的步骤,会生成 5 个秘钥,一个 Root 用户的 Token。真实场景下,这 5 个秘钥会分配给 5 个不同的人员管理。 至少正确输入 3 个秘钥,才能解封 Vault。
热知识: Vault 每次启动/重启,都会进入封印状态,未解封时,几乎无法执行任何操作。
Vault 默认访问 https 的地址,所以如果执行初始化报如下错误:
设置一下 Vault 地址即可,执行:
export VAULT_ADDR='http://127.0.0.1:8200'
查看 Vault 状态
此时 Vault 处于封印状态(Sealed 为 true)
解封 Vault
使用需要 vault operator unseal 命令来执行解封。至少需要 3 个秘钥来解封。
注意: 每次输入一个秘钥,会看到如上提示"Unseal Progress 1/3"。 但是,这里仅仅表示已经输入多少个秘钥,并不代表输入的秘钥都是正确的!!
如何使用 Vault 保存秘密
进入下一步之前,先来看看 Vault 提供了哪些措施,用来保护我们的秘密?
秘钥的保护机制: 秘钥被拆分成 5 份,至少正确输入 3 个才能解封。
策略控制(权限控制): 可以针对每个 Path 设置策略。
有效期: Vault 生成的每个令牌(Token)都有有效期。
开始前,我们先写入 2 条测试数据:
热知识:
"kv/infini" 是一个 Path(路径), 可以简单理解为数据库中的一个表。并不是 kv 数据库 当中的 key。你可以试试这样存数据并读取:
制定策略
新建策略文件
输入以下内容
解释: 以上策略,是指在 infini 这个路径(path)下,具有只读权限。
创建策略
先登录已经解封的 Vault(使用初始化生成的 root token 登录)
"infini-readonly" 是策略的名称,这个可以自定义
生成 Token 并指定策略
生成对"kv/infini"具有只读权限的 Token, 执行:
此处生成了新的 Token: s.bHzsfREs9MGirYO8yZ2TbAzq, 有效期 768 小时(别拿计算器了,我算过了,32 天)
使用新生成的 Token 登录(别找退出操作了,直接再执行 login 即可):
验证新生成的 Token
尝试读 kv/infini 的秘密:
Wow!成功读取!
试试写入操作
有个疑问,你说当前这个 Token,可以读取 kv/ck 的秘密吗?
啊欧! 不行~
OK, 到这里了,简单的对 Vault 做了个入门。 Vault 的功能点还有很多,去看看下面的文档吧~~