使用服务网格增加安全性:Christian Posta探索Istio的功能

我想借此机会介绍一下Istio的一个特定领域,它将为云服务和应用程序的开发人员和操作人员带来大量的价值:安全性

第六章

Istio帮助使“服务网格”概念更加具体和可访问,而且随着Istio 1.0的发布,我们可以预料利息会激增。

在云平台上运行应用程序时,Istio试图解决一些特别困难的挑战:应用程序网络、可靠性和可观察性。

另一个挑战是安全问题。在Istio中,网格中的服务之间的通信是安全的,并且在默认情况下是加密的。

Istio还可以帮助“起源”或“终端用户”JWT身份标记验证。

这些基本的安全特性为构建“零信任”网络铺平了道路,在这种网络中,我们基于身份、上下文和环境来分配信任,而不仅仅是“打电话的人恰好在同一个内部网络”。

Istio帮助使“服务网格”概念更加具体和可访问,而且随着Istio 1.0的发布,我们可以预料利息会激增。Jasmine Jaksic在InfoQ之前的一篇文章中介绍了Istio和服务网格,因此,我想借此机会介绍一下Istio的一个特定领域,它将为云服务和应用程序的开发人员和操作人员带来大量的价值:安全性

【Istio用例】

在云平台上运行应用程序时,Istio试图解决一些特别困难的挑战。具体来说,Istio解决了应用程序网络、可靠性和可观察性的问题。在过去,我们尝试使用专门构建的应用程序库来解决一些挑战,比如电路中断、客户端负载平衡、度量收集等等。在不同的语言,框架,运行时,等等,造成了一种难以承受的操作负担,大多数组织都无法做到这一点。

此外,在每种语言中发现的实现之间很难保持一致性,更不用说在需要更改或识别bug时将它们全部升级。围绕可靠性、可观察性和策略执行的许多挑战都是非常横向的关注点,而不是业务差异。虽然它们不是直接的微分,但忽略它们会造成巨大的商业影响,所以我们需要解决它们。Istio旨在解决这些问题。【网络安全的重要性】

另一个水平的,很难得到正确的,对应用程序团队的关注是安全性。在某些情况下,安全性是一种事后的想法,我们试图在最后一刻将其硬塞进我们的应用中。为什么?因为做安全是很困难的。例如,像“加密应用程序流量”这样的基本功能应该是通用的和直接的,对吗?为我们的服务配置tl/https应该是直接的,对吗?我们甚至可能在过去的项目中做过。然而,在我的经历中正确地做这件事并不像听起来那么容易。我们有正确的证书吗?他们是由客户所接受的CA签署的吗?我们是否启用了正确的密码套件?我是否正确地将其导入到我的信任库/密钥库中?在我的tl/https配置中启用“不安全”标志不是很容易吗?

错误地配置这类东西可能是极其危险的。Istio在这里提供了一些帮助。Istio部署sidecar代理(基于特使代理),以及每个应用程序实例,该实例负责处理应用程序的所有网络流量。当应用程序试图通过双轮马车跟http://foo.com它代理(在回送网络接口)和Istio将流量重定向到其他服务的双轮马车代理,然后代理交通实际上游http://foo.com。通过这些代理请求路径,我们可以做诸如加密传输自动应用程序无需知道任何东西。这样我们得到一个持续应用流量加密不依赖每个应用程序开发团队“做对了”。

建立和维持的一个问题的实现TLS和相互TLS为你的服务架构是证书管理。Istio Citadel组件的控制平面处理得到证书和密钥到应用程序实例。城堡可以生成每个工作负载所需的证书和密钥识别本身,以及旋转证书定期,这样任何妥协证书有一个短暂的生命。使用这些证书,Istio-enabled集群自动相互TLS。你可以根据需要插入自己的CA根证书提供商。

Istio,服务网格之间的通信是安全的,默认加密。你不再需要浪费时间与证书和CA证书链TLS工作。运营商不再有希望和祈祷每个开发人员正确地实现和配置他们的TLS / HTTPS设置正确。它是通过一些Istio为您自动完成配置。

【使用启用mtl Istio】

Istio Kubernetes一样遵循相同的路径配置。实际上,Kubernetes Istio配置了Kubernetes定制资源定义(CRD)对象。的两个主要对象配置Istio的安全政策是政策和DestinationRule对象。政策对象是用于配置服务的安全设置(或一组服务)。例如,配置所有服务运行在Kubernetes客户名称空间中,我们可以使用以下策略对象:

我们使用这个配置、服务运行在客户名称空间将指望使用mtl的传入流量。但是使用mtl,我们还需要告诉客户时使用mtl调用一个服务。要做到这一点,我们将使用一个Istio DestinationRule。在Istio DestinationRule总是用于配置如何客户服务说话。DestinationRule我们可以指定电路破坏、负载平衡和TLS。要启用mtl,我们可以使用一个配置是这样的:

这DestinationRule需要客户打电话时使用mtl服务客户名称空间。我们还配置tls模式ISTIO_MUTUAL这意味着我们将期待Istio管理证书和密钥以及挂载到服务(使用Kubernetes Kubernetes秘密),以便服务代理可以使用它们来建立tls。如果我们想要有自己的控制客户端证书,我们也可以使用一个模式的相互和供应磁盘上的位置,客户可以找到自己的证书和私钥。

【使用Istio验证身份(JWT)起源】

当我们使用mtl如上所述,我们不仅可以加密连接,但更重要的是知道是谁打电话给谁。Istio使用安全生产标识每个人(SPIFFE)规范的框架。身份编码用于mtl的证书。这种方式,服务一个知道当服务B和它,事实上它是服务我们可以编写规则围绕这些身份对规则或政策服务网格必须执行。例如,如果服务不允许跟服务B,我们可以执行的sidecar运行与每个应用程序使用用于建立mtl身份。

但是当服务正在请求服务B X代表用户?如果服务允许调用和问服务B做某事(检查账户余额),但用户X不能,我们如何验证和执行呢?服务体系结构,典型的方式服务通信终端用户或起源身份(用户登录)是Web令牌传递JSON之类的身份令牌。这些令牌代表一个经过身份验证的用户和用户的索赔。

Istio可以帮助“起源”或“终端用户”JWT身份令牌验证。这是每个应用程序的另一个领域语言/框架组合历来不得不依靠库来处理验证和开箱JWT令牌。例如,对于流行的Keycloak SSO身份和项目,有语言插件为每一个受欢迎的语言来处理一些这方面的责任。如果我们使用Istio然后我们可以免费获得这样的功能。例如,配置Istio使用mtl和验证JWT令牌请求(和失败的请求,如果它不存在,是无效的,或者过期了),我们可以配置一个策略对象。记住,政策对象指定的行为我们要服务:

在这个配置中,如果一个客户机试图连接到客户服务,他们的要求不会让它服务,除非JWT身份验证成功。Istio实现的另一个优点是,请求我mtl也是受保护的。这有助于保护JWT令牌获得泄露和用于某种重播攻击。

【未来:Zero-Trust网络】

我们讨论了几个方法Istio可以改善你的安全状况,以构建原生云应用程序。与强大的身份服务与彼此交谈以及起源/终端用户,我们可以写一些非常强大的访问控制规则如何系统允许的行为。此基础上为构建“zero-trust”的道路网络。zero-trust网络,我们分配信任基于身份以及上下文的情况下,不仅“调用者发生在相同的内部网络”。当我们开始走向完全连接和混合云部署模型,我们需要重新思考如何构建安全体系结构。Istio可以解决挑战在今天的体系结构以及在未来给你更多的选择。

Istio提供一些非常强大的功能,服务团队将不得不解决的一种方式或另一个。它提供了不错的api和配置对象来完成这个以外的应用程序服务。这是在一个高度分散的方式实现,目的是高度弹性的失败。如果你想采用服务网格,并考虑安全在你的列表,看看Istio。

关于作者:

基督教Posta(@christianposta)的首席架构师云应用程序在Red Hat和众所周知的社区成为一个作者(引入Istio服务网格,O ' reilly,2018年Microservices对于Java开发人员,O ' reilly 2016),频繁的博客,演讲者,开源爱好者,各种开源项目包括Istio提交者,Apache ActiveMQ,Fabric8,出版社。基督教也花时间在网络公司,现在帮助企业创建和部署大规模、有弹性、分布式架构——许多我们现在称之为Microservices。他喜欢指导、培训和带领团队取得成功与分布式系统概念,microservices,devops,进行应用程序设计。

部分图片源自网络,侵删。

翻译不易,转载注名。