在防火墙后面管理Linux计算机集群


19

我公司的产品实质上是一个Linux盒子(Ubuntu),它位于运行我们软件的其他人的网络中。到目前为止,我们只有不到25个盒子可以使用TeamViewer进行管理。

我们现在将要运送1000个这样的盒子,而TeamViewer不再是一个选择。我的工作是想出一种方法来访问这些框并更新它们上的软件。该解决方案应该能够穿透防火墙以及您所拥有的东西。

我考虑过:

1.自行开发的解决方案(例如Linux服务),该解决方案建立到云中服务器的SSH反向隧道,并在云中建立另一服务来跟踪这些服务器并允许您连接到它们。

这显然是劳动密集型的,并且坦率地说,感觉就像是重新发明轮子,因为很多其他公司肯定已经遇到了这个问题。即使这样,我不确定我们是否会做得很好。

2.木偶,厨师或OpenVPN等工具

我尝试阅读尽可能多的内容,但是我似乎无法充分理解市场营销方面的知识,以了解显而易见的选择。

除了我们之外,没有其他人需要连接到这些盒子。有没有相关经验的人可以给我一些指导?


2
“我们不打算发货” =>“我们现在要发货”?
鲍勃,

Answers:


23

拉动更新,不推动

随着扩展,对所有产品进行推送更新将变得不可行。

  • 您必须跟踪每位客户,他们可能每个人都有不同的防火墙配置。
  • 您必须通过客户的防火墙创建传入连接,这需要端口转发或其他类似机制。对您的客户来说是安全隐患

取而代之的是,让您的产品定期“拉动”其更新,然后您可以在增长时在服务器端添加额外的容量。

怎么样?

正如您所建议的,此问题已解决。我可以想到以下几种方法。

  • using apt:将内置的apt系统与自定义PPA和来源列表一起使用。如何设置PPA?
    • 缺点:除非您使用启动板之类的公共托管服务,否则建立您自己的apt PPA +打包系统并不适合您。
  • using ssh:为每个产品生成一个SSH公共密钥,然后将该设备的密钥添加到更新服务器。然后,只需提供所需的软件rsync/ scp文件即可。
    • 缺点:必须跟踪(并备份!)您发送的每个产品的所有公钥。
    • 优点:比原始下载更安全,因为唯一可以访问更新的设备就是安装了公钥的设备。
  • 原始下载+签名检查

    • 将签名的更新文件发布到某处(Amazon S3,FTP服务器等)
    • 您的产品会定期检查要更改的更新文件,然后下载/验证签名。
    • 缺点:根据您的部署方式,文件可以公开访问(这可能使您的产品更易于反向工程和修改)
  • ansible:Ansible是用于管理系统配置一个伟大的工具。它位于人偶/厨师的领域,但无代理(使用python),并且设计为幂等的。如果部署软件需要复杂的bash脚本,那么我将使用这样的工具来简化执行更新的过程。

当然,还有其他方法可以执行此操作。但是,这使我很重要。

签名/验证您的更新!

无论您做什么,都必须有一种机制来确保您的更新不被篡改。恶意用户可能以上述任何配置模拟您的更新服务器。如果您不验证更新,那么您的机器容易被黑客入侵和进入。

一个很好的方法是对更新文件进行签名。您必须维护证书(或向某人付款),但是您可以在发货之前在每台设备上安装指纹,以使它们可以拒绝被篡改的更新。

人身安全

当然,如果有人可以实际访问客户的部署,则他们可以轻松接管服务器。但是至少他们不能攻击其他部署!物理安全性可能是客户的责任。

如果您想片刻,请想象一下,如果您使用大型OpenVPN网络进行更新,将会发生什么……他们可以使用受感染的服务器攻击VPN上的每个实例

安全

无论您做什么,都需要从一开始就内置安全性。不要在这里偷工减料-如果您这样做,最终还是会后悔的。

完全保护此更新系统不属于本文的范围,并且如果您或团队中的某人不熟悉该领域,我强烈建议您聘请顾问。每一分钱都值得。


2
我会第二次使用Ansible-它在shell脚本和成熟的Puppet / Chef样式配置管理之间处于中间状态,并且具有复杂的功能,而不仅仅是更新软件(如问题提示“管理”)。
RichVel

如果您使用Ansible,可以将其编写为在“ localhost”上运行,并且不需要通过SSH访问任何受管理的计算机。将其配置为cronjob,就可以了。
BobTuckerman'8

1
顺便说一句:如果你想运行自己的包服务器,fpm并且aptly是两个伟大的工具,使人们建立和举办自己的包要容易得多。最近刚刚经历了这个过程,这非常不错。
BobTuckerman '16

10

您实际上是否需要访问它们?

还是只是更新它们?因为您可以让他们自己更新,所以类似于apt在自己无人值守的情况下进行更新的方式。

如果您需要登录

为什么不通过端口转发侦听OpenSSH守护程序?每个客户可以有一个单独的安全密钥,仅在需要时才连接。

取决于您的客户

您还需要考虑客户愿意接受什么。他们可能不满意对网络的任何远程访问,或者只满意特定的技术/配置。


4
这个。具有1000个不同的客户需求,至少有些人不希望永久的openvpn连接返回您的办公室。理想情况下,当它们检测到可用的新版本时,您尝试使它们自己更新(例如,从AWS S3存储桶中的文件中进行。这就是我们所做的。)
Sirex 2016年

@Sirex-使用S3存储桶的一个缺点是,没有简单的IP白名单可供客户用来锁定该服务器,因此该服务器只能访问保存更新的存储桶。我们最终不得不使用静态公共IP地址设置更新服务器,以便客户可以使用IP过滤器来控制该服务器可以与之通信的内容。(AWS确实会发布其所有IP块,因此从理论上讲,可以设置一个过滤器,该过滤器仅允许访问AWS资源,但是对于此用例而言,范围太广了)
Johnny

我们没有S3的更新,但是我们有一个文本文件,其中详细说明了最新版本-应用程序使用该文件来提供“可更新”的标语消息。然后,客户可以触发(在我们的情况下为手动)从称为fetchapp的服务中下载最新版本。
Sirex'8

9

我建议使用PuppetSalt等编排工具。

Salt是消息队列,可以建立从设备到主服务器的持久出站连接。您可以使用它在设备上运行任意命令...像apt-get

另一个选项是Puppet,在那里您仍然有一个主服务器,并且客户端从其位置建立出站连接。

我将这两个工具用于相似的目的,可能无法对防火墙进行管理控制。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.