写点什么

Service Mesh 架构下的认证与授权

  • 2021-05-20
  • 本文字数:3772 字

    阅读完需:约 12 分钟

Service Mesh架构下的认证与授权

认证与授权几乎是所有系统必不可少要处理的问题。在传统架构下,我们习惯了在程序中写一些代码或引一些类库来处理其相关的逻辑,但如果在 Service Mesh 架构下,会有什么不同?


Service Mesh 的核心是将一切非业务功能交给基础设施层,讨论 Service Mesh 架构下的认证与授权,实质上是讨论能否将认证与授权的处理逻辑委托给基础设施层,从而让应用层更加专注于业务。


为了能让我们的讨论更加形象化,我们可以借助一个案例。

背景

某组织要举办一次篮球相关的活动,要求参与者以团体的方式报名。


参赛人员通过微信账号登录系统并验证手机号后,填写个人信息及团队其它成员的手机号与信息并报名活动,其它成员通过微信账号登录并验证手机号后,可以看到与自己关联的活动申请。


组织方工作人员同样通过微信登录并验证手机号,之后可以获取其所负责区域的活动申请并做审核操作。

系统结构

我们需要一个用户池来管理用户,但我们不想在用户的账号密码等逻辑上花费太多精力,因此决定使用微信作为我们的用户池,用户进入我们的系统时,使用微信登录即可,这样就可以将“创建新用户”,“修改密码”,“找回密码”和“短信验证码”等逻辑委托给微信,同时也免去了用户进入系统时的“注册”过程,一举两得。


接下来,我们需要一个维护活动申请的服务,但因为活动申请需要的信息较多,用户可能无法一口气完成,所以还需要一个能帮助用户分步骤创建活动申请的服务。


最后,活动组织方需要审核活动申请,但活动组织方的管理人员也是用微信登录系统,那么我们的系统就得有能力知道当前用户是不是工作人员,因此我们需要一个领域专属用户信息服务。

以下是一幅简单的系统逻辑结构图:



备注 1:此图隐去了其它相关部分,以免结构图变得复杂,导致讨论范围扩散。

  • User Pool:用户池。可以是微信或 Google,可以是 OKTA 或 Idaptive,可以用 AWS Cognito 搭建,也可以完全自己构建,实际上大家的手机号也是一个用户池。

  • Applicant Service:帮助用户分段构建申请信息的服务,通过它我们还可以提供通过社交网站导入成员信息的方式。

  • Application Service:负责活动申请的服务。

  • Domain Specific User Information Service:User Pool 只能提供有限的信息,此场景中使用的微信用户池能提供的信息更有限,由于这个系统需要记录专有的信息,所以需要这样的服务。

认证

在这个案例中,有两类具有不同数据访问权限的用户,为了能知道当前访问系统的用户归属于哪一类,那么系统必须得先知道当前用户是谁,这样才能找出用户所具有的授权。认证是授权的先决条件,识别出当前用户是谁,就是“认证”。认证大体上分为“系统识别用户”和系统内“微服务识别用户”,“微服务识别用户”是我们的重点。

系统识别用户

最终处理用户请求的是系统中的各个微服务,但我们不能让每个微服务都和登录流程打交道,所以需要在系统将请求转发给微服务前,完成对用户的识别。

登录

用户要使用我们的系统,首先要去登录界面,登录界面引导用户使用微信登录。微信做为 User Pool 帮我们完成对用户的认证,然后我们的系统会给用户发一个“外部通行证”,通常情况下,“外部通行证”是一个随机字符串,放在 Cookie 中。之后用户向系统发起请求时,便不再需要提供账号密码,只要带上个这个“外部通行证”即可。

访问系统

用户向系统发起请求时,需要在请求中附上“外部通行证”,这样系统就能知道请求来自于谁。如果请求中没有“外部通行证”或“外部通行证”不合法,则要求用户重新登录。如果“外部通行证”合法,系统则通过“外部通行证”,找到用户在系统中的记录及其关联的授权信息,然后生成一个“内部通行证”。“内部通行证”通常情况下是 JWT,包含更加丰富的信息,并对用户不可见,系统内微服务只关心“内部通行证”。

微服务识别用户

用户的请求最终需要访问系统内的微服务,为确保到达微服务的请求是由合法的用户发起的,而不是系统内被劫持的其它子系统捏造的,微服务仍然需要验证请求者的身份。微服务验证请求者身份的方式,就是验证请求中附带的“内部通行证”是否合法。



