预备知识
本文讨论基于微服务架构下的身份认证和用户授权的技术方案,最好先熟悉并理解以下几个知识点:
微服务架构相关概念:服务注册、服务发现、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)下关于身份认证和授权部分的主要需求,目前实现统一身份认证和授权的技术手段较多,总体可以归纳为以下两类:
- 传统的 Cookie + Session 解决方案,有状态会话模式;
- 基于令牌/票ticket的解决方案,无状态交互模式。
具体有
- 分布式 Session
- OAuth2.0
- CAS
上述方案各有利弊:
分布式 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