消息队列安全

本节讨论了 OpenStack 中使用的三种最常见的消息队列解决方案的安全加固方法:RabbitMQ、Qpid 和 ZeroMQ。

消息传输安全

基于 AMQP 的解决方案(Qpid 和 RabbitMQ)支持使用 TLS 进行传输层安全。ZeroMQ 消息本身不支持 TLS,但可以使用标记的 IPsec 或 CIPSO 网络标签来实现传输层安全。

我们强烈建议为您的消息队列启用传输层加密。为消息客户端连接使用 TLS 可以保护通信免受传输到消息服务器过程中的篡改和窃听。以下是如何为两种流行的消息服务器 Qpid 和 RabbitMQ 配置 TLS 的指导。在配置消息服务器用于验证客户端连接的受信任证书颁发机构 (CA) 捆绑包时,建议将其限制为仅用于您的节点的 CA,最好是内部管理的 CA。受信任 CA 捆绑包将确定哪些客户端证书将被授权并通过设置 TLS 连接的客户端-服务器验证步骤。请注意,在安装证书和密钥文件时,请确保限制文件权限,例如使用 chmod 0600,并将所有权限制为消息服务器守护程序用户,以防止消息服务器上的其他进程和用户进行未经授权的访问。

RabbitMQ 服务器 SSL 配置

应将以下行添加到系统范围的 RabbitMQ 配置文件,通常是 /etc/rabbitmq/rabbitmq.config

[
  {rabbit, [
     {tcp_listeners, [] },
     {ssl_listeners, [{"<IP address or hostname of management network interface>", 5671}] },
     {ssl_options, [{cacertfile,"/etc/ssl/cacert.pem"},
                    {certfile,"/etc/ssl/rabbit-server-cert.pem"},
                    {keyfile,"/etc/ssl/rabbit-server-key.pem"},
                    {verify,verify_peer},
                    {fail_if_no_peer_cert,true}]}
   ]}
].

请注意,tcp_listeners 选项设置为 [] 以防止其侦听非 SSL 端口。 ssl_listeners 选项应限制为仅侦听服务的管理网络。

有关 RabbitMQ SSL 配置的更多信息,请参见

Qpid 服务器 SSL 配置

Apache 基金会为 Qpid 提供了一个消息安全指南。请参见

队列身份验证和访问控制

RabbitMQ 和 Qpid 提供身份验证和访问控制机制来控制对队列的访问。ZeroMQ 不提供此类机制。

简单身份验证和安全层 (SASL) 是互联网协议中身份验证和数据安全的一个框架。RabbitMQ 和 Qpid 都提供 SASL 和其他可插拔的身份验证机制,这些机制超越了简单的用户名和密码,从而提高了身份验证安全性。虽然 RabbitMQ 支持 SASL,但 OpenStack 中的支持目前不允许请求特定的 SASL 身份验证机制。OpenStack 中 RabbitMQ 的支持允许使用未加密连接上的用户名和密码身份验证,或者用户名和密码与 X.509 客户端证书结合使用以建立安全的 TLS 连接。

我们建议在所有 OpenStack 服务节点上配置 X.509 客户端证书用于客户端连接到消息队列,并在可能的情况下(目前仅 Qpid)使用 X.509 客户端证书执行身份验证。在使用用户名和密码时,应为每个服务和节点创建帐户,以便对队列访问进行更细粒度的审计。

在部署之前,请考虑队列服务器使用的 TLS 库。Qpid 使用 Mozilla 的 NSS 库,而 RabbitMQ 使用 Erlang 的 TLS 模块,该模块使用 OpenSSL。

身份验证配置示例:RabbitMQ

在 RabbitMQ 服务器上,删除默认的 guest 用户

# rabbitmqctl delete_user guest

在 RabbitMQ 服务器上,为每个与消息队列通信的 OpenStack 服务或节点设置用户帐户和权限

# rabbitmqctl add_user compute01 RABBIT_PASS
# rabbitmqctl set_permissions compute01 ".*" ".*" ".*"

将 RABBIT_PASS 替换为合适的密码。

有关其他配置信息,请参见

OpenStack 服务配置:RabbitMQ

[DEFAULT]
rpc_backend = nova.openstack.common.rpc.impl_kombu
rabbit_use_ssl = True
rabbit_host = RABBIT_HOST
rabbit_port = 5671
rabbit_user = compute01
rabbit_password = RABBIT_PASS
kombu_ssl_keyfile = /etc/ssl/node-key.pem
kombu_ssl_certfile = /etc/ssl/node-cert.pem
kombu_ssl_ca_certs = /etc/ssl/cacert.pem

身份验证配置示例:Qpid

有关配置信息,请参见

OpenStack 服务配置:Qpid

[DEFAULT]
rpc_backend = nova.openstack.common.rpc.impl_qpid
qpid_protocol = ssl
qpid_hostname = <IP or hostname of management network interface of messaging server>
qpid_port = 5671
qpid_username = compute01
qpid_password = QPID_PASS

可选地,如果使用 Qpid 的 SASL,请通过添加指定正在使用的 SASL 机制

qpid_sasl_mechanisms = <space separated list of SASL mechanisms to use for auth>

消息队列进程隔离和策略

每个项目提供许多发送和消费消息的服务。预计每个发送消息的二进制文件都会消费消息,即使只是回复,来自队列。

消息队列服务进程应与其他进程以及机器上的其他进程隔离。

命名空间

网络命名空间强烈建议用于在 OpenStack Compute Hypervisor 上运行的所有服务。这将有助于防止虚拟机访客和管理网络之间的网络流量桥接。

在使用 ZeroMQ 消息传递时,每个主机必须运行至少一个 ZeroMQ 消息接收器才能从网络接收消息并通过 IPC 将消息转发到本地进程。运行独立的消息接收器是可行的,也是明智的,每个项目都在 IPC 命名空间内,以及同一项目内的其他服务。

网络策略

队列服务器应仅接受来自管理网络的连接。这适用于所有实现。这应通过服务配置来实现,并可选择通过全局网络策略强制执行。

在使用 ZeroMQ 消息传递时,每个项目应在专门用于该项目所属服务的端口上运行单独的 ZeroMQ 接收器进程。这等效于 AMQP 概念中的控制交换机。

强制访问控制

使用强制访问控制 (MAC) 和自主访问控制 (DAC) 来限制进程的配置,仅限于这些进程。此限制可防止这些进程与在同一台机器上运行的其他进程隔离。