博客

HTTP 上升: 集装箱环境中的遥测、跟踪和恐怖

Lori MacVittie 缩略图
洛里·麦克维蒂
2017 年 12 月 4 日发布

HTTP 无处不在。 您的电视使用 HTTP。 您的电话。 您的平板电脑。 你的车。 如果它是一个具有网络功能的设备,那么它说 HTTP 可能就像你说母语一样流利。

团队-http-badger

HTTP 是一种灵活的东西。 与其网络邻居 TCP 和 IP 不同,它从 A 点到 B 点所携带的信息几乎是无限的。虽然 IP 和 TCP 必须遵守非常严格、不灵活的标准,这些标准精确地定义了可以使用的值,但 HTTP 对其携带的数据采取了自由放任的态度。 文本。 二进制。 JSON。 XML。 已加密。 纯文本。

和蜜獾一样,HTTP 并不关心。 它将承载这一切——甚至更多。

HTTP 不断展现其灵活性的方式之一就是其用户很少见到的标头。 这是每个 HTTP 请求和响应携带的元数据。 它共享一切信息,从内容类型到内容长度,从授权令牌到面包屑,这些信息会透露出你是谁、你去过哪里——不管你是否愿意。

这一点很重要,因为正如我们在容器空间中看到的那样,HTTP 标头不仅作为一种在客户端和服务之间传输数据的机制而发展,而且作为一种共享元数据的手段,使得这些快速移动的环境能够非常有效地扩展。

越来越值得注意的是服务网格的概念,以及随之而来的携带操作信息的自定义 HTTP 标头。 这篇来自 Buoyant(两大领先的开源服务网格实现公司之一)的博客说明了对 HTTP 标头的依赖,以便共享遥测数据,从而实现跟踪关联,有助于简化组成单个 HTTP 请求和响应对的跨服务的高度复杂的事务集。

对于那些对阅读上述整个博客不感兴趣的人,以下是最相关的部分——重点是我标注的:

虽然我们 Buoyant 喜欢将 linkerd 提供的所有附加跟踪数据描述为“微服务的神奇遥测喷雾”,但事实上我们需要少量的请求上下文来将跟踪连接在一起。 当 linkerd 收到请求时,就会建立请求上下文,对于 HTTP 请求,当 linkerd 将请求代理到您的应用时,它会通过 HTTP 标头传递。 为了使您的应用保留请求上下文,它需要在其发出的任何出站请求中不加修改地包含所有入站l5d-ctx-* HTTP 标头。

需要注意的是,引用的自定义 HTTP 标头只是在这些高度分布式系统中用于共享遥测的几个标头之一。 正如博客中所述, l5d-sample标头可用于调整跟踪采样率。 因此,它不仅用于共享信息,还用于提供对系统的操作控制

让这一点持续一会儿。 HTTP 标头用于控制操作系统的行为。 记住这一点,这在接下来的几段中很重要。

在这种情况下,不是将控制平面与数据平面分离,而是同时传输两个平面,并将其落到端点,以将形式与功能分离。 由于这个特定的解决方案依赖于服务网格概念——其中服务的每个入站和出站请求都通过代理——所以这很容易实现。 代理可以过滤掉操作 HTTP 标头并在将请求(或响应)转发给预期接收者之前对其采取行动。 它还可以添加任何操作指令以及插入遥测数据以帮助稍后匹配痕迹。

应用网络在容器环境中也变得越来越普遍。 虽然它一直存在(至少对于我们这些可编程代理领域的人来说),但随着对更大灵活性的需求不断增长,它现在以更高的频率出现。 入口控制器本质上是可编程代理,它不仅支持基于 IP 地址或 FQDN 进行路由,还支持基于 HTTP 标头最常携带的应用程序特定数据进行路由。 版本控制、指导、扩展。 入口控制器的所有这些功能都是通过 HTTP 及其对 HTTP 标头的无关态度实现的。

遗憾的是,HTTP 标头本身也是攻击媒介。 因此,我们有责任仔细考虑依赖 HTTP 标头的后果,不仅要共享操作数据,还要控制操作行为。 HTTP 标头是一个通配符(认真地阅读 BNF),其本质上普遍基于文本。 这使得它们不仅易于修改,而且还容易被操纵以携带恶意命令,而被越来越多的中间和端点设备和系统所使用。

如果这没让你感到害怕,那说明你还没有注意到。

幸运的是,使用 HTTP 标头作为控制和数据平面的方法主要限于容器化系统。 这意味着他们通常隐藏在几个面向公众的控制点后面,这些控制点使组织能够减轻其过于慷慨的性质所带来的威胁。 结合安全入站路径(南北)的架构方法可以提供必要的保护以防止攻击。 不,我们没见过有人尝试这么做。 然而。 但是我们已经看到了太多因 HTTP 标头而导致的违规行为,所以谨慎一点总比后悔好。

HTTP 正在崛起,不仅成为应用程序、服务和设备的主要协议,而且成为遥测、跟踪和操作命令传输的主要协议。 这是一个激动人心的时刻,但是,如果我们要避免运营灾难,就需要将“我们可以做任何事情”转变为“但让我们安全地去做”。