1. 身份验证与授权

当谈到与系统交互的人和事时,身份验证和授权是核心概念。我们一般把要进行身份验证的人或物成为主体。

对于单块系统来说,app本身会处理身份验证和授权。比如Django提供现成的用户管理功能。但是在分布式系统领域,我们希望用户仍然使用一套用户名密码来使用整个系统,也就是单点登录(Single Sign-On)。

当主体尝试访问一个资源时,会被定向到一个身份提供者那里进行身份验证,这个主体必须提供用户名密码进行验证,一旦身份提供者确认主体可以通过验证,它会发消息给服务提供者,让后者决定是否允许他访问资源。

作者介绍的单点登陆技术有SAML和OpenID Connect,但前者使用起来相对复杂,后者是基于OAuth 2.0实现的认证+授权的一个标准,使用起来相对简单。我在这里提一下其他常见的单点登陆技术方案:

  1. 基于同域共享的Cookie方案,简单来说就是shop.abc.com和food.abc.com可以共享浏览器的cookie。
  2. CAS,是Central Authentication Service的缩写,中央认证服务,一种独立开放指令协议。在 2004 年 12 月正式成为 JA-SIG 的一个项目。

2. 服务间的身份验证与授权

  1. 使用HTTPS身份验证,就是调用者把用户名密码放在header中发送,服务端从中获取并验证。有个小问题是服务端需要管理SSL证书,并且一般都是组织自己承担签发证书的工作,这些都是额外的工作。
  2. 如果微服务中已经采用了某一种SSO方案,那么服务间认证也可以使用同一套认证系统。这个时候要做的就是为每个微服务创建一个服务账户(用户名密码),以某种安全方式存储在各个微服务代码中。
  3. 客户端证书方式,使用TLS,它是SSL在客户端证书方面的继任者,在这里,每个客户端都安装一个X.509证书,服务端可以验证客户端证书的真实性,为客户端的有效性提供强有力的保证。但是使用这种方法,证书管理的工作要比只使用服务端证书更加繁重;复杂性在于证书本身,你可能会花费大量时间来诊断服务端为什么不接收你认为的一个有效的客户端证书。因此,你应该在通过互联网发送非常重要的数据时,才使用安全通信。
  4. 基于HTTP的HMAC,前面提到HTTPS通信方式除了需要管理证书,其本身的通信开销也使得服务器压力增加,而且通信难以被轻松缓存;HMAC方式是对请求进行签名,它是OAuth规范的一部分,被广泛应用于AWS的S3 API。使用HMAC时,请求主题和私钥一起被哈希成一个哈希值随请求一起发送,然后服务端使用请求主体和自己的私钥副本重建哈希值,如果匹配便接受请求。生成哈希值的开销要远低于HTTPS通信的开销。缺点就是通信数据是明文传输的。

3. 略。

本章剩下内容讲的是从软件层面以外的方面来探讨安全问题,比如为系统添置防火墙,必要的日志,入侵检测系统,对多个微服务按职责进行网络隔离,以及定时为操作系统打补丁等等。

还有就是要注重人的管理,即当你的团队中有人离开时,如何完全撤销他的凭证;

另外,作者反复强调:不要尝试自己去实现加密算法!!!除非你是一个具有多年经验的密码学专家!

 

----------------------------------------------------------------  saosao的分割线  ------------------------------------------------------------------------

博主的Coding部落群 588757596,快来一起玩耍!

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