使用Cilium加强Istio—经过Socket感知BPF程序

本博客将介绍BPF和Cilium如何加强Istio的一些细节,主要关注Istio的安全性,开启Istio对外部服务的支持和性能部分。linux

原文地址:cilium.io/blog/2018/0… git

译者:甄中元github

审核:宋净超安全

8月1日Istio 1.0 发布,Cilium社区感谢全部Istio贡献者为此付出的巨大努力。咱们很幸运可以参与社区活动,为Istio作出贡献,并帮助一些用户经过Istio和Cilium进行生产部署。若是您有兴趣在深刻了解技术细节以前了解Istio + Cilium的用户故事,请考虑阅读HP FitStation团队(最大的Cilium + Istio用户之一)发布的如下Istio博客: Istio是惠普FitStation平台的游戏规则的改变者性能优化

本博客将介绍BPF和Cilium如何加强Istio的一些细节:服务器

  • 加强安全微信

    • 使用socket感知BPF程序为多容器pod提供最小权限网络

    • 防止受损的sidecar代理和绕过sidecar协议架构

    • 使用BPF强制全部应用程序流量通过sidecar代理负载均衡

  • 开启Istio对外部服务的支持

    • 使用socket感知BPF程序和kTLS提供TLS连接加密的可视化和控制管理

  • 性能

    • 高效网络和socket重定向加速istio性能

Cilium是什么?

Cilium是一个开源软件,用于透明保护在使用Kubernetes、Docker和Mesos等Linux容器管理平台部署的应用程序服务之间的网络和API链接。

Cilium的基础是一种名为BPF的新Linux内核技术,这使得可以在Linux自身内动态植入强大的安全性,可见性和网络控制逻辑。除了提供传统的网络级安全性以外,BPF的灵活性还能够在API和进程级别上实现安全性,以保护容器或容器内的通讯。因为BPF在Linux内核中运行,所以无需对应用程序代码或容器配置进行任何更改即可以应用和更新Cilium安全策略。

有关Cilium的更详细的介绍,请参阅Cilium简介部分。

Istio是什么?

Istio提供了一种经过负载均衡、服务间身份验证、监控等且没有侵入性建立部署服务网络的简便方法。能够经过在整个环境中部署特殊的sidecar代理来添加对服务的支持,该代理拦截微服务之间的全部网络通讯,使用Istio的控制平面功能进行配置和管理。

您能够在Istio文档中阅读有关Istio概念和架构的更多信息。

Istio高效网络

Istio和Cilium之间最基本的协做形式是Cilium CNI插件经过将全部sidecar代理链接在一块儿并经过提供代理和Istio控制平面之间的链接,为Istio提供网络链接。Cilium还确保Istio托管服务能够与不受Istio管理的pod进行通讯。

下图说明了Istio控制平面、sidecar代理和CNI插件如何相互叠加:

在这种模式下,全部Istio系统组件都受益于Cilium在Linux内核中基于BPF的高效网络功能。BPF是网络和数据包过滤技术(如iptables等)的替代方案。您能够在如下博客文章中找到有关BPF推进这一转变的缘由的更多信息:为何内核社区用BPF替换iptables?

Socket级别重定向加速Istio和Envoy

Istio服务网格架构要求将参与服务网格的全部pod的出站和入站请求的全部网络流量都要重定向到sidecar代理。Sidecar代理将终止全部TCP链接并执行诸如遥测、重试、路由、双向TLS之类的服务和表明服务的受权,并使用辅助所谓的上游TCP链接来到达目的地服务,这正是服务之间支持双向TLS,没有代码侵入性缘由所在。然而,当使用标准的基于IP的工具(如iptables)实现重定向时,这种重定向可能会很费事,由于必须屡次遍历整个TCP/IP堆栈。

