Redis 安全
Redis默认配置不安全,本课学习如何保护Redis实例。
Redis安全风险
默认配置的风险:
- 无密码认证:任何人都可以连接
- 绑定所有网络接口:外部可访问
- 危险命令未禁用:FLUSHALL、CONFIG等
- 明文传输:数据未加密
⚠️ 警告: Redis暴露在公网非常危险!曾有大规模Redis攻击事件。
密码认证
设置密码(Redis 6.0之前)
CONF
# redis.conf
requirepass your_strong_password_here
连接时认证:
REDIS
# 方式1:连接时指定密码
redis-cli -a your_strong_password_here
# 方式2:连接后认证
redis-cli
AUTH your_strong_password_here
OK
⚠️ 注意: 命令行使用
-a 参数会在历史记录中暴露密码,不推荐。
配置文件中设置密码
CONF
# redis.conf
requirepass "P@ssw0rd!2026#Redis"
动态设置密码
REDIS
CONFIG SET requirepass "new_password"
OK
# 需要重新认证
AUTH new_password
OK
ACL权限控制(Redis 6.0+)
Redis 6.0引入ACL(Access Control List),提供更细粒度的权限控制。
查看用户列表
REDIS
ACL LIST
1) "user default on nopass ~* &* +@all"
创建用户
REDIS
# 创建用户,设置密码
ACL SETUSER alice on >password123 ~* +@all
OK
# 创建只读用户
ACL SETUSER bob on >password456 ~* +@read +@connection
OK
# 创建只能访问特定键的用户
ACL SETUSER app on >apppass ~app:* +@all
OK
ACL命令语法
ACL SETUSER username
on|off # 启用或禁用
>password # 设置密码
~pattern # 允许访问的键(~*表示所有键)
&pattern # 允许访问的Pub/Sub频道
+@category # 允许命令类别
-@category # 禁止命令类别
+command # 允许特定命令
-command # 禁止特定命令
命令类别
| 类别 | 说明 | 包含命令 |
|---|---|---|
| @all | 所有命令 | 所有 |
| @read | 读命令 | GET, HGET, LRANGE等 |
| @write | 写命令 | SET, HSET, LPUSH等 |
| @admin | 管理命令 | CONFIG, DEBUG等 |
| @dangerous | 危险命令 | FLUSHALL, SHUTDOWN等 |
| @connection | 连接命令 | AUTH, PING, QUIT等 |
| @string | 字符串命令 | SET, GET, INCR等 |
| @hash | 哈希命令 | HSET, HGET等 |
| @list | 列表命令 | LPUSH, LPOP等 |
| @set | 集合命令 | SADD, SREM等 |
| @sortedset | 有序集合命令 | ZADD, ZREM等 |
创建不同权限的用户
REDIS
# 管理员:所有权限
ACL SETUSER admin on >admin123 ~* +@all
# 只读用户
ACL SETUSER readonly on >read123 ~* +@read +@connection
# 应用用户:只能访问app:*键
ACL SETUSER app on >app123 ~app:* +@all
# 统计用户:只能读取统计相关键
ACL SETUSER stats on >stats123 ~stats:* +@read +@connection
# 禁止危险命令的用户
ACL SETUSER safe on >safe123 ~* +@all -@admin -@dangerous
查看用户权限
REDIS
# 查看所有用户
ACL LIST
# 查看特定用户
ACL GETUSER alice
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "hash_password"
5) "keys"
6) "~*"
7) "commands"
8) "+@all"
删除用户
REDIS
ACL DELUSER alice
(integer) 1
保存ACL配置
REDIS
# 将ACL配置保存到文件
ACL SAVE
OK
在 redis.conf 中指定ACL文件:
CONF
aclfile /etc/redis/users.acl
命令重命名
重命名或禁用危险命令。
禁用命令
CONF
# redis.conf
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
rename-command SHUTDOWN ""
rename-command KEYS ""
重命名命令
CONF
# 将危险命令重命名为复杂的名称
rename-command FLUSHALL "FLUSHALL_abc123xyz"
rename-command CONFIG "CONFIG_secret789"
使用重命名后的命令:
REDIS
# 原命令不可用
FLUSHALL
(error) ERR unknown command 'FLUSHALL'
# 使用新命令
FLUSHALL_abc123xyz
OK
💡 用途: 禁用或重命名危险命令,防止误操作或恶意攻击。
网络安全
绑定IP地址
CONF
# redis.conf
# 仅本地访问
bind 127.0.0.1
# 允许特定IP访问
bind 127.0.0.1 192.168.1.100
# 允许所有IP访问(危险!)
bind 0.0.0.0
⚠️ 警告:
bind 0.0.0.0 允许所有IP访问,必须设置密码!
保护模式
CONF
# redis.conf
# 开启保护模式(默认)
protected-mode yes
保护模式的作用:
- 仅接受本地连接(127.0.0.1)
- 或设置了bind地址
- 或设置了密码
修改端口
CONF
# 使用非默认端口
port 6380
💡 用途: 使用非默认端口可以减少自动扫描攻击。
防火墙配置
BASH
# Linux iptables
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
# CentOS firewalld
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="6379" accept'
firewall-cmd --reload
TLS/SSL加密(Redis 6.0+)
Redis 6.0支持TLS加密连接。
配置TLS
CONF
# redis.conf
tls-port 6379
port 0 # 禁用非TLS端口
tls-cert-file /path/to/redis.crt
tls-key-file /path/to/redis.key
tls-ca-cert-file /path/to/ca.crt
tls-auth-clients optional
tls-protocols "TLSv1.2 TLSv1.3"
使用TLS连接
BASH
redis-cli --tls --cert /path/to/client.crt --key /path/to/client.key --cacert /path/to/ca.crt
安全最佳实践
1. 设置强密码
CONF
# 使用强密码(至少16位,包含大小写字母、数字、特殊字符)
requirepass "Xk9#mP2$vL5@nQ8&wR4!"
2. 使用ACL控制权限
REDIS
# 为不同应用创建不同权限的用户
ACL SETUSER webapp on >webpass ~web:* +@all
ACL SETUSER batch on >batchpass ~batch:* +@all
ACL SETUSER readonly on >readpass ~* +@read +@connection
3. 禁用危险命令
CONF
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
4. 限制网络访问
CONF
bind 127.0.0.1
protected-mode yes
5. 使用防火墙
BASH
# 仅允许特定IP访问Redis端口
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 6379 -j ACCEPT
iptables -A INPUT -p tcp --dport 6379 -j DROP
6. 定期审计
REDIS
# 查看当前连接的客户端
CLIENT LIST
# 查看用户权限
ACL LIST
# 查看执行的命令(慎用)
MONITOR
安全检查清单
□ 设置强密码(requirepass或ACL)
□ 绑定内网IP(bind 127.0.0.1或内网IP)
□ 开启保护模式(protected-mode yes)
□ 禁用危险命令(FLUSHALL、CONFIG等)
□ 使用防火墙限制访问
□ 使用非默认端口
□ 定期更新Redis版本
□ 监控异常连接和命令
□ 使用ACL细分权限(Redis 6.0+)
□ 考虑使用TLS加密(Redis 6.0+)
❓ 常见问题
Q Redis 6.0之前如何实现权限控制?
A 只能使用requirepass设置密码,所有客户端使用相同密码,权限相同。
Q 如何禁用KEYS命令?
A 使用
rename-command KEYS "" 禁用,或重命名为复杂名称。Q bind 0.0.0.0安全吗?
A 不安全!必须同时设置强密码和防火墙。建议仅绑定内网IP。
Q 如何防止Redis被攻击?
A 设置强密码、绑定内网IP、禁用危险命令、使用防火墙、定期更新版本。
Q ACL配置如何持久化?
A 使用ACL SAVE保存到文件,或在redis.conf中指定aclfile。
📖 小节
- Redis默认配置不安全,需要安全加固
- 设置强密码认证(requirepass或ACL)
- ACL提供细粒度权限控制(Redis 6.0+)
- 重命名或禁用危险命令
- 绑定内网IP,开启保护模式
- 使用防火墙限制访问
- 考虑使用TLS加密(Redis 6.0+)
- 定期审计和监控
📝 作业
- 密码认证: 设置Redis密码,测试认证连接
- ACL配置: 创建不同权限的用户(管理员、只读、应用用户)
- 命令禁用: 禁用FLUSHALL和CONFIG命令,测试是否生效
- 安全检查: 按照安全检查清单检查你的Redis配置
下一课
下一课我们将学习 Redis 性能测试,学习redis-benchmark工具。



