厨师:encryption数据包,保护encryption密钥

当您为Chef使用encryption的数据包function时,您如何将密钥部署到许多服务器? 如果你把它变成一个配方,任何有权访问任何厨师服务器或客户端的人都可以取得密钥,并可能解密任何数据库。

你如何确保钥匙在需要它的机器上,而且还可以避免任何人窥探?

不幸的是,你可以做的事情并不多,因为关键需要以纯文本forms在主厨节点上。 如果某人拥有shell或本地访问权限,那么他们可能会读取密钥。

为了缓解一些问题,我把以下内容添加到我的基本节点(即所有节点通用的一些配方或angular色):

directory "/etc/chef/keys" do mode 0700 owner "root" group "root" end 

而且无论你把钥匙放在那个位置上的钥匙分配机制。 如果有人忘记在密钥文件上放置正确的权限,则权限和所有权会阻止读取密钥。

正如我所看到的那样,encryption的数据包更多的是保护关键资料不被源控制系统读取,而更less作为Chef节点本身的安全特性。

我的教育局由以下分开:

  • 环境
  • angular色

我们将所有带有特殊后缀的密钥上传到每个新的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理密钥,我正在使用以下简单的方法:

  • 通过引导脚本上传所有的EDB密钥,并附加'_x'到密钥名称
  • 让每个使用EDB的配方在密钥目录中查找所需的密钥。
  • 如果密钥以'_x'后缀存在,则重命名该密钥以除去'_x'后缀。
  • 在每个run_list的末尾添加一个配方,用'_x'后缀删除所有的密钥

有希望的是,这限制了在单个节点范围之外的密钥容易受到感染的时间,直到机器被引导并且具有第一次运行的chef_client。

这是我们第一次testing如何保护密钥,但是到目前为止,它已经满足了我们当前的需求,因为它可以防止一个有根的开发服务器能够立即访问存储在EDB中的任何其他服务器证书。

为了在每个运行列表的末尾保持一个配方,我使用了一个knife exec作业,确保这个delete_keys配方恰好是每个节点上的最后一个配方。

我的密钥被烘焙到我们使用的AMI或我们使用的图像中。 由于数据不安全,我不这样做是引导的一部分。 如果您不小心,通常可以在日志中查看数据。