> 文章列表 > Redis 6.0+ 的 ACL 机制

Redis 6.0+ 的 ACL 机制

Redis 6.0+ 的 ACL 机制

Redis 6.0+ 的 ACL 机制


目录

    • 前言
    • 一、安装 Redis 服务
    • 二、创建 ACL 用户
    • 三、用户密码管理
      • 3.1 删除密码
      • 3.2 重置用户和密码
    • 四、权限管理
      • 4.1 key 管理
      • 4.2 权限管理
    • 五、ACL 用户存储
      • 5.1 配置文件实现
      • 5.2 外部 ACL 文件实现

前言

Redis 6.0+ 引入了 ACL 机制,类似 MySQL 一样全部权限管理,Redis 6.0 之前默认为 default 用户登录,该用户具备 root 权限,在生产中实际上是不安全的,因为只要具备 Redis 实例的密码,就可以以 root 身份对 Redis 进行操作。

因此 Redis 6.0+ 引入了 ACL 机制,ACL是使用 DSL(domain specific language)定义的,该 DSL 描述了给定用户能够执行的操作。那引用 ACL 的目的是什么呢?

  • 访问安全性:ACL 使不受信任的客户端无法访问,而受信任的客户端仅具有对数据库的最低访问级别才能执行所需的工作。
  • 操作安全性:以防止由于软件错误或人为错误而导致进程或人员访问 Redis,从而损坏数据或配置。例如,没有必要让其他人员从 Redis 调用 FLUSHALL 命令。

一、安装 Redis 服务

1、安装 Docker

2、安装 Redis

docker run -d --name=redis-server-6.0 -p 16379:6379 redis:6.0-alpine

3、登录验证

docker exec -it redis-server-6.0 redis-cli

Redis 6.0+ 的 ACL 机制

二、创建 ACL 用户

1、创建用户并设置明文密码

ACL SETUSER rab on >zhurs@123# '>'符号后是明文密码

Redis 6.0+ 的 ACL 机制

2、创建用户并设置 Hash 密码

  • 获取 Hash 值

    echo -n "zhurs@123" | shasum -a 256
    

    Redis 6.0+ 的 ACL 机制

    随机获取 Hash 值密码

    Redis 6.0+ 的 ACL 机制

  • 创建用户

    ACL SETUSER ops on #a9db6465cac424cb70a81fae6f42cd63b7e2292b45795ea88695e9da2baea040# '#'符号后是Hash值
    

    Redis 6.0+ 的 ACL 机制

3、查看所有用户

会发现,不管是明文还是Hash设置密码,Redis 最终存储都是以 Hash 值存储密码。

Redis 6.0+ 的 ACL 机制

这些用户是没有权限的,如果你要在创建用户时添加权限,你可以:

ACL SETUSER rab on >zhurs@123 ~* +@all# '~*' 表示该用户可以访问所有key
# '+@all' 表示拥有这些key的所有权   + 表示授权  - 表示销权

说明:

参数 说明
user 用户
default 用户名(default为默认用户)- - 也可是自定义用户(redis 6.0+)
on 是否启用该用户(on 启用,off 禁用)
#… 用户密码(#… 密文形式显示,oppass 表示无密码)
~* 用户可访问的 key(正则匹配 - - ~* 表示用户可访问所有 key)
+@ 用户权限,+ 代表授权,- 代表销权;@ 后为权限类型,+@all 表示用户对 redis 具备所有权限

4、查看指定用户信息

ACL GETUSER rab

Redis 6.0+ 的 ACL 机制

5、用户登录认证

# 6.0-
AUTH <密码>     # 这种方式的用户为default用户,相当于MySQL的root用户
# 6.0+
AUTH <用户> <密码>AUTH rab zhurs@123

Redis 6.0+ 的 ACL 机制

Windows 客户端工具登录:

Redis 6.0+ 的 ACL 机制

正常连接:

Redis 6.0+ 的 ACL 机制

三、用户密码管理

3.1 删除密码

1、通过 <! 删除用户密码

删除密码后,AUTH 无法登录,redis 客户端也无法连接,想要连接,需再次设置密码。

相当于是删除密码,而不是设置密码为,如果要设置密码为,可使用nopass来设置。

  • 明文密码

    ACL SETUSER rab <zhurs@123# '<' 符号之后是前面创建用户时设置的明文密码
    

    Redis 6.0+ 的 ACL 机制

  • Hash 密码

    ACL SETUSER ops !a9db6465cac424cb70a81fae6f42cd63b7e2292b45795ea88695e9da2baea040# '!' 符号之后是前面创建用户时设置的Hash密码
    

    Redis 6.0+ 的 ACL 机制

