我有一个普通的 Apache/MySQL 服务于一个 Web 应用,公司和公司用户都可以登录该应用。因此,所有公司的每个人都在同一个用户表中。
虽然我的代码确实试图使 PHP 中的公司保持独立,例如SELECT * FROM Users WHERE Company=$COMPANY
,但我确实看到 SQL 注入从其他客户那里获取私人数据的可能性很大,因为代码库非常庞大。我们正在审查代码,但按照这个速度,我们将在几年内完成。
与此同时,我正在研究 Docker,希望能够为我的每个客户提供自己的容器,其中包含 Apache 服务器(带有一个很小的缓冲区和 2 个 php 工作程序)和带有 32 或 64 MB 缓冲池的 MySQL。然后,此容器将只允许 1 个 HTTPS TCP 连接,该连接将根据主机名进行反向代理(例如 customer-a.mycompany.com)。不会将任何文件写入磁盘。并且 PHP 源代码将使用 git 保持最新,因此也许我们甚至可以将选定的客户放在我们的 Beta 版本上。
我被告知 Docker 不是为上述场景设计的,并且不能为我提供我所寻求的安全性。
我知道黑客可以将代码注入 1 个容器并影响该客户。但 Docker 不会阻止发现用于其他客户的虚拟主机,从而略微降低黑客影响我大多数客户的可能性。我们只能承受 1 个客户,但承受不了 12 个。
除了安全性之外,我很高兴看到每个公司都拥有专用的 MySQL 缓冲池,这将使 web 应用程序的速度更快,因为当客户 A 执行疯狂的 SQL 报告时,我猜缓冲池会被疯狂的报告覆盖,因此当客户 B 接下来执行简单查询时,必须再次从磁盘获取数据。
将来,我很乐意在 GUI 上看到这些“容器”,并能够将它们拖放到另一台服务器上(更快,容器更少)..例如,为某些电力客户提供“更快”的速度。
上述任何梦想在 2017 年都能变成现实吗?
您认为我应该考虑什么平台/工具?
答案1
一般来说,好的网络托管服务提供商会使用云Linux为多租户托管提供隔离和资源限制。但是,对于您的规模(12),我建议您采用 docker 路线。每个客户有一个(或两个)容器来服务他们的网站对我来说似乎不错。不确定您指的是哪种安全问题,但如果您做到以下几点,您的情况就很好了:
- 为每个客户创建一个单独的docker bridge网络
- 每个容器都应该有唯一的 UID,并且不能以 root 身份运行
- 您的负载均衡器应执行第 7 层并读取主机标头以了解将流量发送到哪个容器端口。如果涉及 TLS,则必须在 LB 上终止。
- 您的服务器将需要比仅共享单个 LAMP 堆栈更多的资源。例如,每个 mysql 容器将消耗至少 100MB 内存
如果您的客户共享一个数据库(无论出于何种原因),他们显然应该有严格的授权,以确保他们的用户无法查询他们不应该访问的数据库。数据库只有一个为确保最大程度的安全,应将客户查询分开放入另一个容器中。仅限共享共享容器中的数据库。