在软件系统设计中,如何让应用能够在各种环境中安全高效的访问是个复杂的问题,这个问题的背后是一系列软件设计时需要考虑的架构安全问题:架构安全性 | 凤凰架构
- 认证:系统如何识别合法用户,也就是解决 你是谁 的问题;
- 授权:系统在识别合法用户后,还需要解决 你能做什么 的问题;
- 凭证:系统如何保证它与用户之间的承诺是双方真实意图的体现,是准确、完整且不可抵赖的;
- 保密:如何安全的持久化用户的账户信息,确保不会被任何人窃取与滥用;
- 传输:在复杂的用户环境中,如何安全的传递用户信息,保证不被第三方窃听、篡改和冒充。
在漫长的架构演进历史中,业界对这些问题已经有很成熟的解决方案。在架构安全这块,最好的是遵循技术标准与最佳实践,尽可能不重复造轮子或“创新”。下面这个思维导图就是针对这些问题的常见的技术标准及方案:
在研究分布式系统的认证和授权问题前,让我们回到单体架构的时代,看看在单体架构上这些问题是如何被解决的。
单体系统
认证
认证主要解决 你是谁 的问题,从方式上来看有以下三种:认证 | 凤凰架构
- 基于通信信道:建立通信信道之前需要证明 你是谁。在网络传输(Network)场景中的典型是基于 SSL/TLS 传输安全层的认证。
- 基于通信协议:在获取资源之前需要证明 你是谁。在互联网(Internet)场景中的典型是基于 HTTP 协议的认证。
- 基于通信内容:在提供服务之前需要证明 你是谁。在万维网(World Wide Web)场景中的典型是基于 Web 内容的认证。
在单体系统时代,认证方式一般是在通信信道上开启 HTTPS,在通信协议上利用 HTTP Basic/Digest/Bearer/HOBA/OCRA 等方式并在通信内容上结合表单或 TOTP 等的认证组合方式。这样可以从通信的不同阶段获得相应的安全保证。
如果想对基于 HTTP 协议的认证方式做进一步的了解,可以参考这两篇文章:
单点登录(SSO)
认证的一个常见应用场景是单点登录。单点登录主要解决了一个一次登录访问多个独立应用的问题。在单点登录方案出现之前,每个应用都需要独立登录维持各自的会话。相关的技术方案已经很成熟,主要有以下: