基于服务网格的访问控制的实践研究
2024-05-16王兆熠于千慧袁迎迎魏星
王兆熠 于千慧 袁迎迎 魏星
摘要:云计算和微服务已经成为广大开发者和运维人员的首选部署方案。它们具有更高的资源利用率、应用间更低的耦合性和更灵活的架构设计等优点,为人们提供了更多的选择。虽然云计算和微服务降低了复杂系统的开发和运维难度,但随着服务和功能模块的增加,对于外部和模块间访问的控制难度也越来越大。为了以更加简单方便的方式进行微服务的访问控制,本文采用以文献调查为辅、实践为主的方法,基于Istio服务网格进行微服务的访问控制的研究与探索。通过实践,本文发现借助Istio的安全能力,开发和运维人员可以通过在Kubernetes中编写和下发配置文件来方便地开启或对指定服务配置更细粒度的访问控制。新一代服务网格Istio提供了更方便、快捷和安全的信息安全把控和审计能力。
关键字:云计算;服务网格;Istio;访问控制;Kubernetes
一、引言
(一)研究目的
軟件业务系统的不断壮大,其所涉及的业务功能模块和中间件也越来越多,这也导致了模块的开发难度逐步增大,模块间调用逻辑越发复杂。单体式架构早已不能满足当今需求,其拓展性低、耦合度高、运维难的缺点深受诟病。云计算和微服务的到来给了这一问题全新的解决思路,企业可以通过业务分解,将负责模块间通信的部分抽离出来,让研发人员专注于业务逻辑的研发,而不用过多地关注其他的因素。然而,越来越多的服务数量也为服务间或外部访问的控制带来了难度。本文的目标是探索访问控制在服务网格(Istio)中的实践方式和技术细节。
(二)研究背景与文献综述
Peter博士在2005年的一次云计算会议上首次使用了微服务这个术语。微服务诞生于一次架构师大会,被用于描述许多架构师正在尝试的新型的架构风格之一。Netflix和亚马逊是微服务的早期先驱者之一[1]。
微服务的架构风格是从小型、独立的应用程序中开发出复杂的应用软件,这些应用程序使用独立于语言的接口(API)相互通信。如果公司无法优化长期以来形成的单体架构,那么业务架构将难以升级或维护,变得过于复杂。国内学者对于云计算和微服务的研究较为深入。张玉超[2]在他的研究中表示,云计算具有规模大、资源利用高效、通用性强和成本低的特点,这非常契合微服务所需要的基础特性。借助云计算,企业可以以更经济、更高效的方式将应用部署上云。张墨涵[3]等人提到,微服务间每个服务互相独立,架构灵活,服务职责单一。即便其中某个服务发生故障,也可以将影响面缩到最小,且有利于资源的伸缩。这非常适合应用在当今的云平台环境。国内学者同时发现了微服务访问控制的重要性。潘孝阳[4]在他的研究中表明,微服务的设计暴露了更大的可攻击面,服务间的通信更容易成为攻击的目标。其次,因为服务之间相互信任,所以如果某一个微服务被攻陷,可能会波及整个系统。因此,对微服务的访问控制进行设计非常重要。何修宇[5]提到,微服务运行环境差异大又相互影响,传统的权限控制方法难以适应,且权限管理规则复杂。业内没有统一标准的难题也说明了权限控制需要着重研究。
(三)研究方法与研究范围
本文主要采用了文献研究法和实验法两种方法。通过文献研究法,本文对研究背景和历史进行了学习,并对已有的研究成果进行了总结。这样做可以建立对本次研究的宏观认知。同时,本文还通过实验法在服务网格中应用访问控制,并确定了访问控制的内部逻辑和控制机制等。本文首先对微服务的变革进行了探索,包括其演进模式,每个阶段的特性,以及对新一代服务网格Istio的研究。其次,本文对访问控制的原理和部署进行了实践,对JWT和Istio的安全策略进行了探索和学习。
二、微服务的变革
(一)微服务的演进
过去,在业务项目中,快速开发和上线是最重要的考虑因素,导致对系统后期的发展、拓展性、健壮性和可用性不够关注。随着业务的发展,性能和需求满足不了的问题逐步显现。对于传统的单体系统来说,所有模块之间耦合紧密,功能边界不清晰,调用关系错综复杂,难以调整和排查问题。当系统遇到性能瓶颈时,只能通过负载均和多实例部署无法解决问题,无法对模块进行拆分和纵向扩展。此外,由于高耦合特性,当其中一个小模块出现问题时,可能会波及整个系统,导致整体服务不可用。微服务是基于云原生架构的一种方法,是SOA架构模式的演变。微服务希望开发人员将庞大的系统划分为不同的小模块,解耦功能,并通过轻量级协议使服务协同工作。微服务具有以下特性:单一职责、轻量级通信、独立性、进程隔离、支持混合技术栈、简化治理、易于维护。
在Phil的文章《Service Mesh》中[6],提出了微服务通信的演变过程。最初,开发人员希望两个服务之间可以直接简单通信,但实际情况非常复杂,网络可能面临丢包、错误等问题。因此,开发人员需要单独处理网络问题,而不仅仅是业务逻辑。随着TCP协议的出现,网络处理可以下沉,从业务服务中分离出来,成为系统网络层的一部分。随后,诸如Spring Cloud等分布式框架的出现,实现了分布式系统所需的各种通用功能,如服务注册,负载均衡,认证授权等。这些框架在一定程度上封装了底层逻辑,使开发人员能够更快速地开发健壮的分布式系统。尽管Spring Cloud是一个出色的开发框架,但仍存在一些问题,如侵入性强、升级成本高、治理功能不完善、开发门槛高及不支持语言无关性。为解决这些问题,Service Mesh的出现为开发者带来了全新的解决方案。作为基础设施,Service Mesh可以与业务解耦,以Side Car(边车)的形式部署,解决复杂环境下的微服务通信问题。
(二)服务网格
本文主要基于对Istio服务网格的研究。在云原生领域中,Istio和Kubernetes密不可分,因此备受关注。官方对Istio的描述是一个开放平台,用于连接、加固安全、控制和观察服务。“连接”代表能够智能地控制服务之间的调用流量,实现灰度升级、AB测试和红黑部署等功能;“加固安全”表示自动为服务之间的调用提供认证、授权和加密;“控制”保证资源在消费者之间公平分配;“观察”表示能够查看服务运行过程中的各种数据,例如日志、监控和tracing,以了解服务的运行情况。
Istio扩展了Kubernetes的能力,利用强大的Envoy服务代理建立了一个可编程的、应用感知的网络。Istio与Kubernetes协作,为大规模的服务部署管理提供了统一、通用的流量管理、遥测和安全方案。
为了提供统一的上层入口,服务网格(Istio)演化出了控制面的概念,如图1所示。控制面负责和所有的数据面(即边车组成的网络)进行交互,例如下发策略,采集监控数据等。
三、访问控制
(一)访问控制的意义
访问控制是系统安全基础设施中的一个基本要素。每个网络安全工程师都希望在不影响工作流程的情况下,应用最小特权原则、零信任原则、职责分离或其他安全方案的原则。访问控制的主要目的是限制对信息和功能系统的访问。当访问控制功能正常工作时,它可以降低信息在没有正确授权的情况下被非法访问和数据泄露的风险。Algimantas在他的研究中提到[7],访问控制在确保基于微服务的系统的身份管理和网络安全方面起着关键作用。访问控制是微服务架构的一个重要功能组件,因为它规范了对每个微服务内部资源的访问,并帮助维护数据的保密性和完整性。微服务中的访问控制有助于执行安全策略,防止对API、数据存储和其他资源的未授权访问。这确保只有经过授权的实体才能访问敏感信息。此外,访问控制有助于增强审计功能,可以更方便地记录谁在什么时间访问了哪些资源。
(二)JSON Web Token
提到访问控制,JWT是其中不可或缺的一环。JWT的全称为Json Web Token,它是一个用于安全地以JSON的格式传输信息的标准(RFC 7519)。JWT是一种基于令牌(Token)的无状态认证机制。由于它是一个基于客户端的无状态会话,服务器不必完全依赖数据存储介质来保存会话信息。一个正确的JWT通常由三部分组成,分别是头部(Header)、负载 (Payload)和签名(Signature)。这三部分之间由英文的句点进行分隔。头部部分主要声明了Token的类型和加密所使用的算法。负载部分的信息相对丰富,可以使用键值对格式自定义字段,当然,也有一些预留字段用于声明Token的签发者、主体、过期时间等。签名是其中最重要的部分,它由加密后的头部和负载计算而来,用于确定Token的信息是否被非法篡改。用户在访问目标资源时,需要在请求的头部中加入”Authorization: Bearer
(三)JSON Web Key
当谈及Istio的访问控制时,JWK同样是必不可少的一个元素,并且与JWT相辅相成,共同完成了访问控制的认证和鉴权。JWK全称是Json Web Key,顾名思义,它是一个密钥,用于加密JWT。JWK采用键值(Key-Value)形式。在JWK中,常见的字段有:Kty(加密算法类型)、Use(密钥用途)、Sig(签名)、Alg(密钥算法)和Kid(密钥标识)。
(四)访问控制在Istio中的实现
1.环境准备
①准备一台安装有Linux(Ubuntu或CentOS)系统的电脑或虚拟机;②在设备中安装好Docker和Kubernetes;③安装Istio;④在期望的命名空间中安装Istio的Bookinfo示例;⑤对集群和网格进行调试,确保Bookinfo相关服务部署后可以正常访问。
2.访问控制的实践
研究实践的目的是为Productpage服务创建访问控制规则,以确保只有携带正确Token的请求才能正常访问Productpage服务。在Istio中启用访问控制功能需要两个组件资源,它们分别称为访问控制(RequestAuthentication)和认证策略(AuthorizationPolicy)。在Istio中,认证策略的工作模式如图2所示,以外部用户访问网格内的服务为例。
首先,用户需向认证服务器请求一个JWT。该JWT使用加密密钥JWK和相关负载信息生产。用户携带JWT请求目标服务时,首先要经过服务网格的网关IngressGateway。网关将流量导向目标容器。流量进入该容器时,将被边车劫持。边车负责对JWT进行校验,如果合法有效,则允许访问通过;否则,访问将被拒绝。边车中的相关配置由上文提到的Istio控制面下发。因此,在相关配置中,需要声明密钥信息和token中的信息用于解密和验证。在某些情况下,也需要通过声明来决定哪些特定的服务需要开启访问控制功能。
在上面两个配置文件样例中,配置文件通过selector标签选择器进行指定资源的选择,这个selector和k8s中的selector一致。
在部署时,上述两个配置文件缺一不可,必须同时存在,访问控制功能才能被正确地开启。当然,访问控制的范围可以不局限于指定的应用,还可以是k8s中的某个命名空间或者整个k8s集群。下面以RequestAuthentication配置为例。
通过观察上述配置,可以发现控制范圍的主要参数为Selector和Namespace。当存在Selector时,访问控制的生效范围被缩小到指定的应用 (或者是容器)上。当Selector不存在,Namespace参数为Istio-System以外的集群名称时,生效范围为指定的命名空间。当Namespace参数为Istio-System,即Istio的安装命名空间时,生效范围为整个集群。部署成功后,用户需要在请求的Header中携带正确的Token来进行访问。若Token信息错误或未携带Token,都会提示访问错误。这里使用Curl命令对服务进行访问测试。
四、结束语
当下越来越多的业务系统或数字化解决方案正被部署在现代化的平台上,例如各大厂商的云平台。同时,越来越多的开发者倾向于使用容器化和微服务的方式来构建他们的程序。在过去,诸如负载均衡和路由等基础能力是与软件能力融为一体的;然而,现在云平台将这些能力集成或封装起来,使开发者能够更方便地使用。云计算和微服务的流行降低了复杂业务场景的开发和后续维护难度,但也给外部访问或服务间访问的控制和审计带来了挑战。
借助Istio服务网格的能力,开发者可以轻松地接管网格内部流量,对微服务进行流量和安全上的统一管控和配置。通过Istio的安全策略配置,开发者和运维人员可以轻松地基于JWT对访问进行把控,这是一种更为简单、有效、安全、可靠的访问控制体系。
作者单位:王兆熠 于千慧 袁迎迎 魏星 中国联合网络通信有限公司济南软件研究院
参考文献
[1] Laura Mauersberger. Microservices: What They Are and Why Use Them [EB/OL]. 2017-08-14[2023-06-01]. https://www.leanix.net/en/blog/a-brief-history-of-microservices.
[2] 张玉超.计算机网络与云计算技术的应用[J].集成电路应用,2023,40(02): 44-46.
[3] 张墨涵,王雪英,沈学东等. 微服务架构技术与挑战[J]. 网络安全技术与应用, 2023(02):3-4.
[4] 潘孝阳,黄晓芳.微服务框架的安全管控机制的设计[J].西南科技大学学报,2018,33(4):71-75.
[5] 何修宇.微服务环境下访问控制技术的研究与应用[D].北京邮电大学, 2018.
[6]Phil Calcado. Pattern: Service Mesh [EB/OL]. [2023-06-01]. https://philcalcado.com/2017/08/03/pattern_service_mesh.html.
[7] Algimantas Venckauskas,Donatas Kukta,Sarunas Grigaliunas,Rasa Bruzgien? . Enhancing Microservices Security with Token-Based Access Control Method [EB/OL]. [2023-06-01]. https://doi.org/10.3390/s23063363.
中國联合网络通信有限公司济南软件研究院 - 平台架构项目集 - 应用交付能力项目组。
王兆熠(1998.07-),男,汉族,山东济南,硕士,初级工程师,研究方向:人工智能与云计算运维研发;
于千慧(2000.04-),女,汉族,山东烟台,本科,研究方向:云计算运维研发;
袁迎迎(1996.05-),女,汉族,山东潍坊,硕士,初级工程师,研究方向:云计算运维研发;
魏星(1990.08-),男,汉族,山东临沂,本科,初级工程师,研究方向:云计算运维研发。