文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

简化微服务验证的新方法:开放式策略代理(OPA)

2024-12-03 11:44

关注

【51CTO.com快译】从概念上说,身份验证是指识别出用户是谁,而授权是指确定某个已被认证用户具有的何种访问级别。不知您是否注意到:由于分布式应用往往难以实现强大、且集中式管理所需的身份验证和授权(Authentication and Authorization,A&A)策略,因此在微服务的实际应用中,您可能时常会遇到验证和授权的实施问题。下面,我将和您探讨开放式策略代理(Open Policy Agent,OPA)是如何协助简化授权问题的。

为简单起见,我创建了一个带有多个微服务应用示例。通过其基本的用户界面,我们可以在其中执行各项操作,并查看产生的结果。该应用将向您展示开放式策略代理是如何处理各种授权方案的。

应用示例

在此,我们以销售团队常用的、为客户制定报价的CPQ(配置、定价和报价)应用(https://en.wikipedia.org/wiki/Configure,_price_and_quote)为例,定义并创建了如下角色:

鉴于本文仅专注于授权环节,在此,我们假设用户已经通过了身份验证,并且持有有效的JSON Web令牌(JWT)。而且每个API请求,都会在请求的头部包含该JWT。

该示例应用在GitHub的下载链接为--https://github.com/gchaware/opa-ms-sample/tree/master。请根据README的说明,逐步进行安装,并通过URL--http://来访问其UI:

执行授权

根据上述角色分配,我们授权

如上图所示的UI显示了多个按钮,每个按钮都代表用户的一项操作。根据用户选择使用的角色,UI将会及时反馈创建、编辑或删除商品操作成功与否的结果。

上图展示了该应用程序带有两个微服务:Offer(报价)和Customer(客户)。通过将API向外界公布,NGINX反向代理能够截获每个API请求,并通过请求授权服务,来验证是否允许用户执行该请求的相关操作。

在此,我们使用NGINX的auth_request指令,来截获传入的API调用。其中,每个API调用都有一个包含了JWT头部的授权。而所有用户的基本信息,包括其角色都被包含在JWT中。在此,该授权服务带有两个容器:

首先,NGINX会将/authorize的请求发送给授权容器,以授权某个API调用。接着,授权服务会向开放策略代理询问是否有授权请求(true/false)。然后,它向NGINX返回成功(200 OK)或者是失败(403 Forbidden)的响应。据此,NGINX或是允许API的调用,或是向客户端返回403 Forbidden的响应。

什么是开放策略代理?

开放策略代理(OPA)是一个开源的通用策略引擎,它统一了整个栈中的策略执行。OPA提供了一种高级声明性的语言,可方便您将策略转换为代码和简单的API,进而减轻了软件在决策时的负担。您可以在微服务、Kubernetes、CI/CD管道、以及API网关中,使用OPA来实施策略。

由于OPA能够接受JSON之类结构化的数据作为输入,并且可以返回true/false的决策,或将任意结构化的数据作为输出,因此它能够有效地将决策与执行予以脱钩。

值得一提的是,OPA使用rego作为策略语言。您可以通过链接--https://www.openpolicyagent.org/docs/latest/,了解更多有关rego和开放策略代理的信息。

详述授权服务

下面让我们来详细讨论授权服务的具体工作方式。

如上图所示,我们在服务器模式下运行开放策略代理,并利用其REST API的更新策略来获取决策。如下命令展示了开放策略代理通过对外公布REST API,来创建或更新策略。

  1. PUT /v1/policies/ Content-Type: text/plain 

在本例中,我们需要端点接收如下的请求,来更新OPA中的策略(具体可参照它在GitHub里的README)。

  1. curl -X PUT --data-binary @policies/httpapi.authz.rego http:///authorize/v1/policies/httpapi/authz 

同时,我们需要另一个API来根据政策做出决策:

  1. POST /v1/data/ 
  2. Content-Type: application/json 

此处的 是由诸如“package httpapi.authz”之类的策略予以标识的。在该示例中,由于我们需要删除订单ID“1000”,因此授权服务将使用以下请求,去调用端点--http://localhost:8181/data/httpapi/authz。其具体Java代码如下:

  1.   {   
  2.     
  3.        "input" : {   
  4.     
  5.           "method""DELETE",   
  6.     
  7.           "api""/offer/1000",   
  8.     
  9.           "jwt""eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE1NzQ2NjM3MDAsImV4cCI6NDA5OTE4NTMwMCwiYXVkIjoib3BhLWV4YW1wbGUuY29tIiwic3ViIjoianjvy2tldeblegftcgxllmnvbsisikdpdmvutmftzsi6ikpvag5uesisiln1cm5hbwuioijsb2nrzxqilcjfbwfpbci6impyb2nrzxrazxhhbxbszs5jb20iLCJSb2xlIjoiU2FsZXMgQWRtaW4ifQ._UtjZtowF3NNN3IF1t0LBHuzQhdfIfsO8jC-46GvbRM"   
  10.    
  11.      }   
  12.    
  13.  }   

由代码可知,授权应用程序将收到从NGINX发来的请求,并根据上面的逻辑图为OPA产生输入请求。针对该示例,我们在前端代码中对JWT进行了硬编码。而且每个API请求都会在Authorization头部包含JWT。据此,授权应用程序在获取JWT后,会将其添加到OPA的输入请求中。其具体Java代码如下:

  1. Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJMb2NhbEpXVElzc3VlciIsImlhdCI6MTU3MzcyNzM5MSwiZXhwIjo0MDk4MjQ1Mzc4LCJhdWQiOiJvcGEtZXhhbXBsZS5jb20iLCJzdWIiOiJzYWxlc0BleGFtcGxlLmNvbSIsIkdpdmVuTmFtdyI6IkpvaG5ueSIsIlN1cm5hbWUiOiJTYWxlcyIsIkVtYWlsIjoianNhbGVzQGV4YW1wbGUuY29tIiwiUm9sZSI6IlNhbGVzIn0.UbHWQpCMwupzsFp8f0CQ4o_bJSVaBugKijhcURZ_Mko 

值得注意的是,授权服务只会从输入的请求中检索JWT,而不会对其进行解码。因此,OPA会通过内置的io.jwt.decode功能函数,去支持JWT的解析。

您可以通过链接--https://play.openpolicyagent.org/p/4LOvGaEXEU,进一步了解rego策略的相关程序代码与逻辑。通过尝试不同的输入请求,您将能够查看到OPA为每一个请求所生成的不同输出。

小结

综上所述,开放策略代理提供了一种将授权决策与微服务中的业务逻辑相分离的方法。在实际应用中,系统管理员可以通过对开放策略代理进行设置,将生成授权策略(rego策略)的责任,委托给各个微服务的所有者。而微服务所有者和系统管理员都不会越界进行任何处理。

原文Open Policy Agent: Microservices Authorization Simplified,作者:Gaurav Chaware

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

来源:51CTO内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