防火墙+负载均衡器作为集群入口点 – 该怎么办?

我必须为我的公司build立一个生产环境,但是我对新架构的一个组件有一个问题。
我画了一张快照,告诉你今天是如何完成的,明天应该如何理解。
一切都使用Debian。
编辑:一切都存储在云,实际上在一个小主机,但我打算迁移到DO

今天

服务器可以访问互联网,并在NAT后面。
服务器安装了该post末尾所述的安全堆栈。
服务器直接在VM中安装软件。
这里的模式imgur

Tomorow

服务器位于专用networking中。
Apache和MySQL在Docker容器中运行。
服务器位于负载平衡器/代理/防火墙之后。
如果需要,我可以运行PHP容器的集群
编辑 – 根据答案imgur的新模式

我在哪里

老问题
入口点是我的问题,我不知道哪个软件用于代理/负载平衡。
我真的不明白我是否应该在群集模式下使用docker,因为我有两个不同的容器。
我不知道是否应该使用nginx,因为我已经有Apache处理HTTP请求。
我不明白如何容器可以访问互联网下载configuration文件为例(存储在外部git回购傀儡文件)。
实际上,我正在阅读大量的内容,并试图学习好的做法(比如在一个容器之外存储数据),但它仍然有点不清楚。
我有另一个应用程序与节点运行,我想应用相同的架构,只是用一个PM2 /节点容器replaceApache / PHP的容器,这就是为什么我问负载平衡。 我也可能需要PHP应用程序的负载平衡。
也许我完全错误的build筑更新,我应该留在今天的工作? 但是我觉得pipe理2台服务器的安全性是更危险的,因为我有更大的攻击面。
我也听说CSF会默认阻止docker工人,所以我必须编写额外的规则,我想避免它,但它会在群集模式下的docker工人开箱即用?

编辑:答案帮助我来到这一点,纠正我,如果我错了

安全

如果我理解你的消息,我应该按照2中的模式来设置。
首先我过滤所有传入的TCP / UDP连接到防火墙,阻止试图扫描端口的IP地址等。
然后我有我的代理将根据我打的端口路由SSH / HTTP / SFTP到正确的容器。
由于traefik可以监视一个群,我想它足以关注发生了什么事情。
我想通过SSH隧道SSH访问我的数据库虚拟机,以避免从代理到数据库虚拟机的路由。 (我知道该怎么做)

缩放

通过使用traefik,我现在可以添加一个协调器服务器,并添加我需要扩展的Apache + PHP容器。

监控

Traefik提供监控pipe理服务的好方法。
日志被发送到ELK堆栈以便可视化。 我也考虑将安全日志发送到ELK堆栈。

听起来不错 ?

4.附录 – 安全堆栈

原谅我的安全知识,我尽力去做。
– CSF + LFD
– 无人值守升级
– clamav
– rkhunter
– logging
– fail2ban
– psad
– 没有SSHlogin+端口敲门

你的主要目标是什么?

性能

如果你的目标是性能,你可以腾出一些离线时间,那么你目前的设置是好的,Quintiliano关于在容器中使用你的数据库的评论可能是站得住脚的。 使用Apache作为反向代理很容易pipe理,为了获得更好的性能,您可以检查HAProxy(这并不难,但需要时间去适应)。 为了提高性能,您可能需要2个或更多的服务器和一个负载均衡器(Load Balancer对于单个服务器没有意义)。 如果你有一个很好的连接,你可以使用networking接口绑定来加快你的连接速度。

安全

你可以提高你的安全性,在你的代理之前添加一个路由器(专业 – 昂贵或经济,但function齐全,如ubiquiti,mikrotik等)。 你需要知道如何设置和保护你的私人networking。 就安全性而言,最好是在容器中运行数据库,并放松一些性能。 您也可以在容器中设置您的代理。 我会build议检查一个易于使用的代理/负载均衡器traefik 。 你是对的,一台服务器比两台服务器更容易维护。

冗余(故障安全)

