Redis在6.0之前基本没有效户权限的概念,只有一个连接认证密码,一旦通过了认证就可以随意操作任意的redis数据,无法对用户权限举行精确控制,很容易由于用户权限过大引发误操作。如果想禁用某些不安全的命令,比如flushdb,flushall,只能通过rename-command的方式来避免。
redis6.0发布了权限管理功能ACL(access control list 访问控制列表),可以对不同的用户设置不同的权限,限制用户可使用的命令,可访问的key等。
一、acl基本操作
2) "user user on #bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a ~* &* -@all +@string -set"
复制代码
重开一个客户端测试:
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> auth user 111111
OK
127.0.0.1:6379> set name haha
(error) NOPERM this user has no permissions to run the 'set' command or its subcommand
127.0.0.1:6379> get name
"1"
复制代码
多个的环境:
127.0.0.1:6379> ACL SETUSER user +ttl +hset +hlen
OK
127.0.0.1:6379> acl list
1) "user default on nopass ~* &* +@all"
2) "user user on #bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a ~* &* -@all +@string +hset +hlen +ttl -set
复制代码
前面讲的+@xxx,-@xxx, +xxx, -xxx 讲的是增长删除命令集合的权限,增长删除子命令的权限,这些权限的key范围都是~*,也就是全部的key。这个时间依然不安全,由于有些时间为了防止泄密,我们只想让用户拥有个别key的操作权限,此时不但要限制用户可用的命令集合或子命令,还要限制key的范围,比如我们想让用户 user 只对以 testget: 开头的这些 key 有权限,可以像下面如许设置:
127.0.0.1:6379> ACL SETUSER user resetkeys ~testget:*
OK
127.0.0.1:6379> acl lsit
1) "user default on nopass ~* &* +@all"
2) "user user on #bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a ~testget:* &* -@all +@string +hset +hlen +ttl -set"
复制代码
重开一个客户端测试:
[root@localhost bin]# ./redis-cli
127.0.0.1:6379> auth user 111111
OK
127.0.0.1:6379> get name
(error) NOPERM this user has no permissions to access one of the keys used as arguments
127.0.0.1:6379> get testget:1
(nil)
复制代码
三、ACL的长期化
3.1、长期化ACL配置
上面的这些设置都是生存在redis内存中,一旦redis重启,这些设置就会全部失效,要想长期化必须生存成文件,redis的ACL已经为我们提供了这些功能。
如果想长期化生存ACL配置,也就是把ACL相关权限设置都生存到文件中,分为两个步骤
① 在redis配置文件中设置要导出的ACL配置文件全路径名,如下,注意ACL的配置文件名必须以.acl结尾:
aclfile /home/redis6/users.acl
# 牢记,这里肯定要保证该文件已存在,可以使用 touch /home/redis6/users.acl 来创建文件
② 实行 acl save
127.0.0.1:6379> ACL SAVE
OK
复制代码
查看该文件,可以发现和acl list看到的内容一致:
[root@localhost redis6]# cat users.acl
user default on nopass ~* &* +@all
user user on #bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a ~testget:* &* -@all +@string +hset +hlen +ttl -set