六、redis6 ACL(Access Control List)访问控制权限

介绍:

在Redis6之前的版本,我们只能使用requirepass参数给default用户配置登录密码,同一个redis集群的所有开发都共享default用户,难免会出现误操作把别人的key删掉或者数据泄露的情况,那之前我们也可以使用rename command的方式给一些危险函数重命名或禁用,但是这样也防止不了自己的key被其他人访问。

因此Redis6版本推出了ACL(Access Control List)访问控制权限的功能,基于此功能,我们可以设置多个用户,并且给每个用户单独设置命令权限和数据权限。 为了保证向下兼容,Redis6保留了default用户和使用requirepass的方式给default用户设置密码,默认情况下default用户拥有Redis最大权限,我们使用redis-cli连接时如果没有指定用户名,用户也是默认default。鼓掌!

我们可以在配置文件中或者命令行中设置ACL,如果使用配置config文件的话需要重启服务,使用配置aclfile文件或者命令行授权的话无需重启Redis服务但需要及时将权限持久化到磁盘,否则下次重启的时候无法恢复该权限。
概述

配置文件模式:

配置ACL的方式有两种,一种是在config文件中直接配置,另一种是在外部aclfile中配置。配置的命令是一样的,但是两种方式只能选择其中一种,我们之前使用requirepass给default用户设置密码 默认就是使用config的方式,执行config rewrite重写配置后会自动在config文件最下面新增一行记录配置default的密码和权限

conf文件模式:

使用redis.conf文件配置default和其他用户的ACL权限:

1.在config文件中配置default用户的密码
requirepass  wang!321

2.在config文件中添加DSL命令配置用户ACL权限

3.在config文件中注释aclfile的路径配置(默认注释)
# aclfile /etc/redis/users.acl

4.重启redis服务
systemctl restart redis
步骤

在config文件中配置requirepass,默认是给default用户创建密码

重启后进入命令行执行config rewrite写入配置

 127.0.0.1:6379> config rewrite

因此我们可以直接在config配置文件中使用上面default用户ACL这行DSL命令设置用户权限,或者我们也可以配置外部aclfile配置权限。

配置aclfile需要先将config中配置的DSL注释或删除,因为Redis不允许两种ACL管理方式同时使用,否则在启动redis的时候会报错误

 

外部ACLFILE模式:

使用外部aclfile文件配置Default和其他用户的ACL权限:

1.注释redis.conf中所有已授权的ACL命令,如:
#user  default  on  #8d23545asfwefew22  ~*  +@all

2.在config文件中注释default用户的密码,因为开启aclfile之后,requirepass的密码就失效了
redis.conf
#requirepass wang!321

3.在config文件中配置aclfile的路径,然后创建改文件,否则重启redis会报找到该文件
aclfile /etc/redis/users.acl

touch /etc/redis/users.acl

4.在外部aclfile文件中添加DSL命令配置用户ACL权限,如
user  default  on  #8d23545asfwefew22  ~*  +@all

5.重启redis 或使用 aclfile load命令加载权限
systemctl restart redis
或在命令行执行:aclflie load
步骤

开启aclfile之后不再推荐在redis.conf文件中通过requirepass配置default的密码,因为它不再生效,同时开启aclfile之后也不能使用redis-cli -a xxx登陆,必须使用redis-cli --user xxx  --pass yyy来登陆:

 

对比conf和aclfile模式:

在redis.conf和aclfile模式中配置DSL 官方更推荐使用aclfile,因为如果在redis,conf中配置了权限之后需要重启redis服务才能将配置的权限加载至redis服务中来,但如果使用aclfile模式,可以调用acl load命令将aclfile中配置的ACL权限热加载进环境中,类似于Mysql中的flush privileges。

  redis.conf user.acl
配置方式 DSL DSL
加载ACL配置 重启redis acl load命令
持久化ACL配置 config rewrite命令 acl save命令

 

命令行模式

介绍

在配置文件中配置的ACL权限,需要执行ACL LOAD或者重启Redis服务才能生效

