防止 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):
# 放行受信任 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) 且能看到证书信息,则说明加密链路建立成功。
常见坑
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