我的 Puppet Master 包含一些敏感文件。我希望每个 Puppet Agent 只能访问该特定 Agent 感兴趣的文件。换句话说:
- Puppet 代理是否运行其目录,然后每当它遇到“文件”或“模板”函数或“source => 'puppet:///...'”参数时,就要求主服务器为其提供指定的文件,而主服务器只是提供它而不进行检查?这很糟糕。如果代理受到攻击,它可以向主服务器请求主服务器上的任何文件,甚至是仅供其他代理使用的文件。
- 或者主人是否会以某种方式检查代理的目录是否真的授权该特定代理获取该特定文件?
我不知道这是否重要,但我正在运行乘客(并且我的所有代理和主机都是来自 squeeze-backports 的 2.7.6)。
答案1
的文档Puppet文件服务器应该能够涵盖您所问的大部分内容。特别是参见保安科。
首先需要注意的是,如果您启用了自动签名,那么几乎任何提供的安全措施都是无效的。您应该验证每个证书。由于您配置的安全设置将基于主机名/证书名称或正则表达式匹配它们,因此启用自动签名可能意味着任何不受信任的系统都可以简单地请求与可以访问机密文件的模式匹配的名称的证书。
默认情况下,特殊插件和模块文件服务器挂载中的任何内容都可供任何客户端使用。但这可以通过配置在一定程度上进行控制。
您还可以设置指向特定位置的自定义“挂载”。文档中提供了一个有关如何创建[私人的]mount 用于分发私有 SSH 密钥。主机名用作挂载路径的一部分,因此给定主机只能看到属于它的文件。
答案2
我对此没有任何确切的数据。但是,从我读过的内容来看,我的感觉是,如果文件位于 Puppet 文件服务器树中,并且 Puppet 文件服务器的配置允许代理访问该树,则任何代理都可以从主服务器获取任何文件。我还感觉,在将代理的配置发送给代理之前,主服务器会在编译代理的配置时执行 file()、template() 和 extlookup() 函数。
因此,将敏感文件存储在 Puppet 文件服务器树之外并使用 file() 访问它们应该是相当安全的。这样,它们应该只能由它们所针对的代理访问。
答案3
“如果您不想将重要文件存储在 Puppet 服务器上,您建议怎么做?”
我猜,傀儡图书管理员在这种情况下也许能够提供帮助...即创建一个特定于客户端的 puppetfile 并根据需要将其应用于客户端(甚至可能没有 puppet master)。
因此,一个典型的情况可能是通过 ssh 进入盒子,从已知的安全远程或本地位置获取 puppetfile,并在触发手动 puppet 运行之前使用它来安装所有相关模块(和/或配置文件)。我想您可以使用 capistrano 或类似工具轻松地自动执行该组任务。
答案4
只要该文件仅在一个“节点”中定义就没问题,另一个“节点”无法请求该文件,因为对他来说,它不存在。
然而,将“受保护”的文件存储在 Puppet 服务器上通常不是一个好主意。
希望这可以帮助!