Redis用户管理

Redis 6.0 开始引入了 ACL(Access Control List,访问控制列表)功能,支持多用户和细粒度权限控制。

  • Redis 6.0 之前:只有单一密码(通过 requirepass 设置),没有用户概念。
  • Redis 6.0+:默认存在一个名为 default 的用户,所有未认证的连接都属于此用户。

创建用户与权限

首先启用 ACL。可使用独立的 ACL 文件,也可以在 redis.conf 中定义。推荐使用独立的 ACL 文件的方式,可在 redis.conf 中配置 aclfile 参数来指定 ACL 文件路径。

# 启用ACL(默认已启用)
aclfile /etc/redis/users.acl   # 方式1:使用独立 ACL 文件(推荐)

# 或直接在 redis.conf 中定义(方式2):
# 设置 default 用户密码为 "mypassword"
user default on >mypassword ~* &* +@all

参数说明:

  • on:启用该用户
  • >:设置密码(> 表示添加密码)
  • ~*:允许访问所有 key(key pattern)
  • &*:允许访问所有 Pub/Sub channel(Redis 7.0+)
  • +@all:授予所有命令权限

修改了 acl 文件后,需要重新加载 ACL 配置才能生效。

# 如果修改的是 redis.conf
sudo systemctl restart redis

# 或动态加载 ACL(如果使用 aclfile)
redis-cli ACL LOAD

创建具有指定规则的 ACL 用户,或修改现有用户的规则。详细内容可参考官方文档 ACL SETUSER

ACL SETUSER username [rule [rule ...]]

动态修改用户密码:

# 连接 Redis(此时可能无需密码)
redis-cli

# 为 default 用户设置密码
127.0.0.1:6379> ACL SETUSER default on >mypassword ~* &* +@all
OK

# 验证
127.0.0.1:6379> AUTH mypassword
OK

# 持久化ACL配置,如果没有执行 ACL SAVE,则重启后失效
127.0.0.1:6379> ACL SAVE
OK

关闭指定用户,以 default 用户为例。不建议关闭 default 用户,这样会导致所有未指定用户的连接被拒绝,通常不建议。

ACL SETUSER default off

权限列表:

语法含义
+command允许单个命令
-command拒绝单个命令
+@category允许整个命令类别(如 @read@write@admin
-@category拒绝整个类别
allcommands / +@all允许所有命令
nocommands拒绝所有命令(默认状态)

常用命令类别:

  • @read:GET、MGET、HGETALL、KEYS…
  • @write:SET、DEL、HSET、LPUSH…
  • @admin:INFO、CONFIG、ACL、CLIENT…
  • @dangerous:FLUSHALL、SHUTDOWN、DEBUG…

Key 权限:

  • ~key_pattern:允许访问匹配 glob 模式的 key
  • allkeys / ~*:允许所有 key
  • resetkeys:清空 key 权限(回到无权限状态)

参考文档: