2

☕【权限设计系列】「认证授权专题」微服务架构的登陆认证问题

 2 years ago
source link: https://my.oschina.net/liboware/blog/5385754
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

☕【权限设计系列】「认证授权专题」微服务架构的登陆认证问题 - 浩宇天尚-开源中国 - OSCHINA - 中文开源技术交流社区

本文讨论基于微服务架构下的身份认证和用户授权的技术方案,最好先熟悉并理解以下几个知识点:

  • 微服务架构相关概念:服务注册、服务发现、API 网关

  • 身份认证和授权技术:SSO、CAS、OAuth2.0、JWT

以下几个基础概念:

当企业的应用系统逐渐增多后,每个系统单独管理各自的用户数据容易行成信息孤岛,分散的用户管理模式阻碍了企业应用向平台化演进。当企业的互联网业务发展到一定规模,构建统一的标准化账户管理体系将是必不可少的,因为它是企业互联网云平台的重要基础设施,能够为平台带来统一的帐号管理、身份认证、用户授权等基础能力,为企业带来诸如跨系统单点登录、第三方授权登录等基础能力,为构建开放平台和业务生态提供了必要条件。

在微服务架构下,必须对企业的平台生态进行合理的业务划分,每个业务板块将自成系统,这些系统业务比较独立,应当独立拆分。每个系统又可根据各自的业务模型进行切分,将业务模型和用户需求统筹分析后建立恰当的领域模型,形成独立的服务。

另外,企业平台的客户范围比较复杂,有2B的业务,也有2C的,还有 2G(goverment)的,因此平台级的统一身份管理必须涉及组织实体和个人实体两类,其中组织实体包括机关(G)、企业单位(B)、团体组织(B)等,这类似于多租户架构的概念,但又比传统多租户架构复杂。

微服务架构的登陆认证问题

从过去单体应用架构到分布式应用架构再到现在的微服务架构,应用的安全访问在不断的经受考验。为了适应架构的变化、需求的变化,身份认证与鉴权方案也在不断的更新变革。面对数十个甚至上百个微服务之间的调用,如何保证高效安全的身份认证?面对外部的服务访问,该如何提供细粒度的鉴权方案?本文将会为大家阐述微服务架构下的安全认证与鉴权方案。

统一身份管理(Unified Identity Manager)

统一身份管理(UIM)是整个平台帐号和权限管控的基础,由此构建的系统称为UIMS(Unified Identity Management System),平台下所有系统的账户管理、身份认证、用户授权、权限控制等行为都经由 UIMS 处理,提供帐号密码管理、基本资料管理、角色权限管理等功能。

UIMS 基于『统一身份治理』的概念,可划分为两级账户体系、基础权限模块和基础信息模块三大模块。其中两级账户体系将账户分为组织实体帐号和个人实体账户两大类,个人实体从属于组织实体,也可以不从属任何组织实体,且个人实体可同时从属于多个组织实体;基础权限模块将各业务系统的资源权限进行统一管理和授权;

基础信息模块用于描述组织实体和个人实体的基本信息,如组织实体名称、地址、法人,个人实体姓名、电话号码、性别等基础信息。UIMS 提供统一的 API 与各子系统连接。众多系统和众多服务都将依赖于 UIMS 。

本文仅涉及 UIMS 下的两级账户体系和基础权限模块这两个模块,据此可以独立出账户管理服务和权限管理服务,也可以合并成一个账户权限管理服务。其中账户管理服务包括业务系统实体、组织实体和个人实体管理、权限管理服务包含认证、授权和鉴权三个部分。

单点登录(SSO)

企业平台涉及众多子系统,为简化各子系统的用户管理,提升用户体验,因此实现 SSO 是统一身份认证的重要目标:一次登录,全部访问。

  • 对于企业内部应用来说,SSO 是必须的选项,例如企业 OA、HR、CRM 等内部系统;
  • 对于外部应用来说,SSO 是可选项,具体哪个应用应当加入 SSO 系统,由该业务系统决定。

例如,外部商城、物业系统等对外服务系统。无论何种应用是否采用 SSO,UIMS 在技术上应当具备 SSO 的能力。

