如何防止 RabbitMQ 被未授权访问安全加固方案

文章导读
防止 RabbitMQ 被未授权访问,最核心的措施是立即禁用默认 guest 账户、强制启用身份认证并为通信链路开启 TLS 加密,这适用于所有暴露在非绝对可信内网环境的生产实例。
📋 目录
  1. A 命令速用版
  2. B SSL 证书生成与配置实战
  3. C 防火墙策略配置示例
  4. D 为什么会这样
  5. E 怎么验证是否生效
  6. F 常见坑
  7. G 参考来源
A A

防止 RabbitMQ 被未授权访问,最核心的措施是立即禁用默认 guest 账户、强制启用身份认证并为通信链路开启 TLS 加密,这适用于所有暴露在非绝对可信内网环境的生产实例。

先说结论:默认配置下的 RabbitMQ 存在高危风险,必须通过删除默认账户、配置强密码策略和启用 SSL/TLS 来构建基础防线。

  • 先判断:检查是否仍保留 guest 账户且允许远程登录,确认管理界面是否暴露在公网。
  • 优先做:创建专用管理员账户并验证成功,再删除 guest 用户,配置防火墙限制访问 IP。
  • 再验证:尝试使用旧凭据登录确认失败,通过抓包或日志确认通信已加密。

命令速用版

以下是基于命令行工具的快速加固指令,适用于大多数 Linux 环境。注意:务必先创建新管理员并验证登录后,再删除 guest 账户,避免锁死。

# 1. 创建新用户并设置强密码(先执行)
rabbitmqctl add_user admin_user "YourStrongPassword123!"

# 2. 赋予管理员标签
rabbitmqctl set_user_tags admin_user administrator

# 3. 设置权限(示例:仅允许访问/虚拟主机)
rabbitmqctl set_permissions -p / admin_user ".*" ".*" ".*"

# 4. 【关键】手动使用新账户登录管理界面验证成功后,再执行下一步

# 5. 删除默认高危 guest 用户
rabbitmqctl delete_user guest

# 6. 启用管理插件(如未启用)
rabbitmq-plugins enable rabbitmq_management

SSL 证书生成与配置实战

为防止传输层窃听,需配置 SSL。以下是使用 OpenSSL 生成自签名证书并配置 RabbitMQ 的完整步骤。

1. 生成证书文件

# 生成 CA 私钥和证书
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 365 -key ca.key -out ca.crt

# 生成服务器私钥
openssl genrsa -out server.key 2048

# 生成服务器证书签名请求
openssl req -new -key server.key -out server.csr

# 使用 CA 签署服务器证书
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt

# 合并证书链(部分客户端需要)
cat server.crt ca.crt > server_full.crt

# 设置权限,仅 rabbitmq 用户可读
chmod 600 server.key server.crt ca.crt
chown rabbitmq:rabbitmq server.key server.crt ca.crt

2. 配置 rabbitmq.conf

将证书文件放置于安全目录(如 /etc/rabbitmq/certs/),并在配置文件中启用 SSL。以下配置禁用了不安全的 TLS 版本和弱加密套件。

# 启用 SSL 监听端口
listeners.ssl.default = 5671

# 证书路径配置
ssl_options.cacertfile = /etc/rabbitmq/certs/ca.crt
ssl_options.certfile = /etc/rabbitmq/certs/server_full.crt
ssl_options.keyfile = /etc/rabbitmq/certs/server.key

# 安全增强:仅允许 TLSv1.2 及以上
ssl_options.versions.1 = TLSv1.2
ssl_options.versions.2 = TLSv1.3

# 指定安全加密套件(示例)
ssl_options.ciphers.1 = ECDHE-RSA-AES256-GCM-SHA384
ssl_options.ciphers.2 = ECDHE-RSA-AES128-GCM-SHA256

# 验证客户端证书(可选,生产环境建议开启)
# ssl_options.verify = verify_peer
# ssl_options.fail_if_no_peer_cert = true

防火墙策略配置示例

通过防火墙限制端口访问,管理界面 15672 和 AMQP 端口 5672/5671 不应直接暴露在公网,仅允许受信任的 IP 段访问。

Firewalld 配置示例(CentOS/RHEL):

如何防止 RabbitMQ 被未授权访问安全加固方案
# 放行受信任 IP 段访问 AMQP 端口
firewall-cmd `--permanent` `--add-rich-rule`='rule family="ipv4" source address="192.168.1.0/24" port port="5672" protocol="tcp" accept'
firewall-cmd `--permanent` `--add-rich-rule`='rule family="ipv4" source address="192.168.1.0/24" port port="5671" protocol="tcp" accept'

# 放行受信任 IP 段访问管理界面
firewall-cmd `--permanent` `--add-rich-rule`='rule family="ipv4" source address="192.168.1.0/24" port port="15672" protocol="tcp" accept'

# 拒绝其他所有访问(默认策略通常为拒绝,此处确保生效)
firewall-cmd `--reload`

为什么会这样

RabbitMQ 默认安装为了方便调试,会创建一个名为 guest 的账户,密码也是 guest,且默认权限极高。在早期版本或默认配置中,这个账户往往仅限本地访问,但一旦配置不当或被修改,攻击者即可通过互联网直接登录管理界面或连接消息端口。

此外,默认的 AMQP 协议(端口 5672)和管理界面(端口 15672)通常使用明文传输。如果在非可信网络中,攻击者可以通过抓包工具窃取消息内容或认证凭据。未授权访问漏洞不仅会导致数据泄露,还可能被利用来投递恶意消息,导致服务瘫痪。

怎么验证是否生效

1. 登录测试

尝试使用 guest/guest 进行远程登录,应被拒绝。使用新创建的账户登录管理界面,确认权限是否符合预期。

2. 端口检查

使用 telnet 或 nmap 扫描服务器端口,确认未授权的 IP 无法连通 5672 或 15672 端口。

# 从非信任机器测试
nmap -p 5672,15672 <server_ip>

3. 加密验证

客户端连接时配置 SSL 选项,若未配置证书则连接应失败。可通过 OpenSSL 命令验证 SSL 握手是否成功:

openssl s_client -connect <server_ip>:5671 -CAfile /path/to/ca.crt

若输出中包含 Verify return code: 0 (ok) 且能看到证书信息,则说明加密链路建立成功。

如何防止 RabbitMQ 被未授权访问安全加固方案

常见坑

1. 账户锁定风险

操作顺序错误,先删除 guest 后创建新用户,若创建命令执行失败或密码记错,会导致无法管理。务必先创建并验证新账户。

2. 证书路径权限错误

配置 SSL 时,证书文件必须仅对 RabbitMQ 运行用户可读(如 chmod 600),否则服务可能启动失败或拒绝加载证书。

3. 防火墙误封

开启防火墙规则后,务必先放行当前管理 IP,避免将自己锁在门外导致无法修复配置。

4. 集群配置不同步

在集群环境中,安全配置需在所有节点上保持一致,特别是用户信息和权限策略,否则可能导致节点间通信失败。

参考来源

  • RabbitMQ Official Docs - Access Control: https://www.rabbitmq.com/docs/access-control
  • RabbitMQ Official Docs - SSL/TLS: https://www.rabbitmq.com/docs/ssl
  • RabbitMQ Official Docs - Networking: https://www.rabbitmq.com/docs/networking