当您为Chef使用encryption的数据包function时,您如何将密钥部署到许多服务器? 如果你把它变成一个配方,任何有权访问任何厨师服务器或客户端的人都可以取得密钥,并可能解密任何数据库。
你如何确保钥匙在需要它的机器上,而且还可以避免任何人窥探?
不幸的是,你可以做的事情并不多,因为关键需要以纯文本forms在主厨节点上。 如果某人拥有shell或本地访问权限,那么他们可能会读取密钥。
为了缓解一些问题,我把以下内容添加到我的基本节点(即所有节点通用的一些配方或angular色):
directory "/etc/chef/keys" do mode 0700 owner "root" group "root" end
而且无论你把钥匙放在那个位置上的钥匙分配机制。 如果有人忘记在密钥文件上放置正确的权限,则权限和所有权会阻止读取密钥。
正如我所看到的那样,encryption的数据包更多的是保护关键资料不被源控制系统读取,而更less作为Chef节点本身的安全特性。
我的教育局由以下分开:
我们将所有带有特殊后缀的密钥上传到每个新的EC2实例中,然后在第一次chef-client运行结束时删除run_list中任何配方都没有使用的所有密钥(这将是正如实例开始。)
所有文件都作为所有者和组“root”上载,并且只具有读取权限。
每个使用EDB的配方,通过连接'edb_'+节点环境+配方/项目特定名称+'.key',在配方运行时生成EDB名称和密钥文件名,然后通过该名称查找关键字。 (如果不存在,则默认情况下会引发exception。)
因此,对于我们的couchdb服务器,运行一个名为“couch”的angular色来获取我们在开发环境中为pipe理用户使用的凭证,配方会查找名为“edb_dev_couch.key”的密钥,
然后search名为“edb_dev”的数据包,查找名为“couch_credentials”的项目。
为了pipe理密钥,我正在使用以下简单的方法:
有希望的是,这限制了在单个节点范围之外的密钥容易受到感染的时间,直到机器被引导并且具有第一次运行的chef_client。
这是我们第一次testing如何保护密钥,但是到目前为止,它已经满足了我们当前的需求,因为它可以防止一个有根的开发服务器能够立即访问存储在EDB中的任何其他服务器证书。
为了在每个运行列表的末尾保持一个配方,我使用了一个knife exec作业,确保这个delete_keys配方恰好是每个节点上的最后一个配方。
我的密钥被烘焙到我们使用的AMI或我们使用的图像中。 由于数据不安全,我不这样做是引导的一部分。 如果您不小心,通常可以在日志中查看数据。