六、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命令切换用户