这是系列博客中的第四篇,涵盖了我们构建和运营SaaS服务的各个方面:
在之前的博客中,我们深入分析了使用加密技术保护我们的平台(基础设施、应用程序和数据)所面临的挑战。 本博客将讨论我们用来保护平台免受来自网络(来自互联网以及内部)的针对性攻击的技术。 由于应用程序不再受限于任何物理位置,传统的基于边界的防火墙和基于签名的安全解决方案不再有效。 我们将概述我们最初的零信任安全实施的缺点,以及为什么+如何通过机器学习和算法技术来增强它,以正确保护我们的分布式基础设施+应用程序集群。
我们的平台运行着多个团队的大量应用程序,这些团队在边缘、我们的全球网络以及 AWS 和 Azure 公共云中运营自己的集群。 虽然大多数工作负载都是使用 Kubernetes 进行微服务编排的,但我们也有一些非常大规模的整体式应用(例如 elasticsearch),我们使用 terraform 进行管理。 图 1 展示了我们平台的分布式特性。 例如,在我们遍布全球网络PoP(拥有几十到百余台物理服务器)中,我们都运行着数千个应用程序 pod。 然而,在边缘,我们今天拥有单独的客户部署,其中有 3000 多个活跃位置(每个位置有一到七个计算设备),运行着几十个应用程序 pod。
该平台完全是多租户的,每个节点运行来自不同客户(和我们自己)的工作负载。 由于其中一些应用程序暴露在公共互联网上,我们需要确保与这些应用程序的所有通信都是安全的。 正如我们在前两篇博客中概述的那样,我们构建了一个强大的身份、身份验证 + 授权系统以及我们自己的 L3-L7+ 网络数据路径 (VoltMesh),用于为我们的服务网格和API 网关提供支持。 如图 2 所示,这使我们能够跨应用程序集群(mTLS)、用户(TLS/mTLS)和员工(mTLS)提供传输级安全性,以及基于身份验证+授权的访问控制。
虽然这种零信任实施提供了许多好处,但它并没有自动解决几个安全问题:
在过去 2.5 年该平台的开发过程中,我们还意识到我们的开发人员经常会整合开源应用程序、对其进行容器化,然后要求我们的 DevOps 团队将其部署到平台上。 然而,他们通常缺少这些应用程序内 API 级别交互的详细信息,而我们的安全团队需要这些详细信息来创建将通信列入白名单的策略。 这对我们的零信任安全实施来说是一个巨大的障碍,因为它要求白名单策略只允许应用程序使用的 API 并阻止所有其他流量。 每当我们对此要求做出例外时,它都会给一些应用程序留下非常基本的网络级别分段,从而增加了攻击面。
因此,我们需要增强现有的零信任安全解决方案,增加额外的安全功能来处理上述问题。 我们列出了必须在平台中构建的一系列额外安全功能:
我们决定结合使用传统的基于签名的技术、统计算法和更动态的机器学习方法来解决这些问题。 这要求我们对 SaaS 后端进行更改,并在网络数据路径中添加新功能。
为了锁定平台,我们仅允许基于每个应用程序的 API 白名单的网络连接。这需要我们的安全团队与开发人员进行协调,并确保我们的可编程策略引擎获得正确的 API 信息。 我们很快意识到,我们的开发人员不可能为不是使用我们的服务框架构建的应用程序提供此信息。
由于我们的服务网格代理位于应用程序每次访问的网络路径中,因此我们决定通过对通过代理的每个访问进行运行时分析来了解应用程序公开的 API 和静态资源。 这种方法的挑战在于通过检查 URL 并分离动态生成的组件来识别 API 端点。 例如,对于 API“api/user/<user_id>/vehicle/”,代理将看到如下访问:
此类请求可能有数百万个,因此解读起来非常具有挑战性。 因此,使用深度学习和图形分析来识别这些相关请求中的动态组件。 我们将整个 URL 组件集表示为一个图,然后执行图聚类,使用捕获动态生成组件的特定属性的特征集来查找具有相似属性的子图,例如:
结果,动态组件被分类并且系统的输出如下:
使用这种 API 机器学习,我们可以轻松自动地生成可由我们的服务网格代理强制执行的策略。 根据发现的 API 端点,我们还了解其他属性,例如哪些应用程序使用哪些 API 与其他应用程序通信、这些 API 的典型行为等。 这使我们能够构建一个服务图,帮助我们的安全团队可视化服务到服务的交互,以进行取证、发现和 API 级微分段。
在着手添加剩下的两项功能(异常检测和行为分析)之前,我们决定看看现有的解决方案是否可以帮助我们。 尽管市场上有许多边界防火墙和 Web 应用防火墙产品,但大多数解决方案都是针对保护面向互联网的应用程序的。 他们假设所服务的流量是网络流量,并为 HTML、javascript、sql、CMS 等提供有针对性的保护——使得编写签名和规则来捕获漏洞和已知漏洞变得相对容易。
虽然此功能对于我们的网络流量很重要,但我们还需要在我们的环境中服务越来越多的 API 和机器对机器流量。 为了解决这个问题,我们的安全团队必须编写不属于已知的典型网络规则(如 OWASP CRS)的应用程序特定规则。 通常安全管理员对应用程序知之甚少,并且由于环境的动态特性,跟踪应用程序的类型和结构以编写特定于应用程序的规则变得更加困难。 因此,虽然我们的平台团队在我们的网络数据路径中提供了此功能,但我们的安全团队并不经常使用它。
我们从网络中获得大量数据的另一个问题是,应用程序攻击随着时间的推移变得越来越复杂。 攻击者花费数天时间进行侦察,通过查看 HTTP/TCP 签名等来确定 API、应用程序、底层基础设施和操作系统类型的细节。 在这些情况下,传统签名和基于规则的方法用处非常有限,我们决定继续采用基于人工智能的方法来自动学习用户行为并强制执行好行为与坏行为。
大多数应用程序都有特定的工作流程(API 序列)和上下文(API 内的数据),不同的用例/部署是根据这些工作流程和上下文设计的,通常由应用程序的用户遵循。 我们利用这些属性并训练我们的机器学习算法来模拟用户与应用程序的典型交互中的“有效”行为模式。
我们的数据路径对每个 API 的请求/响应以及相关数据进行采样,并将其发送到我们的中央学习引擎,如图 3 所示。 该引擎不断生成和更新有效行为模式模型,然后由数据路径中运行的推理引擎使用该模型来警报/阻止可疑行为。
学习引擎查看许多指标,例如 API 的序列、请求之间的间隙、对相同 API 的重复请求、身份验证失败等。 我们会针对每个用户分析这些指标,并以汇总的方式区分好行为和坏行为。 我们还进行行为聚类来识别多种不同的“良好行为”序列。 让我们举一个例子来说明这一点:
以下 API 序列将被系统标记为可疑/不良行为,系统将自动缓解这些行为或生成警报以便管理员进行干预
我们在一年前将该系统投入生产时,根据使用情况和客户反馈不断完善模型。 我们已经成功识别了以下类型的攻击:
话虽如此,我们也意识到这种方法存在一些问题——它无法发现低速和慢速攻击(暴力破解、应用程序拒绝服务、扫描仪),我们需要应用异常检测技术。
有时,我们会看到高度复杂的攻击,这些攻击使用大型分布式僵尸网络,而这些攻击无法通过我们的行为分析技术的监测。 此类攻击的示例包括:
由于我们的网络数据路径正在从全球网络中的每个节点收集信息,因此对特定应用程序的聚合指标(如请求率、错误率、响应吞吐量等)进行分析变得相对容易。 通过这种分析,我们可以检测分布式攻击,并通过识别可能属于此类僵尸网络的用户来减轻攻击(在每个节点)。 让我们举一个例子,我们试图通过查看请求率来检测不同时间窗口(过去 5 分钟、30 分钟、4 小时、24 小时)内的异常,如果给定时间窗口内的请求率很高,那么系统将执行以下更深入的访问日志分析:
虽然异常检测一直是防火墙设备中入侵检测和预防(IDS/IPS)的重要技术,但这些设备无法减轻全球应用层攻击。 凭借我们在全球平台上执行 API 标记和学习的能力,我们现在能够从源头上抑制分布式网络的攻击。
虽然我们对基于服务网格和 API 网关的零信任实现非常满意,但我们意识到它不足以全面保护分布式应用程序集群免受漏洞和恶意攻击。 我们必须通过机器学习来增强行为分析 + 异常检测,同时结合传统的签名 + 基于规则的技术,以提供更好的安全解决方案。
我们在 L3-L7+ 网络数据路径中添加分布式推理以及在集中式 SaaS 中运行学习核心,看到了三个显著的收益:
网络和应用程序安全是一条永无止境的跑道,看起来我们还有大量的新功能需要添加。 我们将在不久的将来回来分享有关我们已经实施的增量算法和技术的更多见解。
本系列博客将涵盖我们构建和运营全球分布式 SaaS 服务的各个方面,该服务在公共云、我们的私有网络 PoP 和边缘站点中拥有许多应用程序集群。 接下来将是“跨全球分布式平台的可观察性”(即将推出)...