Redis 安全

Redis默认配置不安全,本课学习如何保护Redis实例。

Redis安全风险

默认配置的风险:

⚠️ 警告: 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

保护模式的作用:

修改端口

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。

📖 小节

📝 作业

  1. 密码认证: 设置Redis密码,测试认证连接
  2. ACL配置: 创建不同权限的用户(管理员、只读、应用用户)
  3. 命令禁用: 禁用FLUSHALL和CONFIG命令,测试是否生效
  4. 安全检查: 按照安全检查清单检查你的Redis配置

下一课

下一课我们将学习 Redis 性能测试,学习redis-benchmark工具。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