赞
踩
目录
Redis在6.0之前基本没有用户权限的概念,只有一个连接认证密码,一旦通过了认证就可以随意操作任意的redis数据,无法对用户权限进行精确控制,很容易因为用户权限过大引发误操作。如果想禁用某些不安全的命令,比如flushdb,flushall,只能通过rename-command的方式来避免。
redis6.0发布了权限管理功能ACL(access control list 访问控制列表),可以对不同的用户设置不同的权限,限制用户可使用的命令,可访问的key等。
- [root@localhost bin]# ./redis-cli
- 127.0.0.1:6379> acl list
- 1) "user default on nopass ~* &* +@all"
default 表示用户名,兼容以前的AUTH命令,如果执行AUTH命令时不写用户名,redis认为是在认证这个default用户
on 表示已启用该用户,off表禁用
nopass 表示没有密码
~* 表示可访问全部的数据Key(正则匹配)
&* 表示允许用户访问所有Pub/Sub频道(正则匹配)。
+@all 表示用户的权限, "+"添加权限;"-"删减权限;@为redis命令分类; 可以通过 ACL CAT 查询相关分类,all表全部的命令集合,最终 +@all 表示拥有所有命令集合的所有权限。
或者使用acl users查看,内容很简洁,只展示了用户名
- 127.0.0.1:6379> acl users
- 1) "default"
ACL WHOAMI 查看当前使用的用户
- 127.0.0.1:6379> ACL WHOAMI
- "default"
ACL GETUSER 获取指定用户的详细权限信息
- 127.0.0.1:6379> ACL GETUSER default
- 1) "flags"
- 2) 1) "on"
- 2) "allkeys"
- 3) "allchannels"
- 4) "allcommands"
- 5) "nopass"
- 3) "passwords"
- 4) (empty array)
- 5) "commands"
- 6) "+@all"
- 7) "keys"
- 8) 1) "*"
- 9) "channels"
- 10) 1) "*"
- 127.0.0.1:6379> ACL SETUSER user
- OK
- 127.0.0.1:6379> acl list
- 1) "user default on nopass ~* &* +@all"
- 2) "user user off &* -@all
这样创建的用户是不可用状态(off),没有密码(虽然没有nopass标记),并且没有任何权限(-@all)的
启用用户:
- 127.0.0.1:6379> ACL SETUSER user on
- OK
- 127.0.0.1:6379> acl list
- 1) "user default on nopass ~* &* +@all"
- 2) "user user on &* -@all"
禁用用户则为 ACL SETUSER 用户名 off
- 127.0.0.1:6379> ACL SETUSER user >111111
- OK
- 127.0.0.1:6379> acl list
- 1) "user default on nopass ~* &* +@all"
- 2) "user user on #bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a &* -@all"
取消密码 acl setuser 用户名 <111111
- 127.0.0.1:6379> ACL DELUSER user
- (integer) 1
- 127.0.0.1:6379> acl list
- 1) "user default on nopass ~* &* +@all"
使用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"
redis目前把所有的命令一共归类了21个集合,我们可以很方便地对某个用户添加/删除某个命令集合的权限。
需要注意的是,同一个命令有可能属于多个不同的命令集合,多个集合之间存在交集,比如get命令既属于命令集合string,也属于命令集合fast
ACL CAT xxxx 查看指定命令集合的所有子命令
- 127.0.0.1:6379> acl cat string
- 1) "msetnx"
- 2) "setrange"
- 3) "strlen"
- 4) "getrange"
- 5) "setnx"
- 6) "getset"
- 7) "getdel"
- 8) "setex"
- 9) "mget"
- 10) "decrby"
- 11) "stralgo"
- 12) "get"
- 13) "append"
- 14) "mset"
- 15) "decr"
- 16) "psetex"
- 17) "substr"
- 18) "incrbyfloat"
- 19) "getex"
- 20) "set"
- 21) "incr"
- 22) "incrby"
先给用户user设置密码111111,再启用,确保user用户可以进行登陆
- 127.0.0.1:6379> ACL SETUSER user on >111111
- OK
- 127.0.0.1:6379> acl list
- 1) "user default on nopass ~* &* +@all"
- 2) "user user on #bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a &* -@all"
另起一个客户端连接,
- [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 run the 'get' command or its subcomman
可以看到,用户没有权限运行get命令;我们知道这个get是string类型数据的命令,我们来给user添加string类型数据的所有权限,多个类型命令用空格隔开:
- 127.0.0.1:6379> ACL SETUSER user ~* +@string
- OK
- 127.0.0.1:6379> acl list
- 1) "user default on nopass ~* &* +@all"
- 2) "user user on #bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a ~* &* -@all +@string"
~* 表示key的范围是全部key,+@string 表示添加string类型的所有命令
重开一个客户端测试:
- [root@localhost bin]# ./redis-cli
- 127.0.0.1:6379> auth user 111111
- OK
- 127.0.0.1:6379> set name cjian
- OK
- 127.0.0.1:6379> get name
- "cjian"
ACL SETUSER 用户名 -@命令集合名 给指定用户删除指定命令集合的权限
多个命令集合用空格隔开
上面user用户可以执行string的set命令的,我们来将这个权限去掉
- 127.0.0.1:6379> ACL SETUSER user -set
- OK
- 127.0.0.1:6379> acl list
- 1) "user default on nopass ~* &* +@all"
- 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)
上面的这些设置都是保存在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
如果已经有了acl配置文件,想直接加载到redis中生效,也很简单,首先在redis配置文件中设置ACL配置文件全路径名,然后在redis终端上运行命令 ACL LOAD 命令即可
我们接着第一步的操作,先删除刚才添加的用户user,再次从ACL配置文件中加载,如下
- 127.0.0.1:6379> ACL DELUSER user
- (integer) 1
- 127.0.0.1:6379> acl list
- 1) "user default on nopass ~* &* +@all"
- 127.0.0.1:6379> acl load
- OK
- 127.0.0.1:6379> acl list
- 1) "user default on nopass sanitize-payload ~* &* +@all"
- 2) "user user on #bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a ~testget:* &* -@all +@string +hset +hlen +ttl -set"
该命令在7及以上版本才支持
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。