微服务系统之认证管理详解

转载本文需注明出处:微信公众号EAWorld,违者必究。

引言:

微服务大行其道,微服务安全也是非常热门的话题。本文向大家分享微服务系统中认证管理相关技术。其中包括用户认证、网关和 API 认证、系统间和系统内的认证,以及我们的统一认证管理系统 IAM。

目录:

一、简介

二、用户认证

三、网关及API调用认证

四、系统间认证和系统内认证

五、总结

一、简介

首先,我们来看一下什么是认证?

认证是确认当前声称为 xxx 的用户确实为 xxx 本身。

用户可以是人、系统、应用或任意调用者。

最简单的认证,就是用户名密码登录,常见的认证方式还有:手机验证码、生物识别(指纹,虹膜识别、面部识别等)、U 盾、数字证书。

关于认证更加详尽的定义和认证方式,请参见维基百科:https://en.wikipedia.org/wiki/Authentication

那在微服务系统中有哪些地方需要进行认证管理(不包括DevOps中的认证)呢?如下图所示:

凡是存在交互的地方均需要进行认证:

  • 用户访问系统
  • 系统调用网关
  • 网关调用系统
  • 系统内应用之间的调用
  • 系统间的调用

可以将它们分为如下三类:

  • 用户认证
  • 系统间及系统内认证
  • 网关及 API 调用认证

下面我们将对这三类认证,分别做详细的介绍。

二、用户认证

微服务架构中会存在很多系统,而且系统间的切换也需要无缝进行,例如一个前端框架中可能会集成多个系统的调用。此时,我们自然而然的会想到单点登录,单点登录早在已存在。但微服务中的单点登录与传统的单点登录有一定的差异。

下面这幅图描述传统的基于 Session 的单点登录。

用户的授权信息(例如角色,可访问资源等)保存在应用的 session 中,浏览器与应用系统之间基于sessionID 关联,相同应用的集群使用缓存(如 Redis、memcached 等),或基于 session 复制来进行共享 session 信息。

但是微服务系统中,api 的调用都是 stateless,没有状态信息,如下图所示:

用户的授权信息通常直接封装到 token 中,用户在访问应用或系统的时候,携带上 token,应用或系统直接从 token 中反解出用户的授权相关信息。

2.1.OAuth2.0与SSO

OAuth2.0是授权框架,SSO 是认证服务,但是我们可以基于 OAuth2.0实现SSO 认证服务。

OAuth2.0本身不提供认证服务,但是具有足够的扩展空间,让我们来扩展,例如基于 OAuth2.0 的OIDC。

2.2.基于OAuth2.0的单点登录

上图所示,为一个基于OAuth2.0的 SSO的流程,整体流程基本上和普通的 SSO 一致,所不同的是,存储 app Cookie 的时候,保存的是经过应用或系统处理和加密过的 token,用户后续请求,带上加密后的 token,在 app 后端直接解密和抽取出用户相关的授权信息,流程如下:

1. 用户访问app1.com

2. 由于用户没有登录,因此跳转到 iam.com

3. 用户在 iam.com的登录页面,输入用户名和密码,确认提交,iam 校验成功后

4. 在浏览器端写入浏览器cookie

5. 重定向到 app1.com,并获取 token(此处获取 token流程,与OAuth2.0协议有关)

6.app1.com检查 token 有效性

7. 重定向用户访问页面,并存储 app1.com的token 到app1.com的cookie 中

8. 用户访问app2.com

9.app2.com重定向到iam.com

10.iam.com此时发现 cookie 内已经有认证的token(或 session) 信息

11. 直接重定向到app2.com,并获得 token 信息

12.app2.com验证 token 信息

13. 重定向到app2.com,并保存app2.com的 token 信息到 app2.com 的 cookie 中

2.3.Token

通常情况下,IAM会使用类似jwt 这样的协议去封装用户信息和授权相关信息。

App需要对 Token 进行处理,加密后再存入到浏览器 cookie 中去。

2.4.单点退出

传统的 SLO 是由 SSO 服务器通知每一个应用系统,强制 session失效。

在微服务系统中,由于系统或应用间调用是无状态的,因此 IAM 无法通知每个应用退出指定用户。

但是,我们可以利用 OAuth2.0 的refreshToken 机制,当app去refreshToken的时候,通知应用退出。

首先,当一个应用点击退出时,应用先通知 IAM 清除当前用户在 IAM 上的session 和所有相关的认证 Token 信息。

当其他应用进行refreshToken的时候,返回用户已经退出的信息,要求用户重新登录。

注意:

这样的单点退出不是实时的,会存在一个误差(accessToken的有效时间)

2.5.用户登录控制

基于OAuth2.0 实现的 SSO,可以对用户是否可以登录某一系统进行控制。

在系统去交换/获取 Token的时候,判断用户是否具有访问指定系统的权限。

特点:可在线控制用户访问或拒绝访问指定系统。

缺点:同样不是实时的,会存在一个误差(accessToken的有效时间)。

2.6.在线用户管理

当用户登录IAM 的时候,IAM 可以跟踪和控制用户登录的超时。

当用户使用 SSO“登录”一个应用或系统时,会记录用户的 Token 信息。这里需要说明一下,用户的同一账号,有时候是可以同时在不通的机器上进行登录的。

通过控制“用户登录和系统授权”信息,来强制当前用户下线和统计在线用户信息和登录系统的信息。

三、网关及 API 调用认证

网关管理员

网关管理员访问网关系统,属于用户认证,则可以使用用户认证的方式来进行认证

API 调用

API调用认证可以绑定一组 API 到一个随机的 Token,使用Token 来唯一标识其绑定的一组 API 的访问权限,我们可以在系统中对这个 token 进行分配配额和 API 调用的限制;

注意:Token本身是不绑定调用者,所以,任何拥有 token 的应用都可以进行访问。

网关调用系统

网关调用系统,可以按照系统间的调用进行处理,请参见随后章节,系统间的调用。

四、系统间认证和系统内认证

系统间认证和系统内认证,实际上都是应用之间的调用,所不同的是,前者的应用是跨系统的,后者是在同一个系统内。

应用间的调用认证,可以对系统信息、应用信息、调用相关信息进行编码(jwt) 加密(jwe), 然后再通过http header的方式传输到下游系统或应用,下游系统或应用通过解密,获得调用者的相关信息,对其进行认证处理。

五、总结

认证管理有很多不同的方式,上面我所说的是一些常见的处理手段,也是普元统一认证管理平台IAM目前使用到的一些技术手段。

(IAM功能结构图)

(IAM部署结构图)

以上我们重点介绍了用户管理、SSO、SLO、网关及 API 调用认证、系统间和系统内认证及相关的处理技术。

当然,认证管理还有很多其他的处理手段和相关协议,比如认证授权协议: OIDC、SAML等,这里就不赘述了,有机会再和大家探讨。

参考内容

微服务架构下的安全认证与鉴权

https://auth0.com/blog/what-is-and-how-does-single-sign-on-work/

https://searchsecurity.techtarget.com/definition/single-sign-on

https://en.wikipedia.org/wiki/Single_sign-on

https://spin.atomicobject.com/2016/05/30/openid-oauth-saml/

https://www.mutuallyhuman.com/blog/2013/05/09/choosing-an-sso-strategy-saml-vs-oauth2/

https://blog.heroku.com/oauth-sso

精选提问:

问1:auth2tocken 如何验证有效性和合法性?跨服务的auth2如何验证?

答:OAuth2 的 token 验证有几种方式: jwt 使用数字签名进行验证;jwt,jwk中都有其详细的描述,可以参见协议的详细内容,跨服务的验证也是同样的验证方式。

问2:staleless token方案,后台没有session吗?那当前登录的附加信息如何处理?

答:staleless token后端是没有 session,否则也就不是 stateless,附加信息一般都是编码到 token 中去的,具体大家可以参见jwt协议相关的内容:https://jwt.io/

问3:如果一个大系统内部有微服务系统、其它普通的非微服务系统,还能否使用您所讲的微服务token机制进行统一认证?如果可以,需要怎样做?

答:是可以的,至于怎么做,这个需要您的非微服务系统是具体的安全框架是怎么样的,比如:spring security,apache shiro 都可以通过自定义 Filter 的方式来实现。

问4:IAM系统哪里可以体验?

答:IAM 会和我们近期发布的 Platform 8LA 版本一并发布,请随后持续关注我们的产品发布动态,谢谢!


关于作者:虎振东,普元资深软件工程师,8年软件开发设计经验,曾在歌华数媒架构设计开发多个广电和移动互联网融合项目,普元 EOS 8微服务平台核心。

原文发布于微信公众号 - EAWorld(eaworld)

原文发表时间:2018-08-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏枕边书

linux的“自动化”

linux的“自动化” linux系统的web网站在运营状态时,我们常需要对网站进行维护,例如查看资源剩余并做出响应、日志分割、数据整理,在特定状态执行特定任务...

2379
来自专栏.Net移动开发

.Net语言 APP开发平台——Smobiler学习日志:基于Access数据库的Demo

说明:该demo是基于Access数据库进行客户信息的新增、查看、编辑 新增客户信息和客户列表

1572
来自专栏喔家ArchiSelf

从连接池到内存池

AI赋能万物,老码农的伙伴们也曾经开发了一个基于图数据库的知识问答系统,在压力测试的时候发现随着并发数的增加,响应的时延明显变长,看时延分布,是应用程序与图数据...

1761
来自专栏腾讯移动品质中心TMQ的专栏

svn迁移至git指南

将代码从SVN迁移至Git时,若不关注SVN的历史提交记录,则直接将一份源代码提交至远端Git仓库即可;但对于大多数项目,历史提交则是对团队比较宝贵的记录,若要...

3572
来自专栏北京马哥教育

【图文并茂】一步步带你了解Web站点架构

1.1 http反向代理服务器 在web站点前端,我们需要搭建一个反向代理服务器,用于负责接受用户的请求,请求包括动态和静态的内容请求。一般反向代理服务器的部署...

4908
来自专栏coding

pyenv,让你轻松切换各种python版本

8536
来自专栏数据和云

墨菲定律:一个参数Drop_caches导致集群数据库实例崩溃

李真旭@killdb Oracle ACE,云和恩墨技术专家 个人博客:www.killdb.com 在墨菲定律里,我们知道,有可能发生的故障就一定会发生,哪怕...

3157
来自专栏IT 指南者专栏

【SSH框架】之Struts2系列(一)

微信公众号:compassblog 欢迎关注、转发,互相学习,共同进步! 有任何问题,请后台留言联系 1、Struts2框架概述 (1)、什么是Struts2 ...

3357
来自专栏北京马哥教育

大神教你DIY高性能运维堡垒体系

概述 不怕出问题,就怕出问题找不到原因 运维团队一般会有个需求就是记录运维或者开发同事在服务器上的操作记录,比如进行一些常规审核或者是服务器被黑了、服务器日志被...

4866
来自专栏林欣哲

10 分钟看懂分布式事务

什么是分布式事务 问题的引出 先看一张图,一个电商平台的架构图。 ? 对于用户来说的一个创建订单的过程,背后很可能跨越了多个应用服务。涉及诸如:订单、库存、...

3825

扫码关注云+社区

领取腾讯云代金券