如果你想要的是停机时间,你将需要改变你的devise。 您至less需要2台路由器并设置VRRP。 您需要设置networking接口绑定,并至less有2个服务器(更多是最好的)。 你可以在你的路由器上设置奇数IP到其中一台服务器,甚至IP到另一台服务器(这样你就不需要同步会话),并且负载平衡你的连接。 您将需要一种方法来将文件从一台服务器同步到另一台(在file upload等情况下)。 我build议使用unison ,但是我使用LXD而不是docker,所以我不确定这是否适用于您的情况。 对于数据库,最好把它们放在一个簇中,用maxscale检查Galera 。 您通常至less需要3台服务器,但如果使用Galera仲裁器,则可以使用2台服务器运行

这只是一条路,有很多路,这是我个人的解决scheme。

更新(关于安全)

严重的是,如果这些业务数据泄露会有多糟糕? 你说这会是'致命',但是这样呢? 我问你的原因是因为如果那么重要的话,那么你不应该自己来做这件事,而是要有专门的团队或安全顾问。 不pipe你多坚持这本书,如果你没有足够的经验(如果你在这个网站上询问,是因为你没有,是吗?),总是有错误的余地。 不要误解我的意思,如果这个数据泄漏了,谁会责备呢? 在我个人的情况下,我没有pipe理最高机密,所以只要我试图遵循和应用超标准的安全措施,我觉得这足够了。 从我看到的安全列表中,你几乎涵盖了我通常所做的事情,到目前为止,我还没有任何安全漏洞(我知道:P)。

我有几个可以改善您的设置的build议:

1)数据保护:请参考MariaDB的静态数据encryption 。 这是一个非常简单的方法来encryption你的数据。 它的主要好处是,如果你的数据库文件被攻破,没有密钥就没用了。 如果将密钥存储在内存中会更好,因为它不会存储在快照或备份中,不利之处在于每次启动数据库时都必须input该密钥。 如果有人访问正在运行的实例(这是侵入数据库的最常见方法),则此encryption方法将无法帮助您。

2)应用程序:我的猜测是你的最薄弱的环节是在应用程序层。 您必须确保您的代码得到很好的保护,并且不容易受到XSS,SQL注入或类似攻击。 如果你不能百分之百地保持高度重要的数据,尽可能远离你的应用程序。 确保你添加更多的保护层(如额外的authentication,数据库中的值encryption等))。

3)encryption目录:encryption目录通常对于那些服务器被盗或有人以非root用户访问的情况有帮助。

4)备份:看看你存储你的备份和快照。 它们和数据库一样重要。 如果您的服务器感染了勒索软件(是的,也可能发生在Linux中 ),您的备份可以帮助您节省一天的时间。 把它们保存在一个安全的位置是一个好主意(限制,encryption,如果可能的话不可变)。

5)本地networking:确保您的服务器与本地networking隔离。 不要认为你的本地networking是安全的,所以不要为本地客户授予特殊的权限。 对待你的服务器,就好像它被隔离在一个偏远的地方,只能通过互联网访问,这样你将只保护一个入口点。

6)SSH:如果你仍然使用端口22的SSH,改变它。 我会build议使用客户端密钥以外的密码为SSH(和额外敲门户)。

7)密码:确保您的密码pipe理器应用程序保持所有的服务器密码安全。 如果您的个人计算机遭到黑客攻击并且这些密码被泄露,则无论您将多less添加到此安全公式中,都无关紧要。 所以保护你的个人电脑以及服务器。 (你正在使用强密码,对吗?)

8)后门:我已经发生了几次,我被locking了! 所以请记住,它也可能发生在你身上。 确保如果你打开一个额外的方式来访问服务器,这些与主要的一样强大。 如果你有物理访问服务器,你不必担心太多。

9)防病毒:不要太信任clamAV 。 这不是一个坏的软件,但你不会有一个商业解决scheme相同的保护。 我将它用于我的邮件服务器和某些文件服务器(Samba),以阻止众所周知的Windows病毒,但是当涉及到新的威胁时,我不会指望它。 最好不要假设它会保护你。 如你所知,有一个非常小的已知的Linux恶意软件列表 ,所以如果你有性能问题,由于clamAV,它可能不会改变你的安全太多没有它(如果你已经保护你的服务器在许多其他方面) 。 如果你想要一个商业解决scheme,Sophos和ESET是不错的select。 如果你真的想在你的服务器的所有威胁之上,你可以尝试AlienVault(但是你需要一个额外的服务器)。

关键问题:(如果有人会发生什么…)

 * gains access to the DB through my applications? * gains access the containers? * gains access to the servers as user? * gains access to the servers as root? <-- usually this is gameover * stole the server? * has access to the local network? * gains access to my 'development' computer? 

