ACL安全策略
一、ACL两种配置方式
二、conf文件模式
在Redis 6.0之前,Redis只有一个default用户也是Redis中的超级管理员用户,如果要将其设置密码,需要修改Redis配置文件,具体修改如下:
1、修改配置文件
2、重启Redis
3、未登录测试
4、使用密码登陆
方法一:不推荐
方法二:
5、将当前配置写入配置文件
6、查看default用户的ACL是否生成
三、外部ACL模式
我们可以直接在config配置文件中使用上面default用户ACL这行DSL命令设置用户权限,或者我们也可以配置外部aclfile配置权限。配置aclfile需要先将config中配置的DSL注释或删除,因为Redis不允许两种ACL管理方式同时使用,否则在启动redis的时候会报下面的错误
1、开启ACL模式
1.注释配置文件中已授权的ACL命令
2.注释requirepass
在config文件中注释default用户的密码,因为开启aclfile之后,requirepass的密码就失效了
3.配置aclfile路径
创建aclfile文件路径,然后在config文件中配置aclfile的路径
4.重启redis
5.登录测试
由于配置文件的修改,现在是无密码状态
2、对比conf和aclfile模式
1.登录方式不同
2.重载及持久化方式不同
在redis.conf和aclfile模式中配置DSL 官方更推荐使用aclfile,因为如果在redis,conf中配置了权限之后需要重启redis服务才能将配置的权限加载至redis服务中来,但如果使用aclfile模式,可以调用acl load命令将aclfile中配置的ACL权限热加载进环境中,类似于Mysql中的flush privileges。
redis.conf | users.acl | |
---|---|---|
配置方式 | DSL | DSL |
加载ACL配置 | 重启Redis服务 | ACL LOAD命令 |
持久化ACL配置 | CONFIG REWRITE命令 | ACL SAVE命令 |
3、ACL命令行使用
1.ACL规则
ACL是使用DSL(Domain specific language)定义的,该DSL描述了用户能够执行的操作。该规则始终从上到下,从左到右应用,因为规则的顺序对于理解用户的实际权限很重要。ACL规则可以在redis.conf文件以及users.acl文件中配置DSL,也可以在命令行中通过ACL命令配置。
2.创建用户
3.用户的启用和禁用
on:启用用户:可以以该用户身份进行认证。
off:禁用用户:不再可以使用此用户进行身份验证,但是已经通过身份验证的连接仍然可以使用。
4.为用户设置密码
命令 | 解释 |
---|---|
> |
将此密码添加到用户的有效密码列表中。例如,>mypass将“mypass”添加到有效密码列表中。该命令会清除用户的nopass标记。每个用户可以有任意数量的有效密码。 |
< |
从有效密码列表中删除此密码。若该用户的有效密码列表中没有此密码则会返回错误信息。 |
# |
将此SHA-256哈希值添加到用户的有效密码列表中。该哈希值将与为ACL用户输入的密码的哈希值进行比较。允许用户将哈希存储在users.acl文件中,而不是存储明文密码。仅接受SHA-256哈希值,因为密码哈希必须为64个字符且小写的十六进制字符。 |
! |
从有效密码列表中删除该哈希值。当不知道哈希值对应的明文是什么时很有用。 |
nopass | 移除该用户已设置的所有密码,并将该用户标记为nopass无密码状态:任何密码都可以登录。resetpass命令可以清除nopass这种状态。 |
resetpass | 情况该用户的所有密码列表。而且移除nopass状态。resetpass之后用户没有关联的密码同时也无法使用无密码登录,因此resetpass之后必须添加密码或改为nopass状态才能正常登录。 |
reset | 重置用户状态为初始状态。执行以下操作resetpass,resetkeys,off,-@all。 |
验证
6.权限设置
1)命令调用权限
*命令* | *解释* |
---|---|
+ |
将命令添加到用户可以调用的命令列表中。 |
– |
将命令从用户可以调用的命令列表中移除。 |
+@ |
允许用户调用 |
-@ |
禁止用户调用 |
+ |
允许使用已禁用命令的特定子命令。 |
allcommands | +@all的别名。包括当前存在的命令以及将来通过模块加载的所有命令。 |
nocommands | -@all的别名,禁止调用所有命令。 |
2)key的访问权限
命令 | 解释 |
---|---|
~ |
添加可以在命令中提及的键模式。例如~和 allkeys 允许所有键。 |
* resetkeys | 使用当前模式覆盖所有允许的模式。如: ~foo: ~bar: resetkeys ~objects: ,客户端只能访问匹配 object: 模式的 KEY。 |