在configuration期间安全地将秘密部署到框

在物理硬件上进行完全自动部署(使用pxeboot / preseed / kickstart安装和configuration最小系统进行引导)期间,我们需要部署某些机密(如我们的Chefvalidation密钥)以及用于访问安全应用程序数据的密钥。

在我们的虚拟机环境中,我们可以使用已经存在的映像进行预先映像,所以当节点被部署时,它已经拥有了本地文件,并且不需要通过networking,但是对于直接从networking引导映像构build的物理服务器,我们没有能力做到这一点。

我试图想出一个安全和自动的方式将这些秘密部署到configuration好的服务器上,以这种方式我们知道他们不可能在错误的地方结束。

我们的configuration环境知道所有物理服务器以及它们是否configuration好 – 我们在Chef服务器上创build节点定义,包括用于PXE引导的主接口的MAC地址,然后在节点上设置一个标志已configuration。 我们使用这种方法仅将PXEBoot文件提供给尚未configuration的节点,因此我们可以在节点定义中指定这些框的释放/操作系统/angular色。

我们目前的工作思路是一个非常简单的Web服务(通过HTTPS)将服务的秘密节点尚未configuration。 然而这有一些缺点和我可以看到的问题。 我的主要担心是我们唯一的保护是MAC地址validation,MAC地址可以被欺骗(我强烈的意见,你永远不应该考虑你的内部networking安全,虽然这可能是一个不同的讨论)。

我们目前的configuration环境是在专用configuration服务器上使用PXEboot / Preseeding的Ubuntu 12.04和14.04,尽pipe我们可以调整其他解决scheme以适应我们的环境。

我主要关心所有节点都需要访问的全球秘密,我们理想的最终目标是没有这些全球性的秘密并且有每个节点的秘密,我目前正在研究一个工具来完成这个任务我们必须处理当前的设置。

那么人们如何安全地在供应环境中自动分发全球机密? 任何build议或指针的方法来做到这一点?

除了BMC(实现IPMI / iDRAC / iLO /等的主板上的小型子系统)之外,在操作系统之前的启动中除了BMC之外还没有太多的智能,但是这可能已经足够了,这取决于你想要信任多less。

你可以写一个密钥(通过networking使用一个encryption的IPMI 2.0通道,或者如果这不是一个选项,希望通过pipe理局域网或VLAN(bleah))在预启动序列,然后让服务器启动一个简单的启动操作系统,不包含任何秘密或机密内容的香草/存根操作系统。

启动后,原始服务器可以与自己的BMC进行通信(根本不需要在本地进行authentication),使用ipmitool或其他方法读取密钥,然后使用读取的密钥进行交谈,以确保它是谁说的是; 那么最终的供应可能开始。 使用这个(自由承认:))破解你也可以使用每个系统的个人密钥。

在BMC上存储密钥的可能位置包括MAC地址(每个以太网端口的密钥空间〜48位应该足够用于任何人(原文!)),SNMP社区string等。所有可以在初始configuration,并且很容易修改。

实现这个过程非常简单,一个脚本可以在每个服务器上生成密钥,一个ipmitool命令可以在目标上设置适当的密钥,一个小基本操作系统映像中的脚本,读取本地密钥并使用它们进行身份validation本身到母舰,然后是最终的configuration。 毫无疑问比平常更复杂的configuration,但有时你必须为安心付费。