Cilium充分使用了一个叫sockmap的使人兴奋的BPF功能。它容许过滤和重定向,基于套接字级别,使Cilium能够socket感知。此socket是应用程序用于发送和接收网络流量的接口。这容许在相同节点上实质上短路TCP socket,从而以彻底透明的方式大幅加速应用程序和服务网格的sidecar代理的通讯速度。应用程序和sidecar代理都不须要以任何方式进行修改。若是您有兴趣了解有关此用例的更多信息,请参阅位于奥斯汀的KubeCon 2018上的演示文稿——使用CIlium加速Envoy、Istio和Linux内核(录像幻灯片

用Cilium加强Istio安全性

Cilium与Istio整合,以加强Istio的安全性。咱们来看看Istio提供的安全属性:

  • 双向TLS:若是发送者由Istio控制,则可以验证发件人的身份。这能够保护服务免受来自非法源服务欺骗IP地址的攻击请求。它还能够在Istio管理的全部服务之间启用基于TLS/SSL的加密。

  • 受权:可以受权请求,包括过滤元数据(如HTTP协议字段,IP寻址和身份信息)以及调用其余受权插件(例如,执行令牌验证)。

LEVEL 1: 保护不受支持的协议和受损的sidecar(Cilium 1.0)

所需的第一个基本保护级别是将安全策略应用于Istio不支持的全部网络协议,包括UDP、ICMP和全部IPv6流量。任何此类流量都会绕过sidecar代理,从而经过Istio强制执行任何最终安全策略。不管协议如何,Cilium将pod以外全部网络流量应用L3/L4安全策略。若是遇到不支持的协议,则将丢弃该数据包。

安全化非IPv4/TCP协议

Cilium在pod以外提供安全策略,对于协议不受支持、重定向或因为某些其余缘由而失败,将彻底阻止或应用细粒度的安全规则到任何绕过代理的流量。

防止受损的sidecar

sidecar代理自己不受Istio安全规则的约束。受损的sidecar能够不受限制地访问网络。它还能够操纵本身的安全规则以变得更加宽松。除了Istio以外,Cilium还容许定义服务级别安全策略,并确保受损的sidecar代理只能以最小权限运行。

LEVEL2: 安全的多容器Pod(正在开发中)

Level 1 安全级别以pod、service为级别保护服务网格。它不提供容器内部的任何安全性,例如用于应用容器和sidecar容器之间的通讯。

Level 2 安全级别经过使用socket感知BPF程序在socket级别提供分段,在同一个pod中引入容器和进程之间的分段。

  • 强制全部应用流量流经sidecar: 经过使用socket感知BPF策略,Cilium能够确保应用程序的全部通讯都必须经过sidecar进行入站和出站链接。保证应用程序容器自己不能从pod外部接收链接,或者在不经过sidecar代理的状况下向pod外部发出请求。

  • Pod中的最小安全权限:经过使用socket感知BPF程序锁定容器内部和进程级别的通讯,其中一个容器中的安全漏洞再也不致使整个容器被泄露。这尤为重要,由于sidecar容器能够直接访问pod中的任何其余容器,而且能够访问潜在的敏感信息。

有趣的事实

支持socket的BPF程序不只限于基于IP的socket。安全策略也能够扩展到涵盖UNIX域socket。

外部服务的TLS可见性(正在开发中)

Istio依赖于对应用程序协议层(如HTTP)的可见性,以提供诸如基于URI的路由,基于HTTP头的受权和API请求级别遥测和跟踪等功能。经过将双向TLS与Istio Citadel管理的证书相互应用,能够在未加密的服务之间保持应用程序流量并在源服务器和目标服务的sidecar代理之间执行TLS加密来实现此可见性。

这适用于网格内部服务之间的链接。与网格以外的服务的通讯几乎由应用程序自己进行TLS加密保证,以便在不可信的因特网上保护通讯。

Linux的kTLS(内核TLS)工做原理最初是由Facebook的Dave Watson提出。它包括将数据的对称加密从应用程序中的SSL库迁移到Linux内核中的socket功能。这项工做的最初动机是纯粹的性能优化,由于使用kTLS比SSL库快3-4%。这对于通过SSL静态数据的提供者有足够的兴趣去继续。这项工做已经合并,而且能够在最新的Linux内核中使用。结合在Linux socket层注入的BPF程序的功能,kTLS实现了数据的透明可见性,不然此时已加密。

咱们仍在研究这个功能,但有一个初始的功能原型,证实了得到可见性和控制数据的概念,这些数据一般是在应用程序自己中进行TLS加密的。下一步是将此数据提供给sidecar,以便在与外部服务的链接上释放Istio。

在没侵入应用程序的状况下kTLS是如何实现透明化的?

公平地说,应用程序使用的SSL库必须感知kTLS,而且用户必须选择系统级别的行为。在应用程序运行时升级SSL版本和启动可视化同样简单,没有侵入应用程序。因为可见性是在socket级别得到的,这也意味着应用程序在排队后没法再更改此数据。若是数据用于受权请求,则这一点相当重要。

概要

  • 加强Istio安全

    • pod中最小权限:经过使用socket感知BPF程序锁定容器内部和进程级别的通讯,其中一个容器中的安全漏洞再也不致使整个容器被泄露。

    • 安全化非IPv4/TCP协议:目前,Istio仅支持TCP和IPv4。任何其余协议(如UDP或IPv6)都将绕过sidecar代理和任何Istio安全规则,Cilium将经过彻底阻止这些协议或应用细粒度的安全规则来介入。

    • 防止受损的sidecar:sidecar代理自己不受Istio安全规则的约束。受损的sidecar能够不受限制地访问网络。它还能够操纵本身的安全规则以变得更加宽松。除了Istio以外,Cilium还容许定义服务级别安全策略,并确保受损的边车代理只能以最小的权限运行。

    • 前置应用流量通过sidecar:经过使用socket感知BPF策略,Cilium能够确保应用程序的全部通讯都必须经过sidecar进行入站和出站链接。保证应用程序容器自己不能从pod外部接收链接,或者在不经过sidecar代理的状况下向pod外部发出请求。

  • 外部服务

    • 使用SSL为Istio加密连接:与群集外部服务的TCP链接一般是TLS加密的,而且Istio没法检查此类链接的HTTP头。经过利用kTLS集成到内核中的BPF,Cilium将可以提供对TLS加密数据的可见性和控制管理。

  • 性能

    • 高效网络:Istio须要一个CNI插件来提供pod之间的网络链接。Cilium实现了CNI插件接口,并利用BPF在sidecar代理和Istio控制平面之间提供高效的数据路径。

    • socket重定向加速Istio:经过使用socket感知BPF程序在Linux socket级别执行流量重定向,Cilium能够加速流量重定向到sidecar代理。这容许绕过很费事的TCP/IP堆栈遍历并且对应用程序或sidecar代码没有侵入性。

若是您有兴趣了解更多信息:

ServiceMesher社区信息

社区官网:www.servicemesher.com

Slack:servicemesher.slack.com 须要邀请才能加入,有志于加入ServiceMesher社区为Service Mesh做出贡献的同窗能够联系我。

Twitter: twitter.com/servicemesh…

更多Service Mesh咨询请扫码关注微信公众号ServiceMesher。

相关文章
相关标签/搜索