Answers:
不幸的是,您实际上无能为力,因为密钥需要以纯文本格式位于Chef节点上的某个位置。如果某人对盒子有外壳或本地访问权限,则他们可能会读取密钥。
为了减轻一些麻烦,我将以下内容添加到我的基节点(即,所有节点共有的某些配方或角色):
directory "/etc/chef/keys" do
mode 0700
owner "root"
group "root"
end
以及您采用的任何密钥分发机制都会将密钥放在该位置。如果有人忘记将正确的权限放在密钥文件上,则权限和所有权会阻止读取密钥。
正如我所看到的,加密的数据包更多地是为了防止密钥材料在源代码控制系统中被读取,而不是Chef节点本身的安全功能。
我的EDB被下列分隔:
当我们引导它时,我们会将带有特殊后缀的所有密钥上载到每个新的EC2实例,然后在厨师客户端第一次运行结束时删除run_list中任何配方未使用的所有密钥(这将是在实例启动时正确显示。)
所有文件均以所有者和组“ root”的身份上载,并且只有读取权限。
每个使用EDB的配方,在配方运行时通过连接'edb_'+节点环境+配方/特定于项目的名称+'.key'来生成EDB名称和密钥文件名,然后通过该名称查找密钥。(如果不存在,则默认情况下会引发异常。)
因此,对于我们的ouchdb服务器,运行一个名为“ couch”的角色,以获取我们用于开发环境中的管理员用户的凭据,此配方将查找一个名为“ edb_dev_couch.key”的密钥。
然后,它在名为“ edb_dev”的数据袋中搜索名为“ couch_credentials”的项目。
为了管理密钥,我目前正在使用以下简单方法:
希望这可以限制单个节点范围之外的键在启动机器并首次运行chef_client之前受到影响的时间。
这是我们第一轮测试如何保护密钥的方法,但是到目前为止,它满足了我们当前的需求,因为它阻止了一个植根的dev服务器能够立即访问存储在EDB中的任何其他服务器凭据。
为了在每个运行列表的末尾保持一个配方,我使用了刀执行作业,以确保此delete_keys配方恰好是每个节点上的最后一个配方。
我的密钥被烘焙到我们使用的AMI或我们使用的图像中。我不将其作为引导程序的一部分,因为数据不安全。通常,您可以在日志中查看数据,如果不小心的话,也可以查看。