在被请求的微服务处理请求前,需要先验证“内部通行证”的合法性,也就是验证请求中附带的 JWT。验证 JWT 需要先获取 Key(加密方式决定 Key 的类型),之后用这个 Key 计算 JWT 是否被篡改过。案例使用的 JWT,但验证内部通行证的主流方式都不涉及被请求服务的业务。这个过程与微服务自身承载的业务完全没有关系,但它又是微服务不可或缺的一部分。传统方式下,我们会把这部分逻辑放在微服务中,并让这部分逻辑独立于微服务的业务模块,但微服务的职责范围还是扩大了,导致构建微服务时,开发人员的关注范围要扩大。如果把这部分逻辑交给 Sidecar,我们的微服务可以更加纯净,开发人员在构建微服务时也可以更加聚焦。

授权

当请求者的身份被识别后,下一步要做的就是检查请求者是否被授权访问其请求的内容。

用户到服务

用户需要向 Application Service 提交活动申请,那么用户就得有对 Application Service 的访问权限。



用户的请求到达后,首先检查“内部通行证”,确保请求是由合法的用户发起的。之后检查发起请求的用户是否有权限访问这个服务或这个服务的某一个 API,有多种方式可以做,案例中的方式为检查“内部通行证”中对这个 API 访问权的描述。这个过程与微服务自身承载的业务完全没有关系,与前面“认证”中“微服务识别用户”的情况相同。

服务到服务

用户发起的请求,可能系统内一个微服务就可以完全处理,也有可能需要多个微服务协同处理。所以对于微服务,请求者可以是用户,也可以是其它微服务。在我们这个系统中,微服务之间会有交互,但它们之间的访问性不是无限制的。Application Service 在接到用户提交的活动申请时,需要访问 Domain Specific User Information Service 获取一些数据,用来构建活动申请。对于 Domain Specific User Information Service,来自 Application Service 的请求,应予以处理,但如果请求来自其它服务,则要拒绝。



服务间的访问性配置需由另外的服务提供,做这步检查时需要先获取服务间的访问性配置,然后依据配置拒绝或放行请求。这个过程与微服务自身承载的业务完全没有关系,同样与前面“认证”中“微服务识别用户”的情况相同。

用户到服务的特定数据

  • 从参赛人员的角度看“Application Service 中的数据”。

一个活动申请包含多位参赛人员及他们的手机号与身份证号,当团队中一位成员代表团队提交了活动申请,我们需要让团队其他成员在完成认证后,也能看到这份活动申请及其状态。这种情况下,活动申请是否可被访问的“配置”包含在活动申请自身中,其它服务无法提供。也就是说,只有 Application Service 自身才能提供活动申请能否被访问的“配置”。


  • 如果将授权检查的逻辑提成 Sidecar

这个 Sidecar 在做数据访问性检查时,要请求微服务来获取数据,用于判断请求是否被授权。这个提供信息用于做访问检查的 API 是被做“数据访问性检查”的 Sidecar“驱动”出来的,那么本质上,微服务参与了权限验证。



因为负责数据授权检查的 Sidecar 需要从微服务获取数据才能完成工作,所以微服务需要对做数据授权检查的 Sidecar 提供可获取授权信息的 API,这导致授权检查的职责没能被完全委托出去。


  • 如果不将授权检查的逻辑提成 Sidecar

对于很多使用关系型数据库的微服务来说,可能只是 SQL 中 INNER JOIN 的过滤,无需额外做任何事情。如果需要过滤从数据库中拿到的数据,服务内数据通信的便捷性强于服务间数据通信。



刚才我们提到,只有 Application Service 自身才能提供活动申请能否被访问的“配置”,这其实已经说明了对于这种场景,维护这份“配置”,就是 Application Service 的业务。因此,这种场景让微服务自己做,能让逻辑更加内聚,也能减少不必要的工作。


  • 从“活动申请”审核人员的角度看“Application Service 中的数据”

由于活动在 10 个城市中举办,现有 5 个活动管理员,平均每人管理两个城市的活动申请,不同管理员之间不共享数据。

我们有城市 1 - 10,其中 1 和 2 归属管理员 1,当管理员 1 要获取他所负责的所有活动申请时,需要用到类似下面的接口。GET /applications?cities=1,2

他可能也只想查看城市 1 最近几天收到的申请。GET/applications?cities=1&submittedAfter=xxxx-xx-xx

但他不能查看城市 1 或 2 以外任何城市的申请,下面的请求应该被直接拒绝。GET /applications?cities=3,6


  • 将授权检查的逻辑提成 Sidecar

因为数据的访问性配置是由其它服务提供的,微服务不需要也没有能力向这个 Sidecar 提供支持,也不需要知道有这个 Sidecar。但负责数据授权检查的 Sidecar 需要学习微服务的业务,并且这部分内容无法复用。



虽然这个 Sidecar 要学习微服务的业务,成为这个服务专有的 Sidecar,但是从微服务的角度看,数据授权检查的逻辑被完全委托出去了,微服务可以更加纯净,开发人员在构建微服务时也可以更加聚焦。

总结

在微服务处理请求前,对请求者身份的验证也就是对认证信息的检查,应委托给基础设施层。


