在物理硬件上进行全自动部署期间(使用 pxeboot / preseed / kickstart 安装和配置用于引导的最小系统),我们需要部署某些秘密 - 例如我们的 Chef 验证密钥和用于访问安全应用程序数据的密钥。
在我们的 VM 环境中,我们可以预先烘焙这些图像,因此当部署节点时,它已经在本地拥有文件,并且它们无需跨越网络,但是对于我们直接从网络启动图像构建的物理服务器,我们没有能力做到这一点。
我正在尝试提出一种安全且自动化的方法,将这些秘密部署到已配置的服务器上,这样我们就知道它们不会出现在错误的地方。
我们的配置环境了解我们所有的物理服务器以及它们是否已配置 - 我们在 Chef 服务器中创建节点定义,其中包括用于 PXEBooting 的主要接口的 MAC 地址,然后在节点配置完成后在该节点上设置一个标志。我们使用它只向尚未配置的节点提供 PXEBoot 文件,因此我们可以在节点定义中指定盒子的版本 / 操作系统 / 角色。
我们目前的工作思路是提供一项非常简单的 Web 服务(通过 HTTPS)来将机密信息提供给尚未配置的节点。但是,我发现这存在许多缺点和问题。我主要担心的是,我们唯一的保护措施是 MAC 地址验证,而 MAC 地址可能会被伪造(我强烈认为您永远不应该认为您的内部网络是安全的,尽管这可能是另一个话题)。
我们当前的配置环境是 Ubuntu 12.04 和 14.04,在专用配置服务器上使用 PXEboot / Preseeding - 但我们可以采用其他解决方案来适应我们的环境。
我主要关心的是所有节点都需要访问的几个全局秘密,我们理想的最终目标是不拥有这些全局秘密,而是拥有每个节点的秘密,我目前调查实现此目的的工具但目前我们必须处理当前的设置。
那么人们如何在配置环境中安全、自动地分发全局机密?有什么建议或指示可以做到这一点吗?
答案1
在操作系统启动前,除了 BMC(主板上实现 IPMI/iDRAC/iLO/等的小型子系统)之外,没有太多可用的智能,但这可能足够了,这取决于你想信任它多少。
您可以在预启动序列期间向其写入密钥(通过网络使用加密的 IPMI 2.0 通道,或者如果这不是一个选项,则希望通过管理 LAN 或 VLAN(bleah)),然后让服务器启动一个 vanilla/stub OS,该 OS 仅启动一个操作系统并且其中不包含任何秘密或机密内容。
启动后,原型服务器可以与其自己的 BMC 通信(root 不需要本地身份验证),使用 ipmitool 或其他工具读取密钥,然后使用读取的密钥与母舰对话,确保它是它所说的那个人;然后可以开始最终配置。使用这个(自由承认 :))黑客,您还可以为每个系统使用单独的密钥。
BMC 上存储密钥的可能位置包括 MAC 地址(每个以太网端口约 48 位密钥空间应该足够任何人使用(原文如此!))、SNMP 社区字符串等。初始配置后,所有这些都可以重置为合理值,并且易于修改。
实现这一点谦虚地很简单,使用脚本来为每个服务器生成密钥,使用 ipmitool 命令在目标上设置适当的密钥,使用小型基本操作系统映像中的脚本来读取本地密钥并使用它们向母舰验证自身身份,然后进行最终配置。毫无疑问,这比通常的配置更复杂,但有时您必须付出代价才能获得安心。