我知道这里涉及的许多要点,你已经在做,但我不想承担任何事情。 我希望你能发现我的见解很有用,如果你有其他的build议,我不想在这里介绍,我想听听。

我的两分钱给你。

首先我认为第二种方法是一个好方法。 你将只有一个暴露的服务器,从安全angular度来看更容易维护你的环境。 另外,用第二种方法,它也容易扩展。

我不会做的。

在容器中使用MySQL。 我知道docker是一个很好的部署解决scheme,并且能够快速完成任务,但是我在Docker + Database方面的经验并不好。 当你使用Docker来部署MySQL节点时,你应该确保你的MySQL数据库文件的外部持久性存储,当你的应用程序处于高负载状态时,这些存储使用错误的磁盘和networking硬件,很容易成为一个问题。 我更喜欢拥有一个专门用于数据库的虚拟机(或更多,如果需要的话),并使用docker来连接连接到这个数据库的应用程序服务器。 它也解决了Docker群中2个VMtypes的问题。 此外,由于您正在使用puppet,因此您可以像docker一样提供一个新的DB节点。

我会做什么。

这只取决于你熟悉的工具和时间来学习新事物。 如果您的网站的stream量低于10K个请求/秒,开箱即用,Apache是​​一个很好的工具。 它易于configuration和维护,几乎每个人都知道如何处理它。 随着负载的增加,您应该寻找更强大的解决scheme。 我是HAproxy的忠实粉丝。 已经使用了近6个月,我很喜欢它。 它以L7(如HTTP代理)和L4(如TCP代理,例如:MySQL负载均衡器)代理/平衡器的forms提供服务,具有大量的选项,并且其方式比Apache轻。 一旦你明白了这个想法并不难,你可以很容易地扩展它来处理大量的连接。

无论是Apache还是HAproxy,你都可以有一个负载均衡algorithm来分担你的PHP节点之间的负载。 您可能需要一个Memcache / Redis来进行会话/caching分发,而实现起来并不困难。 使用代理作为阻塞点,您也可以将其用作TLS卸载,从而减lessPHP节点的使用。

就像在你的PHP节点中一样,使用Apache和Ngnix只取决于你自己。 再次,使用你有知识和经验的工具。 两者都是PHP的优秀服务器。

至于你的节点获取configuration的问题,你的proxys也可以作为内部networking的网关。 负载的增加将是最小的(通常在生产时间之后在您的网站上进行更改)。 如果你确实需要传输大量的文件/configuration,我build议你安装一个GIT / SVN或者其他在你的站点中使用的仓库。 使用这种方法,您只需要将DEV – > PRODUCTION中的文件传输一次,并使用puppet或任何其他工具将其用于LAN中的服务器。 取决于你的环境的大小,这是一个巨大的胜利。

最后,为了安全方面。 您可以随时使用好的和旧的Iptables在代理服务器和内部服务器上加上一些WAF(Web应用程序防火墙)。 由于iptables只允许在networking端口连接(我会过滤SSH中的一组VPN的特定的起源/隧道)您的攻击面将是应用程序。 WAF实施起来可能非常麻烦,但是还有一段路要走。 您也可以查找这个设备和专有的解决scheme。 集中您的应用程序日志,如ELK或灰色日志,最重要的是,监控所有的性能和问题,因为磁盘,内存和磁盘的使用,每个代理和服务器上的链接和连接。 这样,您可以评估您的网站性能,并预测客户开始投诉之前所需的任何升级(始终为最高负载做好准备)。 我喜欢Zabixx这个angular色。

我希望它可以帮助你。

[]单曲

两个答案都很好。

我想在这里添加一点安全方面。

主要问题是DOCKER

docker工人对安全的责任从你转移到开发团队。 这就是所谓的DevOps

问题可能是开发团队对补丁,当前Java版本和(和所有pipe理员关心的东西,但没有人注意到)没有安全意识。

解决办法是培训开发人员担任新angular色。

由于这是一个容易出错,冗长的过程,所以最好用相应的技术来支持这个过程。 这被称为(在Docker上下文中) DevSecOps

市场上有一些产品与Docker集成,并寻找安全性 – 完全自动化 – 直到丢弃Docker容器,而不提供由指南设置的安全性。

这可能有助于转型过程。