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

142254111_1_20180824091809958

引言:目录:

一、简介

二、用户认证

三、网关及API调用认证

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

五、总结一、简介

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

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

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

142254111_2_2018082409181098

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

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

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

142254111_3_20180824091810239

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

用户访问系统

系统调用网关

网关调用系统

系统内应用之间的调用

系统间的调用

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

用户认证

系统间及系统内认证

网关及 API 调用认证

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

二、用户认证

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

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

142254111_4_20180824091810348

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

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

142254111_5_20180824091810473

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

2.1.OAuth2.0与SSO

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

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

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

142254111_6_20180824091810583

上图所示,为一个基于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 中去。

142254111_7_20180824091810723

2.4.单点退出

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

142254111_8_20180824091810911

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

142254111_9_2018082409181151

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

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

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

注意:

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

2.5.用户登录控制

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

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

142254111_10_20180824091811192

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

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

2.6.在线用户管理

142254111_11_20180824091811317

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

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

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

三、网关及 API 调用认证

网关管理员

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

API 调用

142254111_12_20180824091811442

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

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

网关调用系统

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

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

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

142254111_13_20180824091811583

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

五、总结

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

142254111_14_20180824091811692(IAM功能结构图)

142254111_15_20180824091811801(IAM部署结构图)

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

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

142254111_16_20180824091811942142254111_17_2018082409181251142254111_18_2018082409181298

142254111_19_20180824091812145142254111_19_20180824091812145参考内容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版本一并发布,请随后持续关注我们的产品发布动态,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值