2、通过 nopass 删除用户密码

为了演示,再创建一个用户 test

ACL SETUSER test on >nba ~* +@all

注意:一个用户可设置多个密码:

ACL SETUSER test on >cba ~* +@all

Redis 6.0+ 的 ACL 机制

查看用户详细信息:

ACL GETUSER test

Redis 6.0+ 的 ACL 机制

开始设置 test 用户密码为

ACL SETUSER test nopass

Redis 6.0+ 的 ACL 机制

<#不同的是,该用户是可以登录的,因为密码是空,只需设置密码为空即可登录,如果不设置空密码,也是无法进行用户认证。

auth test      # 无法认证
auth test ''   # 可以认证(为空或填任意密码都不影响)

Redis 6.0+ 的 ACL 机制

redis 客户端测试验证:

密码处填不填不影响。

Redis 6.0+ 的 ACL 机制

连接验证:

Redis 6.0+ 的 ACL 机制

3.2 重置用户和密码

ACL SETUSER test reset

Redis 6.0+ 的 ACL 机制

重置后,该用户无法登录连接,可见 test 用户处于 off 禁用状态。

四、权限管理

4.1 key 管理

1、对 test 用户设置可操作的 key

ACL SETUSER test on >zhurs@123 ~foo* ~bar* +@all# test用户可管理foo、bar开头的key

Redis 6.0+ 的 ACL 机制

2、取消用户可操作的 key

通过 resetkeys 实现,此时只能操作 ob 开头的 key,~foo*、~bar* key 已经被 resetkeys 清空。

ACL SETUSER test on >zhurs@123 ~foo* ~bar* resetkeys ~ob* +@all

Redis 6.0+ 的 ACL 机制

3、操作所有 key

allkeys~* 效果一样

ACL SETUSER test on >zhurs@123 ~* +@all

Redis 6.0+ 的 ACL 机制

4.2 权限管理

1、权限类型

权限有很多,如下是 redis 所有的权限列表:

ACL CAT

Redis 6.0+ 的 ACL 机制

如查看某个权限的具体信息:

ACL CAT read

Redis 6.0+ 的 ACL 机制

2、权限设置

ACL SETUSER test on >zhurs@123 ~foo* ~bar* +@hash# test用户只有对hash类型的key有权限

Redis 6.0+ 的 ACL 机制

可见,取消了所有权限,仅限制为 hash 权限。其他权限就不一一举例了,各位可自行尝试。

五、ACL 用户存储

这里注意一下,以上的操作是通过 ACL 命令实现的,这些操作都只是临时存储与内存中,如果服务器或实例重启后,ACL 所设置的数据将会丢失。如下图你会发现,前面创建的 test 用户已经不见了。

Redis 6.0+ 的 ACL 机制

那 Redis 6.0+ 是如何存储创建的用户呢?官方给出了两种方法:直接将用户信息写入配置文件 redis.conf 中、指定外部 ACL 文件。

这两种方法是相互不兼容的,因此,我们只能选择其中任意一种,考虑到生产上的复杂环境问题,官方建议使用外部 ACL 文件方式。

5.1 配置文件实现

方法比较简单,直接在 redis.conf 配置文件中追加以下内容,如果有多个用户继续往下追加即可

user worker +@list +@connection ~jobs:* on >ffa9203c493aa99

Redis 6.0+ 的 ACL 机制

然后重启一下 redis 实例:

docker restart redis

登录验证:

是没问题的。

Redis 6.0+ 的 ACL 机制

5.2 外部 ACL 文件实现

因为不兼容,所以在做这个实验前先去掉配置文件中追加的 user work ... 内容,然后在配置文件中指定外部 ACL 文件路径:

找到配置文件 aclfile /etc/redis/users.acl 部分,并打开注释。

我自定义的配置文件路径为:/data/users.acl

Redis 6.0+ 的 ACL 机制

手动创建 users.acl 文件:

vim users.acl# 文件加入下面内容
user root +@all ~* on >zhurs@123
user dev +@list +@connection ~jobs:* on >ffa9203c493aa99
user ops +@list +@connection ~jobs:* on >kka2023addwedw4

重启 Redis 实例:

docker restart redis

登录查看:

Redis 6.0+ 的 ACL 机制

此时redis.conf 配置文件中定义的密码已经失效,因此这就导致原本的 default 用户又可以无密码登录了,所以我们需要禁用 default 用户:

ACL SETUSER default reset

Redis 6.0+ 的 ACL 机制

哨兵和副本的 ACL 规则可查看官方文档。

参考:官方文档

水族观赏鱼