Chef:加密的数据袋,保护加密密钥


8

当您为Chef使用加密数据包功能时,如何将密钥部署到许多服务器上?如果将其放入食谱中,则有权访问任何厨师服务器或客户端的任何人都可以拉出密钥并可能解密任何数据包。

您如何确保密钥在需要它的机器上,而且还可以防止他人窥探?

Answers:


8

不幸的是,您实际上无能为力,因为密钥需要以纯文本格式位于Chef节点上的某个位置。如果某人对盒子有外壳或本地访问权限,则他们可能会读取密钥。

为了减轻一些麻烦,我将以下内容添加到我的基节点(即,所有节点共有的某些配方或角色):

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

以及您采用的任何密钥分发机制都会将密钥放在该位置。如果有人忘记将正确的权限放在密钥文件上,则权限和所有权会阻止读取密钥。

正如我所看到的,加密的数据包更多地是为了防止密钥材料在源代码控制系统中被读取,而不是Chef节点本身的安全功能。


3

我的EDB被下列分隔:

  • 环境
  • 角色

当我们引导它时,我们会将带有特殊后缀的所有密钥上载到每个新的EC2实例,然后在厨师客户端第一次运行结束时删除run_list中任何配方未使用的所有密钥(这将是在实例启动时正确显示。)

所有文件均以所有者和组“ root”的身份上载,并且只有读取权限。

每个使用EDB的配方,在配方运行时通过连接'edb_'+节点环境+配方/特定于项目的名称+'.key'来生成EDB名称和密钥文件名,然后通过该名称查找密钥。(如果不存在,则默认情况下会引发异常。)

因此,对于我们的ouchdb服务器,运行一个名为“ couch”的角色,以获取我们用于开发环境中的管理员用户的凭据,此配方将查找一个名为“ edb_dev_couch.key”的密钥。

然后,它在名为“ edb_dev”的数据袋中搜索名为“ couch_credentials”的项目。

为了管理密钥,我目前正在使用以下简单方法:

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

希望这可以限制单个节点范围之外的键在启动机器并首次运行chef_client之前受到影响的时间。

这是我们第一轮测试如何保护密钥的方法,但是到目前为止,它满足了我们当前的需求,因为它阻止了一个植根的dev服务器能够立即访问存储在EDB中的任何其他服务器凭据。

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


0

我的密钥被烘焙到我们使用的AMI或我们使用的图像中。我不将其作为引导程序的一部分,因为数据不安全。通常,您可以在日志中查看数据,如果不小心的话,也可以查看。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.