授权配置在微服务之外时,如果是“服务到服务”和“用户到服务”的场景,应委托给基础设施层,如果是“用户到服务的特定数据”,类似按城市分配管理员审核活动申请的场景,可优先考虑委托给基础设施层。


授权配置在微服务之内时,如果是“用户到服务的特定数据”,类似参赛人员与活动申请的关系,属于微服务本身需要维护的业务逻辑,应优先考虑服务内实现。


本文转载自:ThoughtWorks 洞见(ID:TW-Insights)

原文链接:Service Mesh架构下的认证与授权


2021-05-20 07:001467

评论 1 条评论

发布
用户头像
你好,通常对于一个企业来说,每个微服务的Authorization是自己做的,还是统一平台管理?权限管理的粒度五花八门,统一管理的话怎么做?
2021-06-28 09:02
回复
没有更多了
发现更多内容

Topaz Video AI 使用教程:去隔行和升级嘈杂的镜头

Rose

mac软件下载 Topaz Video AI破解版 视频增强软件 Topaz Video AI 教程

数字货币交易所开发软件搭建 安卓ios源码交付

西安链酷科技

源码 数字货币 dapp 加密算法

工赋开发者社区 | 数字化转型的两大关键点:转什么 ,如何转?

工赋开发者社区

SecureCRT常见问题|不允许从系统上的所有字体中进行选择

Rose

SSH SecureCRT激活 SecureCRT常见问题 SecureCRT不能选择字体 SecureCRT Mac破解版

CorelDRAW 2023 完美激活版下载

iMac小白

CorelDRAW 2023下载 CorelDRAW 2023破解版

JProfiler 14 for Mac(Java开发分析工具)永久激活版

iMac小白

JProfiler 14激活版 JProfiler 14下载 JProfiler 14 mac

PlistEdit Pro for Mac(Plist编辑器) 1.9.7直装激活版

mac

苹果mac Windows软件 PlistEdit Pro Plist文件编辑软件

mac应用音量控制软件Sound Control for Mac激活版

iMac小白

sound control下载 sound control mac sound control激活版

详述 IntelliJ IDEA 遇到 Maven 项目 pom.xml 文件没有识别的解决方法

Rose

IntelliJ IDEA

API管理平台搭建过程问题总结

RestCloud

API ipaas API 安全

大模型训练中Loss出现NaN的解决策略

百度开发者中心

大模型训练 大模型 LLM

钱包开发:区块链钱包热钱包​加密货币开发公司集成服务

区块链软件开发推广运营

交易所开发 dapp开发 区块链开发 链游开发 NFT开发

利用LLM大模型和智能问答BI实现智能报表生成

百度开发者中心

人工智能 数据可视化 大模型 LLM

中文最新Infuse 激活安装包7.6.2

胖墩儿不胖y

Mac软件 多媒体播放器

摄影后期图像编辑推荐 Lightroom Classic 2023 中文激活

mac大玩家j

Mac软件 图像处理工具 图像编辑处理

通过Python脚本支持OC代码重构实践(二):数据项提供模块接入数据通路的代码生成

百度Geek说

Python 重构 脚本 企业号10月PK榜

加密货币交易所开发 区块链交易所

西安链酷科技

加密货币 dapp 去中心化 交易所 分散节点

Cinema 4D 2023常见问题:c4d 2023看不到新的加厚和对称对象怎么办?

Rose

c4d 2023 加厚和对称对象 Cinema 4D中文破解

Lunar Pro for Mac(屏幕亮度调整软件) v6.2.7激活版

Rose

Mac破解软件 Lunar for Mac 显示器亮度调整

大模型在金融监管科技中的应用价值

百度开发者中心

人工智能 大模型 LLM模型

云算力挖矿系统开发 质押挖矿、双币系统

西安链酷科技

加密货币 dapp 挖矿 云算力 交易所

开发第一个flutter应用时需要注意什么

Onegun

flutter 前端框架

Transformer与预训练语言模型的探索

百度开发者中心

人工智能 大模型 LLM

Mac虚拟定位软件:AnyGo for Mac激活版

iMac小白

AnyGo下载 AnyGo激活版 AnyGo中文版

生产管理MES系统的功能和作用/开源MES

万界星空科技

数字化转型 生产管理系统 mes #开源 开源mes

一文带你了解什么是“三渲二”?

Finovy Cloud

3D 建模 影视动漫

企业如何对多个IT系统快速管理?谁能告诉一下!

行云管家

IT运维 安全运维 运维管理

BES 在大规模向量数据库场景的探索和实践

Baidu AICLOUD

elasticsearch 向量检索 大模型

云资源信息安全就用行云管家!

行云管家

云计算 云安全 云资源

Service Mesh架构下的认证与授权_架构_张凯峰_InfoQ精选文章