实录分享 | 微服务访问安全设计方案全探索

  使用/uaa/

  来转发基于uaa的认证请求至auth组件

  来转发请求至account组件,并标记serviceId为account-service,与图一中的withClient对应。

物联网

  图一为浏览器打开应用入口后,输入用户名和密码后,发出的认证请求:

  认证url为/uaa/oauth/token,这是uaa模式下标准的请求获取token的url

  表单中包含了字段scope(认证范围)和字段password(认证类型)

  图二为图一发出认证请求的返回结果:

  Access_token为有效认证token,将来被其他请求使用

  图三为发出获取当前用户的信息的请求:

  在请求里的Authorization的值为图二中获得的access_token

物联网

  图一为Account组件在Config组件(配置中心)定义的OAuth2协议下获取token的方式,这里定义了:

  clientID和clientSecret

  accessTokenUrl,这里指定了auth组件的uaa获取token的url

  grant-type,即认证类型,这里指定为client_credentials

  scope,这里指定了server,说明是这个认证请求只适用在各微服务之间的访问。

  图二为Accout组件业务代码中定义了需要使用Auth组件进行事先鉴权的方法:

[email protected]

  annotation中可以指定认证范围的具体条件,这里是限定了server或者是demo账户,才有权限发起认证。

物联网

  最后小结下Spring Cloud Security的特点:

  基于UAA,使用OAuth2协议。不会暴露用户的敏感信息

  基于认证类型和认证范围,实现细粒度的鉴权机制

  非浏览器客户端下良好的操作性

  Q&A

  问题:Basic Auth + Central Auth DB这种方式中,每个服务有自己的鉴权DB,这块只是一个缓冲吗?如果中途通过别的方式修改了中心DB的数据,而缓冲又没过期,这个时候有什么解决方案吗?

  答:不是缓冲,这里的Central Auth DB是指各个微服务共用一个数据库。

  问题:微服务架构需要服务路由和服务注册么?跟esb的区别在哪里?

  答:服务路由组件和服务注册组件和是相对必要的,他们保证了用户请求能发到正确的微服务中去。ESB企业服务总线是相对比较重的组件,而不是像微服务组件一样只负责单个业务。

  问题:在微服务中,对于数据权限的粒度,是可以集中在在gateway中进行还是由每个微服务自己独立配置?

  答:推荐由那个专门负载权限的微服务组件来配置。

  问题:您好,辛苦了,请问现在有类似SAML协议,但是不基于XML,而是基于JSON或者其他简化格式的协议吗?

  答:目前据我所知没有基于JSON的SAML协议。有个叫JWT(JSON web token)的协议,它是完全基于JSON的,Spring Cloud架构中也使用了JWT。

  问题:对于这个架构,服务划分的粒度有没有什么好的建议?另外登录凭证保存在客户端如何解决报文被拦截的安全漏洞?

  答:服务划分需要按具体业务来说,一般来说,一个业务实体作为一个微服务。使用https可以一定程度上提高安全性。

  问题:spring cloud security可以解决token重放攻击么?

  答:token重放攻击不是特别了解,可能是数据弱一致性导致的,建议设计尽可能短的过期时间。

  问题:我们公司现在在设计DMP,从行业的状况来看,采用了微服务,但是有一点,首先对于应用本身暴露出来的服务,是和应用一起部署的,也就是并非单独的部署,那么业务组件接口暴露部署是否合理呢?

  答:业务组件的接口一般可以通过统一网关来管理。也可以对业务接口像spring cloud中设置访问scope限制。

  问题:所有暴露的微服务是否需要一个统一的服务管控和治理平台?

  答:是的,一般有服务网关和服务发现组件来管理用户请求。

  问题:微服务的gateway需要实现底层多个细粒度的API组合的场景,我们现在一部分使用异步,但是遇到了没办法全面的解藕。我想问问,对于此,使用响应式?还是异步回调式?它们的区别点会有哪些呢?