使用Chef-Vault实现机密信息管理
Chef-vault 是一款以 加密数据包 为基础构建的 Chef 工具,可以减少解密密钥在所有用户和基础设施节点之间共享的需求。
在Chef基础结构中,加密数据包项是一种常用的机密信息(如密码或API密钥)存储方式。问题是,由于数据包是对称加密的,所以加密密钥(共享机密信息)需要分发给所有需要使用加密数据包的各方。
Chef-vault解决了这个问题,它使用每个需要访问加密数据包的用户和节点的公共密钥加密共享机密信息。由Chef服务器管理的每个节点及用户账户都有一个RSA密钥对。Chef服务器存储着公共密钥。Chef节点和用户工作站存储着私有密钥。
Chef-vault管理保险库。每个保险库有一个管理员(Chef用户)和客户端(Chef节点)的列表。只有这些管理员和客户端可以看到保险库的内容。一个保险库是一个数据包,包含两个数据包项。一个存储包含共享机密信息(比如数据库密码)的加密项。另一个存储管理员和客户端列表以及每个管理员和客户端的非对称加密共享机密信息。
每当chef-vault创建一个新的加密数据包,它首先会使用 SecureRandom.random_bytes 生成一个长为32个字节的随机字符串作为共享机密信息。然后,它会检索每个管理员和客户端的公共密钥,用它加密共享机密信息。这个过程减少了分发共享机密信息的需求,提供了一种更简单的方法控制对指定加密数据包项的访问。Chef-vault还提供了一个rotate_keys操作,顾名思义,它会新建一份共享机密信息,并使用所有管理员和客户端的公共密钥加密它。
Chef-vault有一些局限。至少这一次,它还不能很好地处理自动扩展,还需要人为增加或删除客户端(比如节点),或者像Peter Burkholder在一篇有关chef-vault的 文章 中所描述的那样,借助于“可以访问国王之钥的特权节点”。另外,无法替换已提供的密钥机制,不过, chef-vault 3.x.x 将会使用一个插件架构来解决这个问题。
机密信息管理是分布式可扩展环境的一个难题。Chef-vault是一款特定于Chef的工具,有好处也有不足。还有其他一些机密信息管理方案,有些是开源的,如Hashicorp的Vault或Square的 Keywhiz ,有些是商业的,如Amazon KMS或 Conjur 。
Nordstrom 是Chef-vault最初的开发者。该项目已于2015年11月转移到Chef项目之下,因此,有足够的资源维继它的开发。