如何配置 Redis 消息队列访问密码防止未授权访问?

文章导读
配置 Redis 消息队列访问密码的核心是在 redis.conf 中启用 requirepass 并绑定内网 IP,单节点直接生效,集群模式需额外注意总线端口防护。针对消息队列场景,建议进一步使用 ACL 限制 destructive 命令(如 FLUSHALL)以防数据误删。
📋 目录
  1. 基础认证与网络绑定
  2. 进阶:ACL 最小权限控制
  3. 操作系统防火墙配置
  4. 客户端连接配置示例
  5. 验证与排查
  6. 常见坑与风险
A A

配置 Redis 消息队列访问密码的核心是在 redis.conf 中启用 requirepass 并绑定内网 IP,单节点直接生效,集群模式需额外注意总线端口防护。针对消息队列场景,建议进一步使用 ACL 限制 destructive 命令(如 FLUSHALL)以防数据误删。

先说结论:仅设密码不够,必须配合绑定 IP、防火墙隔离及 ACL 最小权限控制。

  • 先判断:确认 Redis 版本(6.0+ 支持 ACL),区分单机或集群模式。
  • 优先做:修改 redis.conf 设置 requirepass、bind 及 protected-mode,重启服务。
  • 再验证:使用 redis-cli 带密码连接测试,确认无密码无法执行命令,且敏感命令被限制。

基础认证与网络绑定

若需快速临时设置密码(重启后失效),可登录 Redis 后执行。注意:若已开启密码认证,需先执行 AUTH 命令。

CONFIG SET requirepass "YourStrongPassword"

永久生效需修改配置文件 redis.conf,找到以下行取消注释并修改:

requirepass YourStrongPassword
bind 127.0.0.1
protected-mode yes

客户端连接时带上密码:

redis-cli -h 127.0.0.1 -p 6379 -a YourStrongPassword ping

进阶:ACL 最小权限控制

Redis 6.0+ 支持 ACL,可为消息队列创建专用用户,禁止 FLUSHALL 等危险命令,防止内部误操作导致队列清空。

# 创建专用用户 queue_user,仅允许操作 queue:* 开头的 key
# 禁止危险命令,允许读写
ACL SETUSER queue_user on >StrongPassword ~queue:* +@read +@write -@dangerous -FLUSHALL -FLUSHDB

# 验证用户权限
redis-cli -u redis://queue_user:StrongPassword@127.0.0.1:6379
127.0.0.1:6379> FLUSHALL
(error) NOPERM this user has no permissions to run the 'flushall' command

将 ACL 规则持久化:

ACL SAVE

操作系统防火墙配置

在操作系统层面限制端口访问,仅允许信任的 IP 段连接 6379 端口。

如何配置 Redis 消息队列访问密码防止未授权访问?

CentOS 7+ (firewalld):

# 允许特定网段访问 6379 端口
sudo firewall-cmd `--permanent` `--add-source`=192.168.1.0/24 `--port`=6379/tcp
sudo firewall-cmd `--reload`

Ubuntu (ufw):

sudo ufw allow from 192.168.1.0/24 to any port 6379

客户端连接配置示例

所有连接该 Redis 的应用程序都需要更新连接字符串,填入新密码。若使用 ACL 用户,请使用对应用户名和密码。

Java (Jedis):

JedisPoolConfig config = new JedisPoolConfig();
JedisPool pool = new JedisPool(config, "192.168.1.100", 6379, 2000, "YourStrongPassword");
// 若使用 ACL: new JedisPool(config, host, port, timeout, "username", "password");

Python (redis-py):

import redis
r = redis.StrictRedis(host='192.168.1.100', port=6379, password='YourStrongPassword', decode_responses=True)
print(r.ping())

验证与排查

1. 无密码测试

如何配置 Redis 消息队列访问密码防止未授权访问?

尝试不带密码连接,执行命令应被拒绝:

redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.

2. 敏感命令拦截测试

使用 ACL 受限用户执行危险命令,应被拒绝:

redis-cli -h 127.0.0.1 -p 6379 -a StrongPassword
127.0.0.1:6379> FLUSHALL
(error) NOPERM this user has no permissions to run the 'flushall' command

3. 检查保护模式

确认 protected-mode 已开启(默认 yes),防止未绑定 IP 且无密码时的外部访问。

常见坑与风险

1. 集群总线端口未防护

在 Redis 集群模式下,requirepass 仅作用于客户端端口(如 6379),不约束集群总线端口(如 16379)。节点间通信若未做网络隔离,攻击者可能通过总线端口伪造节点。生产环境需通过安全组限制总线端口仅内网互通。

如何配置 Redis 消息队列访问密码防止未授权访问?

2. 命令设置不持久

使用 CONFIG SET 设置的密码在重启后会失效。务必同时修改 redis.conf 文件,确保重启后配置依然有效。ACL 规则需执行 ACL SAVE 写入 aclfile。

3. 密码过于简单

Redis 处理速度非常快,简单密码极易被暴力破解。避免使用默认密码 foobared 或纯数字组合,建议长度至少 12 位以上。

4. 绑定地址错误

若 Redis 部署在 Docker 容器中,绑定 127.0.0.1 可能导致宿主机或其他容器无法访问。需根据实际网络架构绑定宿主机 IP 或容器网络 IP。