在命令行下配置ACL,在命令行模式下配置的权限无需重启服务即可生效。我们也可以在命令行模式下配置ACL并将其持久化到aclfile或者config文件中(这取决于配置文件中选择的是config模式还是外部aclfile模式),一旦将权限持久化到aclfile或cofig文件中,下次重启就会自动加载该权限,如果忘记持久化,一旦服务宕机或重启,该权限就会丢失。

持久化config模式:config rewrite

持久化aclfile模式:acl save

 

ACL规则:ACL规则可以在redis.conf文件以及users.acl文件中配置DSL,也可以在命令行中通过ACL命令配置。

启用和禁用用户

on:启用用户:可以以该用户身份进行认证。

off:禁用用户:不再可以使用此用户进行身份验证,但是已经通过身份验证的连接仍然可以使用

允许和禁止调用命令

+<command>:将命令添加到用户可以调用的命令列表中。
-<command>:将命令从用户可以调用的命令列表中移除。
+@<category>:允许用户调用 <category> 类别中的所有命令,有效类别为@admin,@set,@sortedset等,可通过调用ACL CAT命令查看完整列表。特殊类别@all表示所有命令,包括当前和未来版本中存在的所有命令。
-@<category>:禁止用户调用<category> 类别中的所有命令。
+<command>|subcommand:允许使用已禁用命令的特定子命令。
allcommands:+@all的别名。包括当前存在的命令以及将来通过模块加载的所有命令。
nocommands:-@all的别名,禁止调用所有命令。

允许或禁止访问某些Key
~<pattern>:添加可以在命令中提及的键模式。例如~*和* allkeys 允许所有键。
* resetkeys:使用当前模式覆盖所有允许的模式。如: ~foo:* ~bar:* resetkeys ~objects:* ,客户端只能访问匹配 object:* 模式的 KEY。
为用户配置有效密码
><password>:将此密码添加到用户的有效密码列表中。例如,>mypass将“mypass”添加到有效密码列表中。该命令会清除用户的nopass标记。每个用户可以有任意数量的有效密码。
<<password>:从有效密码列表中删除此密码。若该用户的有效密码列表中没有此密码则会返回错误信息。
#<hash>:将此SHA-256哈希值添加到用户的有效密码列表中。该哈希值将与为ACL用户输入的密码的哈希值进行比较。允许用户将哈希存储在users.acl文件中,而不是存储明文密码。仅接受SHA-256哈希值,因为密码哈希必须为64个字符且小写的十六进制字符。
!<hash>:从有效密码列表中删除该哈希值。当不知道哈希值对应的明文是什么时很有用。
nopass:移除该用户已设置的所有密码,并将该用户标记为nopass无密码状态:任何密码都可以登录。resetpass命令可以清除nopass这种状态。
resetpass:情况该用户的所有密码列表。而且移除nopass状态。resetpass之后用户没有关联的密码同时也无法使用无密码登录,因此resetpass之后必须添加密码或改为nopass状态才能正常登录。
reset:重置用户状态为初始状态。执行以下操作resetpass,resetkeys,off,-@all。

 

常用命令:

127.0.0.1::6379> acl help          #帮助文档

127.0.0.1::6379> acl list          #查看当前活动的ACL,默认情况下,有一个“default”用户 

127.0.0.1::6379> acl users          #返回所有用户名

127.0.0.1::6379> acl whoami        #返回所有用户名

127.0.0.1::6379> acl cat          #查看命令类别,用于授权

127.0.0.1::6379> acl cat list          #显示所有指定类别下的所有命令

127.0.0.1::6379> acl setuser        #创建或修改用户属性,username区分大小写

127.0.0.1::6379> acl getuser        #查看用户的ACL权限

127.0.0.1::6379> acl deluser        #删除指定的用户

127.0.0.1::6379> acl save        #持久化

127.0.0.1::6379> acl load         #加载aclfile中的权限

127.0.0.1::6379> acl genpass         #随机返回sha256密码,我们可以直接使用该密文配置ACL密码

127.0.0.1::6379> acl genpass 64         #随机返回sha256密码,我们可以直接使用该密文配置ACL密码

127.0.0.1::6379> acl log        #查看ACL安全日志

127.0.0.1::6379> auth <username> <password>        #auth命令切换用户

 

posted on 2022-03-03 23:01  NG-承  阅读(387)  评论(0编辑  收藏  举报

导航