随着平台业务的逐渐增长,依托于平台的,和平台依托的厂商和客户等资源将极大的丰富平台,因此必须构筑开放的生态系统,以支撑业务的进一步发展。可以开放平台级的授权登录功能,以允许第三方应用接入。通过三方授权登录,将平台的服务各能力开发给第三方,并将第三方的服务和能力接入平台,繁荣共生,共同发展。

服务间鉴权

业务系统切分出不同的服务,根据粒度粗细和业务需求不同,服务的数量和权限要求都不同。微服务架构下的身份认证和授权,可分为两种:

  • 内部服务的认证和授权;

    • 内部服务处于安全的内网环境之下,例如 BFF 层(Backend For Frontend Layer)的商品服务、订单服务等,在对安全需求不高的情况下,可不执行认证过程,服务与服务之间是相互信任的。
  • 外部服务的认证和授权。

    • 外部服务的认证和授权,通常由外部应用发起,通过反向代理或网关向安全边界内的服务发起请求,因此必须执行严格的认证过程。无线端APP、Web端、桌面客户端等外部应用下的各类服务,都属于外部服务。

提出了统一身份管理系统(UIMS)下关于身份认证和授权部分的主要需求,目前实现统一身份认证和授权的技术手段较多,总体可以归纳为以下两类:

  1. 传统的 Cookie + Session 解决方案,有状态会话模式;
  2. 基于令牌/票ticket的解决方案,无状态交互模式。
  • 分布式 Session
  • OAuth2.0

上述方案各有利弊:

分布式 Session

分布式Session是老牌的成熟解决方案,但因其状态化通信的特性与微服务提倡的API导向无状态通信相互违背,且共享式存储存在安全隐患,因此微服务一般不太采用。

分布式 Session

OAuth2.0是业内成熟的授权登录解决方案,然而 OAuth2.0 提供了4种授权模式,能够适应多种场景,作为基于令牌的安全框架,可以广泛用于需要统一身份认证和授权的场景。

一般会采用 JWT 作为令牌的主要标准:JWT(JSON Web Token)是一种简洁的自包含的 JSON 声明规范,因其分散存储和自解签等特点而广泛应用于非集中式认证/授权场景。

由于 JWT 信息是经过签名的,可以确保发送方的真实性,确保信息未经篡改和伪造。但由于其自包含的客户端验签特性,令牌一经签发,即无法撤销,因此单纯采用 JWT 作为统一身份认证和授权方案无法满足帐号统一登出和销毁、帐号封禁和解除这几种类型的需求,所以一般配合 OAuth2.0 一起使用。

关于 JWT 的介绍,CAS 是时下最成熟的开源单点登录方案,包含 CAS Server 和 CAS Client 两部分。

  • CAS Server 是一个 war 包需要独立部署,负责用户认证;
  • CAS Client 负责处理对客户端受保护资源的访问请求,需要认证时,重定向到 CAS Server。

值得注意的是,CAS 是一个认证框架,其本身定义了一套灵活完整的认证流程,但其兼容主流的认证和授权协议如 OAuth2、SAML、OpenID 等,因此一般采用 CAS + OAuth2 的方案实现 SSO 和授权登录。

关于 CAS 的介绍,请参考 https://apereo.github.io/cas/ 在微服务架构下,身份认证和用户授权通常分离出来成为独立的 IDP (Identity Provider)服务。在做技术选型时,应从以下几点考虑:

  • 满足 SSO 的技术需求;
  • 满足简便性和安全性的需求;
  • 满足开放性和扩展性的需求。
  • 综合考虑,推荐采用无状态 API 模式,其中基于 OAuth2.0 的方案能够完全满足
客户端 Token 方案

令牌在客户端生成,由身份验证服务进行签名,并且必须包含足够的信息,以便可以在所有微服务中建立用户身份。令牌会附加到每个请求上,为微服务提供用户身份验证,这种解决方案的安全性相对较好,但身份验证注销是一个大问题,缓解这种情况的方法可以使用短期令牌和频繁检查认证服务等。对于客户端令牌的编码方案,Borsos 更喜欢使用 JSON Web Tokens(JWT),它足够简单且库支持程度也比较好。

客户端 Token 与 API 网关结合

这个方案意味着所有请求都通过网关,从而有效地隐藏了微服务。 在请求时,网关将原始用户令牌转换为内部会话 ID 令牌。在这种情况下,注销就不是问题,因为网关可以在注销时撤销用户的令牌。

https://www.jianshu.com/p/2571f6a4e192


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK