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

转载本文需注明出处:微信公众号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 条评论
登录 后参与评论

相关文章

来自专栏林欣哲

10 分钟看懂分布式事务

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

3605
来自专栏Pythonista

nginx负载均衡

Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型...

3006
来自专栏北京马哥教育

【Django新人必看】Django安装及搭建开发环境实战细解

开笔有话说 接触django有一段时间了,发现国内网站上的django学习资料,虽然有不少,但大多有老旧的通病,所基于的版本简直是太旧了,就拿《the djan...

43412
来自专栏Python爬虫与算法进阶

学习Git(一)起步

什么是Git 在Git官网上找到这样一段描述 Git is a free and open source distributed version control...

3336
来自专栏coding

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

4136
来自专栏北京马哥教育

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

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

4396
来自专栏Java架构解析

关于不同的MySQL复制解决方案概述

我在解决方案团队工作多年,发现数据库复制总是被误解,甚至有些人根本完全不理解,所以本文将来回顾一下MySQL环境中的复制概念,并且澄清一些大家对于复制的误解。

860
来自专栏北京马哥教育

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

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

4658
来自专栏喔家ArchiSelf

从连接池到内存池

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

1371
来自专栏程序员宝库

每个系统管理员都要知道的 30 个 Linux 系统监控工具

? 您需要监控 Linux 服务器的性能吗?试试用这些内置命令和附加工具吧!大多数 Linux 发行版都附带了大量的监控工具。这些工具提供了获取系统活动的相关...

5039

扫码关注云+社区