redis的acl使用方法详解

Redis ACL(访问控制列表)使用方法详解

一、ACL 概述

Redis ACL(Access Control List)是 Redis 6.0 引入的安全机制,用于替代传统的单密码认证。它提供细粒度的权限控制,允许为不同用户分配不同命令、键空间的访问权限,增强数据安全性。

二、ACL 核心概念
  1. 用户(User)

    • Redis 内置默认用户 default,可通过配置禁用或修改。
    • 每个用户有独立的权限集和认证信息(密码)。
  2. 权限(Permission)

    • 命令权限 :控制用户可执行的命令(如 GETSETFLUSHALL)。
    • 键空间权限 :限制用户可访问的键(如 user:*data/*)。
    • 连接权限:控制网络连接相关权限(如 TLS、最大连接数)。
  3. 角色(Role)

    • 通过预定义权限组简化用户管理(如 read-onlyadmin)。
三、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:*
  • 权限说明 :允许 INFOSLOWLOG 和读命令,仅限操作 stats: 开头的键。
六、验证 ACL 配置
  1. 切换用户
bash 复制代码
AUTH username password  # 验证用户身份
  1. 测试权限
bash 复制代码
# 假设当前用户为 reader(只读权限)
SET key value  # 报错:(error) NOPERM this user has no permissions to run the 'set' command
GET key        # 正常执行
  1. 查看用户权限
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
八、最佳实践
  1. 最小权限原则:为每个用户分配完成任务所需的最小权限集。
  2. 定期审计 :通过 ACL LOG 命令查看权限变更日志,及时发现异常。
  3. 避免使用 default 用户:修改 default 用户权限或禁用,创建专用用户。
  4. 密码管理 :使用强密码并定期轮换,密码建议通过 ACL GENPASS 生成。
  5. 监控权限使用:结合 Redis 慢查询日志和 ACL 日志,监控权限使用情况。