作者:Paul Klinker
翻译:Bach(才云)
校对:星空下的文仔(才云)、bot(才云)
微服务有很多长处,包含独立的拓展、隔离的业务逻辑、独立的生命周期治理以及繁难的分布式开发。这些长处同时也带来了一些弊病,例如微服务可能会减少安全漏洞, 因为每个微服务都能够是攻打指标,这有形间减少了攻击面 。如果入侵者进入网络,它们能够肆意地攻打单个微服务,因而仅爱护网络边界(network border)是不够的,还必须爱护网络外部,这就是零信赖(Zero Trust)的起源。
零信赖的概念由 John Kindervag 提出,它指的是无论网络范畴是外部的还是内部的,都不能有任何隐式信赖(implicitly trust),任何起源都须要显式验证,并应用最小特权来限度对资源的拜访。 简而言之,零信赖策略就是不置信任何人。除非网络明确晓得接入者的身份,否则任谁都别想进入。无论是 IP 地址、主机等等,只有不晓得用户身份或者不分明受权路径的,通通不放进来。
本文展现了将 Istio 服务网络配置为零信赖网络的具体步骤,次要应用一个简略的微服务架构,而后通过 Istio 删除隐式的服务到服务(service-to-service)信赖关系。
应用自行开发的解决方案爱护微服务网络可能十分艰难,但服务网格(如 Istio)能够提供帮忙,它确保了南北流量(north-south traffic)和货色流量(east-west traffic)的平安。 南北流量是进入和来到服务网格的流量,货色流量是网格内的流量,通常是服务到服务的流量。Istio 通过入口(ingress)和进口(egress)网关解决南北流量,流量路由则是由虚构服务治理。Istio 的 Envoy Proxy 能够治理货色流量,在服务的 Kubernetes Pod 中作为边车(Sidecar)运行。上面咱们就看一下这些概念在小型服务网格中的示例。
K8sMeetup
在服务网分外公开服务
在该例子中,咱们将从两个微服务开始:一个在 NGINX Web 服务器中运行的 Web 客户端和一个 Java/Spring Boot 后端的 REST Service。
该客户是个“敌对”客户,咱们容许其拜访后端服务。前面咱们将向网格增加一个微服务,一个歹意的“敌人”Web 客户端,该客户端将被回绝拜访后端微服务。后端微服务称为“Capitol-Info”,具备查问和插入 Capitol 数据库的性能。这些微服务公开的 endpoint 如下图所示,该图显示了凋谢的、不受爱护的服务网格体系结构。
在 Istio 服务网格中运行的 Capitol-Client 微服务和 Capitol-Info 微服务
咱们当初在尝试爱护服务网格的微服务,所以不调用客户端网站到后端微服务。相同,咱们要创立一个 API 网格,并容许该网关调用服务,从而实现服务到服务的调用。NGINX 在 Web 客户端的 /capitolservice
门路下提供了一个 API 网关。当应用此门路调用 Web 客户端时,NGINX 网关会将代理 Capitol-Info 服务的调用。
对于 Istio 配置,咱们首先为客户端和数据微服务(Data Microservices)提供入口网关和虚构服务。入口网关是规范 80 端口(Web)网关,咱们将重点放在 Istio Virtual Service 解决流量路由。咱们从以下虚构服务定义中所示的 Capitol-Info 服务开始:
Capitol Service VirtualService 定义
Capitol-Info 虚构服务表明,咱们仅凋谢了入站流量(inbound traffic)的 getCapitol REST 操作,没有凋谢 addCapitol REST 操作的 insert 性能。因而,addCapitol REST 操作不受内部(南北)调用的爱护,也不受服务网格内其余微服务调用(货色调用)的爱护。这样,getCapitol 调用对南北和货色的调用是凋谢的。
Capitol-client Virtual Service 定义
The capitol-client 虚构服务表明咱们正在关上 /capitolservice
下的 API 网关,以及创立在 /info
门路下的 HTML 页面。
K8sMeetup
锁定微服务
本文曾经介绍了根本架构,上面咱们应用受权策略将其锁定。这是迈向零信赖网络的重要一步,不再隐式信赖网格中的其余服务。
要锁定微服务,咱们首先应用“回绝所有”策略,并利用于所有命名空间(默认)以锁定所有通道。而后,咱们创立一个 Istio AuthorizationPolicy(受权策略)以关上 endpoint。在第一个例子中,咱们利用的策略容许任何调用者拜访咱们创立的资源:
咱们能够看到这里容许基于 HTTP 操作(GET、POST)和 URI 门路拜访微服务。这里要留神,咱们必须增加 NGINX API 网关、/capitolservice
到 AuthorizationPolicy 中,以使其可拜访。如果少了这一步,那么网页将打不开,并且调用后端 Capitol-Info 微服务的性能也会被阻止。
利用了该受权策略后,咱们就能够拜访咱们的网页和 REST endpoint。这里要留神,尽管咱们容许任何人拜访 /addCapitol
,但外界仍无法访问它,因为咱们尚未在虚构服务中创立路由。如果咱们到 Web 客户端查问 Capitol,http://localhost/info/QueryCapitol.html
,咱们能够拜访该站点并运行查问:
客户端微服务,Capitol 查问网页
当初咱们曾经应用了宽松的受权策略关上了流量,上面再抉择一些锁定策略。如果咱们通过删除 Web(/info)和 API(/capitolservice)的拜访容许来阻止对 Web 客户端的拜访,这样就限度了进入 Capitol-Client 的流量。查看上面的客户端和服务器受权策略,如果咱们利用仅容许拜访 Capitol 数据服务的策略,那么网站的拜访就会被阻止。资源仅容许 /getCapitol REST 调用入站南北流量,而 /appCapitol 仍因为短少虚构服务路由而被阻塞。
因为 Capitol-Client 仅在默认命名空间内运行,因而无法访问。咱们也未明确授予特权,因而“回绝所有”策略对这些资源均无效。咱们导航到网页 http://localhost/info/GetCapitol.html
,此时拜访仍被回绝。
阻止网页是件奇怪的事件,相同,咱们只心愿爱护后端 API 免受外界拜访,但网站心愿能够关上。当初咱们假如不心愿任何人间接从 Capitol-Info 服务中获取数据,而是仅通过 Capitol-Client 获取数据。对此,咱们能够删除入口,阻止内部流量,但服务网格内的其余实体依然能够获取。因而,不仅要阻止内部流量来实现零信赖,咱们还须要阻止未经批准的外部服务到服务的流量。
上述受权策略的一个问题是命名空间是全局的(默认),这意味着规定实用于命名空间内的所有服务。Capitol-Info 微服务和 Capitol-Client 微服务具备不同的 endpiont,因而咱们为服务别离设置配置。
客户端受权策略
下面的客户端策略关上了服务网格内部和外部客户端内的入站流量,因为它没有指定“from”的规定,但指定了“to”的规定。
服务端受权策略
利用以上策略会为 Capitol-Client 和 Capitol-Info 微服务提供其本人的受权策略。查看服务网格 Istio 的 Kiali 仪表板,咱们能够看到已利用的受权策略。
Kiala 仪表板显示 Istio 网关、虚构服务和受权策略
这些特定策略意味着,咱们作为微服务的所有者,能管制谁能够拜访它们。随着受权策略的拆散,咱们能锁定 Capitol-Info 服务的可信赖货色流量。
当初更新后的 Capitol-Info 受权策略,将流量限度为默认域(default domain)中的 Capitol-Client 微服务。这是因为咱们在“from”规定中指定了 principal。上面测试这一点,咱们在网格中增加一个“敌人”微服务。如前所述,零信赖意味着不会隐式信赖其余参与者,所以即使该微服务存在于服务网格中,但不意味着咱们信赖它。咱们的数据服务会保护本人的平安配置,能够决定信不信赖谁。
倘若,敌方服务被歹意内部人员部署到服务网格中。该服务模拟了无效敌对客户端的 URI 和 API 网关,如下图所示:
没有货色安全控制,歹意微服务将严重破坏
如果咱们不应用限制性的 Capitol-Info 受权策略,那么敌方微服务能够间接调用 Capitol-Info 微服务。假如敌方服务更进一步,甚至能够申明本人的受权策略,以笼罩“回绝所有”策略,并将其部署到集群中:
如果咱们查看敌方微服务的配置,它会尝试增加本人的 ALLOW 语句来笼罩 Capitol-Info 服务策略。ALLOW 语句(/enemy 和 /capitolenemy)会笼罩“全副回绝”策略。对 /getCapitol API 进行 HTTP GET 和 POST 操作的最初一条规定被笼罩和疏忽。当咱们尝试从敌方客户端调用 getCapitol 或 addCapitol REST 操作时,调用会被阻止并且数据服务会被爱护起来。
在零信赖网络中,敌方微服务被阻止拜访其余微服务
为了进一步爱护咱们的数据服务,当初咱们应用受权策略爱护服务到服务之间的通信,咱们能够删除 Capitol-Info 入口官网和虚构服务,仅容许 Capitol-Client 网页和 API 网关的拜访。
K8sMeetup
总结
本文展现了如何通过将服务网格锁定受信赖源的流量,以利用零信赖准则。应用 Istio,咱们能够应用多种资源来限度对微服务的拜访,包含限度虚构服务,以及基于流量源和目的地的受权策略。
原文链接:https://mp.weixin.qq.com/s/a93n0V9Imfgp9kLn8xVoCQ