消息队列的系统安全由六部分组成:网络隔离、传输安全、集群认证、资源授权、自我保护、数据加密。
网络隔离的安全性
不管是什么系统,从安全的角度来看,最完美的保护就是网络隔离。这很好理解,一个完全隔离封闭的网络,是不会存在网络安全问题的,因为别人根本无法访问它。
数据传输过程加密
我们的应用必须访问外界服务,也必定存在公网的数据传输。为了防止数据在传输过程中不被窃取、改变,确保数据的完整性,我们需要对传输过程中的数据进行加密。
几乎所有的消息队列产品,传输过程中的加密机制都是基于 SSL/TLS 实现的。SSL 和 TLS 是同一个东西。SSL 3.0 及之前的版本叫 SSL,3.0 之后叫做 TLS,TLS 是 SSL 的升级版。
从技术上看,传输加密由两部分组成,服务端代码开启支持 SSL 和客户端配置 SSL 访问。服务端开启 SSL 分为两步,首先需要制作 SSL 证书,然后使用对应语言的 SSL 库在服务端支持 SSL 协议。客户端连接时,通过消息队列 SDK 集成的 SSL 功能,携带对应的公钥和证书信息,与服务端进行通信。
连接建立时的身份认证
集群认证,通俗解释就是消息队列中的登录功能。认证是客户端连接服务端的第一道门槛,主要是解决客户端连接到服务端时,是否允许建立连接的问题。
SASL 的全称是 Simple Authentication and Security Layer,翻译过来就是简单身份验证和安全层,你可以把它理解为一个框架,在这个框架上扩展各种身份验证提供程序就可以了。
从消息队列的角度来看,一般自定义的身份认证框架基本可以满足认证需求。而且基于自定义的机制,实现起来会比较简单,编码成本较低。
身份认证实现:
- 用户名 + 密码的机制
- Kerberos:Kerberos 是一种计算机网络授权协议,用来在非安全网络中对个人通信进行身份认证,属于一种标准的授权协议。一般需要先配置一个 Kerberos 配置中心,然后消息队列配置上配置中心的相关信息,收到客户端的验证请求的时候,通过 Kerberos 配置中心完成认证。
- OAuth 认证:它的授权过程简单理解就是获取令牌(Token)的过程。
集群资源的访问控制
集群有两类操作,一种是集群资源类的操作,比如主题和用户信息的创建删除、限流配额信息的配置。一种是数据资源类的操作,比如生产消费某个数据。
这两类资源的访问控制,在实现上有两种思路。
- 独立两条链路,比如数据操作(生产和消费)使用 TCP 链路,集群资源的操作使用 HTTP 链路。
- 同一条链路上实现两种操作,数据操作和集群资源操作在同一条 TCP 或 HTTP 链路上完成,然后通过接口或资源类型维度的鉴权来实现管控。
访问控制机制 ACL
ACL 全称是访问控制机制,简单来说,就是解决“某个资源能不能被访问,能被谁访问”的问题。因此 ACL 包含两部分:一是定义好哪些行为和资源需要进行鉴权,二是如何实现鉴权。
Kafka 在权限控制做得比较精细。从资源和 API 两个维度做了访问控制。资源主要分为主题、消费分组、集群三个维度,几乎涉及所有主要的 API,控制操作包括读、写、创建、删除、修改、描述等等。
那访问控制机制具体如何实现呢?其实非常简单,在实现上就一个函数的工作量,流程分为两步。
- 请求接入的时候,获取到当前连接的用户信息或者 IP 信息。
- 在请求处理的开始,调用访问控制的实现函数(比如 authorizeByResourceType),传入当前访问的操作(比如生产、消费、配置)以及用户或 IP 信息,和内存中的授权数据比较,返回是否具有权限。
在具体编码实现上,消息队列一般都会支持一个可插拔的鉴权机制,即可以通过配置自定义的鉴权类来实现自定义的鉴权。
超级用户
在系统中有一个默认的超级用户,是非常必要的。如果没有超级用户,一旦分配出去的用户被不小心或者恶意修改,系统就无法恢复访问了,超级用户的存在可以很好地避免这个问题。另外,在系统运维过程中,超级用户会带来很多管理上的便利,比如运维负责人的临时、紧急状态的操作。
超级用户的配置一般是写死固定在配置文件当中的,不能被修改和删除。
此文章为11月Day19学习笔记,内容来源于极客时间《深入拆解消息队列 47 讲》