将每个 Web 服务用户隔离在自己的服务器上是否有意义?

信息安全 Web应用程序
2021-09-06 11:23:37

我正在为我的公司规划一个 Web 应用程序的架构,该公司正在为其合作伙伴推出金融服务,我的主要问题是 - 将每个合作伙伴放在不同的服务器(甚至服务器组 web/db)上是否有意义?

该应用程序在某种意义上类似于https://www.wealthfront.com/ - 合作伙伴信任我们的资产并向我们提供数据,我们使用这些数据来自动化投资。每个合作伙伴都有一个我们的帐户、登录名/密码对和一个他可以登录的网址。登录后,他可以访问仪表板,其中包含他在表格中的图表中显示的所有数据。

合作伙伴及其数据彼此完全独立。我们还有一些管理界面来预处理他们的数据和管理他们的帐户,但是有一个单独的 web/db/workers adm 服务器,合作伙伴通过只写服务将他们的数据提供给主数据库(他们不能查询任何任意信息)。

合作伙伴数据非常敏感,如果其中任何一个落入坏人之手 - 对我们破产的影响可能非常严重。

关于如何组织此类服务的架构,我有两种方法:

  • 分组,其中每个角色都有一台服务器,所有合作伙伴都坐在每台服务器上 分组架构

  • 隔离,其中我们也为每个角色拥有一个服务器,但每个合作伙伴为每个角色获得一组服务器 孤立的架构

我看到两种可能发生未经授权访问数据的场景:

  • 攻击者:有人入侵了某些服务器并获得了某种访问权限。可能是简单的错误配置(没有密码从公共网络留下的 ssh 访问、类似心脏出血的漏洞......)。这太模糊了,隔离肯定不能从所有场景中拯救出来,但我仍然觉得在所有其他条件相同的情况下,隔离架构更安全,因为它会产生更多障碍。
  • 人为错误:工程师忘记添加一些安全检查或无意中删除了一些或赋予每个人超级管理员查看所有内容的权限,它进入生产阶段,每个人都不满意。这当然应该通过各种规则、审查、约束和流程来防止,但错误总是会在生产中找到。我有一种感觉,如果发生类似的事情,物理隔离也有助于缓解(即使初级合伙人员工可以访问仅限高级合伙人的信息,如果他能访问其他合伙人的仅限高级信息,那会好得多!)

我看到的分组优点/缺点:

  • [+] 更容易缩放
  • [+] 更便宜(更少的服务器,可以更有效地分散负载)
  • [+] 少配置(虽然我们使用的是配置管理工具和云环境中的主机,所以这不是什么大问题)
  • [-] 每次访问检查失败都会导致所有数据数据暴露给用户
  • [-] 入侵 web/db 服务器让您可以访问所有内容(例如,如果某个合作伙伴决定探索并以某种方式成功地在我们的系统中找到了他的方式)
  • [-] 如果一个合作伙伴造成了很大的负载,它会伤害到每个人(尽管通过一些简单的扩展来减轻)
  • [-] 无法有效使用基于ip的限制(我认为)

我看到的隔离优点/缺点:

  • [+] 每次访问检查失败都会导致用户自己的数据暴露给自己
  • [+] 入侵 web/db 服务器只给你这个服务器数据(例如,如果某个合作伙伴决定探索并以某种方式成功地在我们的系统中找到了他的方式)
  • [+] 将一个合作伙伴的系统负载与其他合作伙伴分开
  • [+] 可以更精细地调整防火墙规则(我们可以限制仅来自合作伙伴 ip 的访问,这对于分组架构来说不是这种情况)
  • [-] 不太容易扩展(虽然这绝对不是一个高负载项目,所以它不是那么令人担忧)
  • [-] 更贵
  • [-] 更多配置(虽然我们在云环境中使用配置管理工具和主机,所以问题不大)

到目前为止,我可以看到隔离的许多优点和一些小缺点,但有一个很大的问题:由于我们使用配置管理工具,每台服务器将具有相同的操作系统、相同的软件和配置、相同的代码库以及所有内容。这样,如果我们有任何漏洞,没有什么可以阻止攻击者在所有服务器上使用它们,无论是否隔离。也许还有其他我现在看不到的缺陷会破坏整个想法。

因此,鉴于所有这些信息:

  • 您认为隔离架构比分组架构提供更多的安全性吗?
  • 对于我没有想到的孤立架构,是否有任何严重的权衡/阻碍?
  • 你认为这个问题有一些常见的替代解决方案吗(不是分组或隔离,而是别的)?
  • 如果隔离架构很好,那么拆分 Web 和数据库服务器(安全方面)是否有任何意义,因为它们已经与其他一切隔离,并且拆分它们不会增加更多安全性?
