当您使用 Chef 的加密数据包功能时,您如何将密钥部署到多台服务器?如果您将其放入配方中,则任何有权访问任何 Chef 服务器或客户端的人都可以提取密钥并可能解密任何数据包。
如何确保密钥位于需要它的机器上,同时又不被任何人窥探?
答案1
不幸的是,您能做的并不多,因为密钥需要以纯文本形式存放在 Chef 节点上的某个位置。如果有人拥有 shell 或对盒子的本地访问权限,那么他们可能能够读取密钥。
为了稍微缓解一下情况,我将以下内容添加到我的基节点(即所有节点共有的一些配方或角色):
directory "/etc/chef/keys" do
mode 0700
owner "root"
group "root"
end
并且无论您使用哪种密钥分发机制,密钥都会放在该位置。如果有人忘记在密钥文件上设置正确的权限,权限和所有权将阻止读取密钥。
在我看来,加密数据包更多的是为了保护密钥材料不被源代码控制系统读取,而不是作为 Chef 节点本身的安全功能。
答案2
我的 EDB 分隔符为:
- 环境
- 角色
在引导每个新的 EC2 实例时,我们将所有带有特殊后缀的密钥上传到它,然后在 chef-client 第一次运行结束时(实例启动时就正确)删除 run_list 中任何配方都未使用的所有密钥。
所有文件均以所有者和组“root”身份上传,并且仅具有读取权限。
每个使用 EDB 的配方都会在配方运行时通过连接“edb_”+节点环境+配方/项目特定名称+“.key”来生成 EDB 名称和密钥文件名,然后通过此名称查找密钥。(如果不存在,则默认抛出异常。)
因此,对于我们的 couchdb 服务器,运行一个名为“couch”的角色,以获取我们在开发环境中为管理员用户使用的凭据,配方会查找名为“edb_dev_couch.key”的密钥
然后,它在名为“edb_dev”的数据包中搜索名为“couch_credentials”的项目。
对于管理密钥,我目前使用以下简单方法:
- 通过引导脚本上传所有 EDB 密钥,并将“_x”附加到密钥名称
- 让每个使用 EDB 的配方在密钥目录中查找所需的密钥。
- 如果密钥存在且带有“_x”后缀,则重命名该密钥以删除“_x”后缀。
- 在每个 run_list 末尾添加一个配方,删除所有带有“_x”后缀的键
希望这可以限制单个节点范围之外的密钥易受攻击的时间,直到机器引导并首次运行 chef_client。
这是我们对如何保护密钥的第一轮测试,但到目前为止,它满足了我们当前的需求,因为它可以防止一个根开发服务器立即访问存储在 EDB 中的任何其他服务器凭据。
为了保持每个运行列表末尾都有一个配方,我使用 knife exec 作业来确保这个 delete_keys 配方恰好是每个节点上的最后一个配方。
答案3
我的密钥嵌入到我们使用的 AMI 或我们使用的图像中。我不会将其作为引导程序的一部分,因为这些数据不安全。如果您不小心,通常可以在日志等中看到数据。