redis用户权限管理 - ACL详解第一篇

由于redis的ACL内容较多,故一共分为三篇博客

redis用户权限管理 - ACL详解第一篇_YZF_Kevin的博客-CSDN博客

redis用户权限管理 - ACL详解第二篇_YZF_Kevin的博客-CSDN博客

redis用户权限管理 - ACL详解第三篇_YZF_Kevin的博客-CSDN博客

简言

redis在6.0之前基本没有用户权限的概念,只有一个连接认证密码,一旦通过了认证就可以随意操作任意的redis数据,无法对用户权限进行精确控制,很容易因为用户权限过大引发误操作。如果想禁用某些不安全的命令,比如flushdb,flushall,只能通过rename-command的方式来避免

redis6.0发布了权限管理功能ACL(access control list 访问控制列表),可以对不同的用户设置不同的权限,限制用户可使用的命令,可访问的key

目录

1. ACL LIST 查看所有的用户权限列表

2. ACL SETUSER 创建/设置指定用户的权限

3. ACL设置密码/取消密码

4. ACL DELUSER 删除指定用户

5. ACL WHOAMI 查看当前使用的用户

6. ACL GETUSER 获取指定用户的详细权限信息

详细

1. ACL LIST 查看所有的用户权限列表

默认情况下,没有开启认证密码时,redis中默认有一个default的用户,如下图所示

127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"

default 表用户名,兼容以前的AUTH命令,如果执行AUTH命令时不写用户名,redis认为是在认证这个default用户

on 表已启用该用户,off表禁用

nopass 表没有密码

~* 表可访问全部的数据Key(正则匹配)

+@all 表示用户的权限, "+"添加权限;"-"删减权限;@为redis命令分类; 可以通过 ACL CAT 查询相关分类,all表全部的命令集合,最终 +@all 表示拥有所有命令集合的所有权限

2.  ACL SETUSER 创建/设置指定用户的权限

127.0.0.1:6379> ACL SETUSER TEST
OK
127.0.0.1:6379> ACL LIST
1) "user TEST off resetchannels -@all"
2) "user default on nopass ~* &* +@all"

执行ACL SETUSER TEST 可以添加一个用户TEST,语句执行成功后再次ACL LIST可以看到已经创建了TEST用户,但是这个用户目前为不可用状态(off),没有密码(虽然没有nopass标记),并且没有任何权限(-@all)

此时TEST用户没有密码,在另一个redis连接上执行 AUTH TEST进行该用户的认证,结果如下

127.0.0.1:6379> AUTH TEST
(error) ERR AUTH called without any password configured for the default user. Are you sure your configuration is correct?

意思是使用AUTH命令需带密码,如果没有指明用户,则redis认为是在认证default用户。所以现在是认为你在认证默认的default用户,而且密码错误了

我们指定认证TEST用户,再加上密码,结果如下

127.0.0.1:6379> AUTH TEST 123456
(error) WRONGPASS invalid username-password pair or user is disabled.

可以看到现在redis提示密码错误或者用户已被禁用,这也是上面的“user TEST off resetchannels -@all”中off导致的,即off表用户处于不可用状态

启用用户的格式: ACL SETUSER 用户名 on

127.0.0.1:6379> ACL SETUSER TEST on
OK
127.0.0.1:6379> 
127.0.0.1:6379> ACL LIST
1) "user TEST on resetchannels -@all"
2) "user default on nopass ~* &* +@all"

启用用户后,可以看到TEST用户已经为on标记了,但由于没有密码,此时仍然不可以认证登陆TEST

禁用用户的格式: ACL SETUSER 用户名 off

127.0.0.1:6379> ACL SETUSER TEST off
OK
127.0.0.1:6379> ACL LIST
1) "user TEST off resetchannels -@all"
2) "user default on nopass ~* &* +@all"

3. ACL设置密码/取消密码

现在我们为用户TEST设置密码,设置为123456,注意格式,密码前面有个>符号

127.0.0.1:6379> ACL SETUSER TEST >123456
OK
127.0.0.1:6379> 
127.0.0.1:6379> ACL LIST
1) "user TEST off #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 resetchannels -@all"
2) "user default on nopass ~* &* +@all"

设置密码后再次运行ACL LIST可以看到,原来的密码部分,已经被替换成了一个以#开头,64位的字符串,这就是redis对密码加密后结果

下面我们再取消密码,格式: ACL SETUSER 用户名 <旧密码

127.0.0.1:6379> ACL SETUSER TEST <12345
(error) ERR Error in ACL SETUSER modifier '<12345': The password you are trying to remove from the user does not exist
127.0.0.1:6379> 
127.0.0.1:6379> ACL SETUSER TEST <123456
OK
127.0.0.1:6379> 
127.0.0.1:6379> ACL LIST
1) "user TEST off resetchannels -@all"
2) "user default on nopass ~* &* +@all"

第一次取消密码时,用的密码是错的,redis会提示你使用的密码错误

第二次取消密码成功了,再次用 ACL LIST 命令查看,可以看到密码部分已经没了

4. ACL DELUSER 删除指定用户

127.0.0.1:6379> ACL DELUSER TEST
(integer) 1
127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"

删除TEST后可以看到,只剩下最初的default用户了

注意为了防止误操作,这个default用户是不能删除的,强行删除时会有以下报错

127.0.0.1:6379> ACL DELUSER default
(error) ERR The 'default' user cannot be removed

需要注意的是删除某个用户是立即生效的,如果这个用户当时已经连接redis,连接不会立即断开,但是只要一执行redis命令,就会被redis服务器断开连接,如下图

5. ACL WHOAMI 查看当前使用的用户

127.0.0.1:6379> ACL LIST
1) "user TEST on #481f6cc0511143ccdd7e2d1b1b94faf0a700a8b49cd13922a70b5ae28acaa8c5 resetchannels -@all"
2) "user default on nopass ~* &* +@all -get"
127.0.0.1:6379> ACL WHOAMI
"default"

可以看到,当前使用的是default用户

6. ACL GETUSER 获取指定用户的详细权限信息

127.0.0.1:6379> ACL LIST
1) "user TEST on #481f6cc0511143ccdd7e2d1b1b94faf0a700a8b49cd13922a70b5ae28acaa8c5 resetchannels -@all"
2) "user default on nopass ~* &* +@all"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> ACL GETUSER TEST
 1) "flags"
 2) 1) "on"
 3) "passwords"
 4) 1) "481f6cc0511143ccdd7e2d1b1b94faf0a700a8b49cd13922a70b5ae28acaa8c5"
 5) "commands"
 6) "-@all"
 7) "keys"
 8) ""
 9) "channels"
10) ""
11) "selectors"
12) (empty array)

可以看到,ACL GETUSER 和 ACL LIST基本差不多,只是前者是获取单个用户的信息,显示结果也更清晰,逐个字段地解释

以上面为例

flags 字段的值为 on   表已启用

passwords 字段的值为 481f6cc0511143ccdd7e2d1b1b94faf0a700a8b49cd13922a70b5ae28acaa8c5   表加密后的密码

commands 字段的值为 -@all   表没有任何命令集合的权限

keys 字段的值为 空    表没有任何key的操作权限

channels 字段的值为 空

selectors 字段的值为 空

你可能感兴趣的:(redis,redis权限,redisACL,redis的ACL,redis之ACL详解)