4个回答

我在一些类似的情况下看到的是让每个客户端都有自己的数据库实例,多个数据库在同一台服务器上运行。每个客户只能使用他们的密码访问他们的数据库,因此数据泄露的风险很小。在最坏的情况下,一个加密的数据库最终会在没有解锁它所需的帐户凭据的情况下消失。

但是,该工作的关键是用户帐户凭据必须是获取用户数据所在数据库的密码的关键组成部分,并且必须对数据库进行静态加密。

在系统运行时,您仍然会面临泄漏,但您仍然可以通过隔离数据库和完全独立的基础架构之间的平衡得到显着保护。

我已经看到这种规模包括相对较大的系统。

我认为这里的错误在于认为这是一个非黑即白的选择。无论您是对服务器进行分组还是隔离,都是灰度级的。如果您使用容器(例如 Docker、LXC、Rkt)或虚拟机(例如 IaaS),那么您可以在同一台机器上运行来自不同合作伙伴的多个应用程序/数据库服务器,同时受益于容器/虚拟机提供的隔离和共享基础资源的经济。

在最低层,您可以让多个合作伙伴共享一个数据库集群,数据库服务器将通过检查 partner_id 来强制授权。这些可以由负载平衡的应用服务器集群提供服务。

在中低层,与之前相同,但每个合作伙伴在应用程序容器中都有自己的数据库实例。

在中间层,与以前相同,但每个合作伙伴都有自己专用的数据库服务器。

在中高层,和以前一样,合作伙伴可以获得自己的专用负载均衡器。

最高层,愿意为安全支付更多费用的合作伙伴可以为应用程序和数据库服务器获得他们自己的专用机器,并使用额外的防火墙规则来防止他们的机器被未经授权的服务器访问。或者可能在他们自己的公司网络中运行应用程序。

它是否提供更多安全性?我可以看到一点点,即在合法用户(或已控制合法用户网络的攻击者)发现他们拥有比应有的更多访问权限的情况下。这将更好地防止他们访问您的其他客户数据之一。真正的问题是每单位成本的安全性增加,以及是否有更好的选择/是否值得。

至于拆分 web 和 db,无论哪种计划,我仍然会这样做,因为您不希望任何外部连接,即使是来自白名单 IP 的连接到您的数据库,除非有非常强大的业务理由。我还认为,当它们位于 Web 服务器和数据库服务器之间时,使用 IPS/IDS 会更容易,而不是尝试监视单个服务器上的活动。

无论哪种方式,您都可以使用白名单,这只是一个问题,即是否会在各自的 Web 服务器上包含多个白名单,或者在单个(或少量)服务器上合并这些白名单。

至于替代方案,考虑到这是您正在使用的基于云的解决方案,您需要在此处查看其他答案。

就个人而言,我认为隔离架构不会为您提供比分组架构更多的安全性。如果一个对手侵入了一个在设计上反映另一个服务器的服务器,那么,当然,你暂时只会遇到一个问题。但是,实际上,您知道他们拥有邻居的钥匙,并且所有锁都需要立即更换。

在技​​术领域为企业客户服务了很长时间,我认为您错过了一件明显的事情。一些技术决策者会担心他们的数据并未与竞争对手的数据“在云中”隔离,您需要提供令人信服的答案。在某些情况下,这些领导者希望在内部部署所有解决方案并不惜一切代价避免“云”。在其他情况下,您可能会像您描述的那样使用孤立的架构赢得他们的青睐。

就我之前的观点而言,一种可能的解决方案是为您的客户提供两种选择。让他们使用您的分组(云)产品,或者让他们自己在内部部署软件。您将需要围绕这些许可选项设计解决方案。许多供应商都这样做。微软可能是最好的例子。

回答您的最后一个问题,将 Web 服务器与数据库服务器分开有安全优势,但这取决于您打算如何使数据库可访问。如果将访问数据库的唯一应用程序驻留在同一环境中,那么您可以将它们放在同一环境中并选择不公开数据库。但是,如果您需要将数据库暴露给多个应用程序,许多企业会将其数据库服务器置于 DMZ 后面的 LAN 中,并将其 Web 服务器置于可访问 Internet 的外围网络中。这样,攻击者就不会注意到数据库所在服务器的位置(实际上是存在),除非他们能够访问 LAN。