配置 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 端口。
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-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' command3. 检查保护模式
确认 protected-mode 已开启(默认 yes),防止未绑定 IP 且无密码时的外部访问。
常见坑与风险
1. 集群总线端口未防护
在 Redis 集群模式下,requirepass 仅作用于客户端端口(如 6379),不约束集群总线端口(如 16379)。节点间通信若未做网络隔离,攻击者可能通过总线端口伪造节点。生产环境需通过安全组限制总线端口仅内网互通。
2. 命令设置不持久
使用 CONFIG SET 设置的密码在重启后会失效。务必同时修改 redis.conf 文件,确保重启后配置依然有效。ACL 规则需执行 ACL SAVE 写入 aclfile。
3. 密码过于简单
Redis 处理速度非常快,简单密码极易被暴力破解。避免使用默认密码 foobared 或纯数字组合,建议长度至少 12 位以上。
4. 绑定地址错误
若 Redis 部署在 Docker 容器中,绑定 127.0.0.1 可能导致宿主机或其他容器无法访问。需根据实际网络架构绑定宿主机 IP 或容器网络 IP。