Redis ACL(访问控制列表)使用方法详解
一、ACL 概述
Redis ACL(Access Control List)是 Redis 6.0 引入的安全机制,用于替代传统的单密码认证。它提供细粒度的权限控制,允许为不同用户分配不同命令、键空间的访问权限,增强数据安全性。
二、ACL 核心概念
-
用户(User)
- Redis 内置默认用户
default
,可通过配置禁用或修改。 - 每个用户有独立的权限集和认证信息(密码)。
- Redis 内置默认用户
-
权限(Permission)
- 命令权限 :控制用户可执行的命令(如
GET
、SET
、FLUSHALL
)。 - 键空间权限 :限制用户可访问的键(如
user:*
、data/*
)。 - 连接权限:控制网络连接相关权限(如 TLS、最大连接数)。
- 命令权限 :控制用户可执行的命令(如
-
角色(Role)
- 通过预定义权限组简化用户管理(如
read-only
、admin
)。
- 通过预定义权限组简化用户管理(如
三、ACL 配置与管理
1. 启用 ACL
修改 redis.conf
配置文件:
conf
# 启用 ACL(默认已启用)
aclfile /etc/redis/users.acl # 指定 ACL 配置文件路径
# 禁用旧密码认证(可选)
requirepass off
2. ACL 命令行工具
通过 redis-cli
管理 ACL:
bash
# 查看当前用户权限
ACL LIST
# 创建新用户并设置权限
ACL SETUSER alice on >password123 +get +set ~user:*
# 删除用户
ACL DELUSER alice
# 加载 ACL 配置文件
ACL LOAD
# 保存当前 ACL 到文件
ACL SAVE
四、权限配置语法
1. 用户状态控制
on/off # 启用/禁用用户
nopass # 无密码访问
>password # 设置密码(哈希存储)
~<pattern> # 键空间匹配模式(如 ~user:* 匹配所有 user: 开头的键)
2. 命令权限
+<command> # 允许命令(如 +get)
-<command> # 禁止命令(如 -flushall)
+@<category> # 允许命令类别(如 +@read 允许所有读命令)
allcommands # 允许所有命令(等价于 +@all)
nocommands # 禁止所有命令
3. 命令类别
Redis 预定义命令类别:
@read # 读命令(GET、HGET 等)
@write # 写命令(SET、HSET 等)
@set # SET 相关命令
@hash # HASH 相关命令
@list # LIST 相关命令
@admin # 管理命令(CONFIG、SHUTDOWN 等)
@dangerous # 危险命令(FLUSHALL、KEYS 等)
@all # 所有命令
五、ACL 使用示例
1. 创建只读用户
bash
ACL SETUSER reader on >readerpass +@read ~*
- 权限说明:允许所有读命令,可访问所有键。
2. 创建管理员用户
bash
ACL SETUSER admin on >adminpass allcommands ~*
- 权限说明:允许所有命令,可访问所有键。
3. 创建数据写入用户(仅操作 user: 开头的键)
bash
ACL SETUSER writer on >writerpass +@write ~user:*
- 权限说明 :允许写命令,仅限操作
user:
开头的键。
4. 创建受限用户(仅能执行特定命令)
bash
ACL SETUSER stats on >statspass +INFO +SLOWLOG +@read ~stats:*
- 权限说明 :允许
INFO
、SLOWLOG
和读命令,仅限操作stats:
开头的键。
六、验证 ACL 配置
- 切换用户:
bash
AUTH username password # 验证用户身份
- 测试权限:
bash
# 假设当前用户为 reader(只读权限)
SET key value # 报错:(error) NOPERM this user has no permissions to run the 'set' command
GET key # 正常执行
- 查看用户权限:
bash
ACL LIST # 查看所有用户权限
ACL USERS # 列出所有用户
七、高级配置技巧
1. 使用预定义角色
bash
# 复制默认用户权限到新用户
ACL SETUSER developer on >devpass reset +@all -@dangerous ~*
- 权限说明:允许除危险命令外的所有操作。
2. 动态修改权限
bash
# 临时禁止用户执行 FLUSHALL
ACL SETUSER admin -flushall
3. 使用 TLS 加密连接
conf
# 在 redis.conf 中配置 TLS
tls-port 6379
tls-cert-file /path/to/cert.pem
tls-key-file /path/to/key.pem
# 为特定用户启用 TLS 连接
ACL SETUSER secure_user on >securepass tls ~* +@all
八、最佳实践
- 最小权限原则:为每个用户分配完成任务所需的最小权限集。
- 定期审计 :通过
ACL LOG
命令查看权限变更日志,及时发现异常。 - 避免使用 default 用户:修改 default 用户权限或禁用,创建专用用户。
- 密码管理 :使用强密码并定期轮换,密码建议通过
ACL GENPASS
生成。 - 监控权限使用:结合 Redis 慢查询日志和 ACL 日志,监控权限使用情况。