redis6新出特性ACL(access control list 访问控制列表),类似MySQL中的用户授权特性,本篇ACL特性是基于外部aclfile模式,安装过程简单,docker或者编译安装亦可,以下是目前比较稳定的redis6下载地址。
https://download.redis.io/releases/redis-6.2.1.tar.gz
1、修改配置文件,开启alcfile
vim redis.conf
868 #aclfile /etc/redis/users.acl #去掉前面的注释即可
如下:
说明:配置文件中有这样的解释:The requirepass is not compatable with aclfile option and the ACL LOAD command, these will cause requirepass to be ignored
意思就是requirepass与aclfile选项和ACL LOAD命令不兼容,密码认证失效,所以默认用户登录不需要认证的。
2、创建文件目录及文件
文件是需要存在的,我们新建空白文件即可:
mkdir /etc/redis
cd /etc/redis
touch users.acl
3、命令详解
1、acl list 查看当前的acl
127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"
说明:其中user表示关键词用户,default表示用户名,on表示用户状态,nopass表示无密码, ~* 表示匹配所有key,+@all表示所有权限
2、acl users 查看所有用户名
127.0.0.1:6379> ACL USERS
1) "default"
3、acl whoami 查看当前用户
127.0.0.1:6379> ACL WHOAMI
"default"
4、acl cat 返回命令类别
127.0.0.1:6379> ACL CAT
1) "keyspace"
2) "read"
3) "write"
4) "set"
5) "sortedset"
6) "list"
7) "hash"
8) "string"
9) "bitmap"
10) "hyperloglog"
11) "geo"
12) "stream"
13) "pubsub"
14) "admin"
15) "fast"
16) "slow"
17) "blocking"
18) "dangerous"
19) "connection"
20) "transaction"
21) "scripting"
5、acl cat <category> 返回命令类别下的所有命令,以set为例
127.0.0.1:6379> ACL CAT set
1) "sdiffstore"
2) "sismember"
3) "scard"
4) "sadd"
5) "smembers"
6) "sinter"
7) "sdiff"
8) "spop"
9) "sinterstore"
10) "smove"
11) "sunion"
12) "sscan"
13) "srandmember"
14) "smismember"
15) "sort"
16) "srem"
17) "sunionstore"
6、acl setuser 创建用户,若用户已存在,即为修改用户属性
127.0.0.1:6379> ACL SETUSER mike
OK
127.0.0.1:6379> ACL SETUSER Mike
OK
127.0.0.1:6379> ACL USERS
1) "Mike"
2) "default"
3) "mike"
说明:
ACL SETUSER <username>
用户不存在,则按默认规则创建用户。若用户存在则该命令不做任何操作。
ACL SETUSER <username> <rules>
若用户不存在,则按默认规则创建用户,并为其增加rules若用户存在则在已有规则上增加rules。
默认规则下新增的用户处于非活跃状态,且没有密码,同时也没有任何命令和key的权限,用户名区分大小写。
7、alc setuser 授权
127.0.0.1:6379> ACL SETUSER mike on >123456 ~name* +get +set
OK
on为活跃状态,密码为123456,允许对所有name开头的key使用get和set命令
127.0.0.1:6379> ACL SETUSER mike on >666666
OK
为mike用户新增一个可用密码666666
8、alc deluser 删除用户
127.0.0.1:6379> ACL USERS
1) "Mike"
2) "default"
3) "mike"
127.0.0.1:6379> ACL DELUSER Mike
(integer) 1
127.0.0.1:6379> ACL USERS
1) "default"
2) "mike"
9、acl save 将acl权限持久化到aclfile中
127.0.0.1:6379> ACL SAVE
OK
cat /etc/redis/users.acl #查看文件中的规则
10、acl load 将aclfile中的权限加载至redis服务中
vim /etc/redis/users.acl
#添加以下内容,然后保存退出
user jone on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~name* &* -@all +set +get
127.0.0.1:6379> ACL USERS
1) "default"
2) "mike"
127.0.0.1:6379> ACL LOAD
OK
127.0.0.1:6379> ACL USERS
1) "default"
2) "jone"
3) "mike"
11、acl log 查看ACL安全日志
12、auth <username> <password> 认证用户,也可作切换用户
127.0.0.1:6379> AUTH mike 123456
OK
127.0.0.1:6379> set name haha
OK
127.0.0.1:6379> get name
"haha"
127.0.0.1:6379> set age 14
(error) NOPERM this user has no permissions to access one of the keys used as arguments
总结:redis6的ACL新特性,将redist的权限进行细化,具体化,操作更安全。