背景:
我终于抽出一些时间加入 21 世纪,看看 Puppet。
就目前而言,我们在办公室内部保存的存储库中对所有服务器配置进行版本控制。当需要进行更新时,更改会重新检入存储库并手动推送到有问题的机器上。这通常意味着 SFTP'ing 到远程机器,然后从 shell 将文件移动到适当的位置,并具有相关权限。
因此,我希望 Puppet 能够成为我们现有产品的简单而惊人的扩展。
现在我考虑我们目前必须相当安全的过程。假设我们的内部网络总是比我们数据中心的公共网络相对更安全。
这个过程总是一种方式。变化从安全环境到不安全环境,绝不会反过来。
主存储在最安全的地方。通过窃取配置或发送恶意修改的危害风险大大降低。
问题:
根据我对 Puppet 服务器/客户端模型的理解,客户端会直接从服务器轮询和拉取更新。流量是 SSL 包装的,因此不能被拦截或欺骗。但这与我们目前所做的不同,因为 Puppet 服务器需要托管在公共位置。可以集中处理,也可以为我们维护的每个数据中心站点提供一个。
所以我想知道:
我是否对从推到拉的变化感到不必要的偏执?
我是否对将所有这些信息集中存储在公共网络上感到不必要的偏执?
其他人如何维护多个网络 - 每个站点的单独服务器?
2009 年 7 月 30 日更新:
我想我的另一个大问题是必须信任一台机器。puppetmaster(s) 将被防火墙、安全等。但即便如此,任何具有监听服务的公共机器都有一定规模的攻击面。
据推测,如果主人有权更新任何一个 puppet 客户端上的任何文件,那么它的妥协最终会导致它的所有客户端的妥协。可以说是“王国的国王”。
这个假设正确吗?
有什么办法可以缓解吗?
因为我有时将密码存储在我的模块中的变量中,为了能够部署应用程序而不必手动完成配置,这意味着我不能体面地将我的 puppet repo 放在公共服务器上。这样做意味着攻击 puppetmaster 将允许获取我们所有服务器上所有不同应用程序的一些应用程序或数据库密码。
所以我的 puppetmaster 在我们的办公室专用网络中,我不在服务器上运行 puppetd 守护程序。当我需要部署时,我使用 ssh 从私有网络到服务器,创建隧道并远程调用 puppetd。
诀窍不是设置远程隧道和 puppet 客户端连接到 puppetmaster,而是设置一个接受http 连接并且可以访问专用网络上的 puppetmaster 服务器的代理。否则 puppet 会因为主机名与证书冲突而拒绝拉取
对我有用,希望对你有帮助
我们有两个站点,我们的办公室和我们的 colo。每个站点都有自己的 puppetmaster。我们建立了一个 svn 存储库,其结构如下:
每个站点下的模块目录是一个 svn:externals 目录,回到顶层模块目录。这意味着它们共享完全相同的模块目录。然后,我们确保我们编写的绝大多数类都在模块目录下并被两个站点使用。这有一个很好的优势,即迫使我们进行一般性思考,而不是将课程与特定站点联系起来。
至于安全性,我们将 puppetmaster(以及我们网络的其余部分)托管在防火墙后面,因此我们并不担心集中存储配置。puppetmaster 只会将配置发送到它信任的主机。显然,您需要保持该服务器的安全。
我无法判断您的偏执狂有多么必要,这在很大程度上取决于您的环境。但是,我可以自信地说,您现有配置的两个主要点仍然可以适用。无论您的 puppetmaster 位于何处,您都可以确保您的更改从一个安全的环境(您办公室的存储库)转移到不太安全的环境。您将过程从 SFTP'ing 更改为一堆服务器,然后手动将文件放置到 SFTP'ing 到您的 puppetmaster 并让 Puppet 分发文件并将它们放在正确的位置。您的主存储仍然是存储库,并且您的风险得到了缓解。
我不相信推或拉本质上比其他模型更安全。Puppet 在保护传输中的配置以及验证客户端和服务器以确保双向信任方面做得很好。
至于多个网络 - 我们使用中央“主”puppetmaster 处理它,每个位置的卫星 puppetmaster 充当中央主控的客户端。
一种设计方法是在每个系统站点本地设置一个 puppetmaster,并使用部署工具将更改推送到 puppetmaster。(使用带有 git hooks 的 git 也可以)。
这将保留您对公共网络上侦听服务的担忧,因为 puppet 网络流量只会是内部的。
也可以将清单推送到每个服务器,让 puppet 客户端解析清单并应用相关配置。
尽管您说“外部”,但我真的怀疑任意人需要连接到您的 puppetmaster。您可以随时将 VPN 加入其中。我的一个朋友曾经问我“如果连接是安全的,你是否需要担心协议的安全性?” 虽然我不同意这种态度,但额外的一层永远不会受到伤害,而且肯定会对我的个人偏执产生奇迹。此外,隧道隧道很有趣。
Mark Burgess,cfengine 的作者和大学教授(这个木偶似乎应归功于它的传统)写了很多关于推和拉的文章。他声称拉动本质上更安全。如果您查看 cfengine 网站,他们在 17 年中只发生过 1 起网络安全事件。Burgess 声称这是因为拉式设计。我认为单点妥协是不可避免的。到那时,我会更关心攻击路线。
如果需要,您可以在没有中央主机的情况下运行 puppet。我见过的一种方法是使用 git 存储库,并且只有当标签由 gpg 密钥的预设列表之一签名时才会合并和部署更新的脚本。人们甚至想出了如何获取存储的配置(例如,用于从另一台服务器上处理的资源在中央服务器上设置 nagios 监控)。
因此,如果中央 git 服务器受到威胁,其他服务器将不再应用任何更新。gpg 密钥将在系统管理员笔记本电脑或其他东西上,以及某种撤销密钥的方式。
在http://current.workingdirectory.net/posts/2011/puppet-without-masters/阅读更多信息