redis用户权限管理 - ACL详解第二篇

 由于redis的ACL内容较多,故一共分为三篇博客

redis用户权限管理 - ACL详解第一篇_YZF_Kevin的博客-CSDN博客

redis用户权限管理 - ACL详解第二篇_YZF_Kevin的博客-CSDN博客

redis用户权限管理 - ACL详解第三篇_YZF_Kevin的博客-CSDN博客

简言

 上一篇博客 redis用户权限管理 - ACL详解第一篇_YZF_Kevin的博客-CSDN博客

主要讲解了redis的ACL的由来,用户的增,删,改,查,设置删除密码等

这篇博客开始详细讲解redis用户的权限操作以及示例,最后再来一个复杂例子,多重权限叠加时该怎么设置

目录

1. ACL CAT 查看所有的命令集合

2. ACL CAT 命令集合名 查看指定命令集合的所有子命令

3. ACL SETUSER 用户名 +@命令集合名    给指定用户增加指定命令集合的权限

4. ACL SETUSER 用户名 -@命令集合名    给指定用户删除指定命令集合的权限

5. ACL SETUSER 用户名 +子命令 增加子命令的权限,ACL SETUSER 用户名 -子命令 删除子命令的权限

6. 多个复杂权限叠加的示例

详细

首先我们要知道的是,redis的ACL为了细化命令权限的管理,对所有的redis命令进行了分类归纳

比如string类型相关的命令都归到命令集合string中,例如get, set, incr, setnx, incrby等

比如hash类型的相关命令都归到命令集合hash中,例如hset, hget, hdel, hlen, hscan等

比如有些全局操作,比较危险的命令都归到命令集合dangerous中,例如sync, flushall, flushdb, shutdown等

比如管理相关的权限都归到命令集合admin中,比如shutdown,save,集群cluster相关,本博客讲的ACL等

1. 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

2. ACL CAT xxxx 查看指定命令集合的所有子命令

127.0.0.1:6379> ACL CAT hash
 1) "hvals"
 2) "hrandfield"
 3) "hscan"
 4) "hget"
 5) "hmset"
 6) "hdel"
 7) "hstrlen"
 8) "hexists"
 9) "hincrbyfloat"
10) "hmget"
11) "hsetnx"
12) "hkeys"
13) "hgetall"
14) "hset"
15) "hlen"
16) "hincrby"

上面是查看命令集合hash的所有子命令,你可以看下其他的命令集合,这里就不再一一列举出来了

3. ACL SETUSER 用户名 +@命令集合名    给指定用户增加指定命令集合的权限

先给用户TEST设置密码123456,再启用,确保TEST用户可以进行登陆

127.0.0.1:6379> ACL SETUSER TEST >123456
OK
127.0.0.1:6379> ACL SETUSER TEST on
OK
127.0.0.1:6379> ACL LIST
1) "user TEST on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 resetchannels -@all"
2) "user default on nopass ~* &* +@all"

另起一个redis连接,登陆用户TEST,然后操作key,如下图

127.0.0.1:6379> AUTH TEST 123456
OK
127.0.0.1:6379> get name
(error) NOPERM this user has no permissions to run the 'get' command

上面我们运行命令了 get name ,redis提示用户没有权限运行get命令

get子命令属于命令集合string,我们给玩家添加集合string的权限即可,操作如下

127.0.0.1:6379> ACL SETUSER TEST resetkeys ~* +@string
OK
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> set name test123
OK
127.0.0.1:6379> get name
"test123"
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> ACL LIST
1) "user TEST on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* resetchannels -@all +@string"
2) "user default on nopass ~* &* +@all"

特别注意第一行命令    ACL SETUSER TEST resetkeys ~* +@string

意思是给用户TEST添加命令集合string的权限;key的范围是~*,正则表达式,表全部key;resetkeys表重置key的范围,后面可以看到,再操作get name, set name都正常了

后面再次运行ACL LIST,可以看到用户TEST的权限

~*          表key的范围是全部key

-@all    表没有任何命令集合的权限,但是后面的+@string表有命令集合string的权限

4. ACL SETUSER 用户名 -@命令集合名    给指定用户删除指定命令集合的权限

上面我们给用户TEST用户增加了命令集合string的权限,且已经成功了,下面再删除这个权限

操作如下

127.0.0.1:6379> ACL SETUSER TEST -@string
OK
127.0.0.1:6379> ACL LIST
1) "user TEST on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* resetchannels -@all"
2) "user default on nopass ~* &* +@all"
127.0.0.1:6379> 
127.0.0.1:6379> AUTH TEST 123456
OK
127.0.0.1:6379> get name
(error) NOPERM this user has no permissions to run the 'get' command
127.0.0.1:6379> set name 123
(error) NOPERM this user has no permissions to run the 'set' command

特别注意第一行命令    ACL SETUSER TEST -@string

意思是给用户TEST删除命令集合string的权限,删除后我们执行ACL LIST 查看权限,发现TEST用户的权限已经变成-@all    也就是刚才的+@string已经消失了。后面的命令切换到用户TEST后,验证 get ,set 命令确实已经没有权限了

5. ACL SETUSER 用户名+子命令 增加子命令的权限,ACL SETUSER 用户名 -子命令 删除子命令的权限

很多时候,一个大的命令集合权限也太大了,我们可能只想给指定用户添加个别子命令的权限,比如get,hget,hlen,ttl等命令,这些是只读的,且运行效率极高,比较安全。

此时可以通过 +子命令 的方式来实现,格式: ACL SETUSER 用户名 +xxxx    操作如下

127.0.0.1:6379> ACL LIST
1) "user TEST on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* resetchannels -@all"
2) "user default on nopass ~* &* +@all"
127.0.0.1:6379> 
127.0.0.1:6379> ACL SETUSER TEST +get +hgetall +hlen
OK
127.0.0.1:6379> ACL LIST
1) "user TEST on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* resetchannels -@all +hlen +get +hgetall"
2) "user default on nopass ~* &* +@all"

注意增加子命令权限的写法:ACL SETUSER TEST +get +hgetall +hlen    各个子命令中间有个空格,通过 ACL LIST 也可以看到TEST的权限增加了hlen, get, hgetall这些

另起一个终端,认证TEST用户后使用get命令,如下

127.0.0.1:6379> AUTH TEST 123456
OK
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get val
(nil)
127.0.0.1:6379> 
127.0.0.1:6379> set name xiaoming
(error) NOPERM this user has no permissions to run the 'set' command

可以看到get命令已经可以了,但是set命令不行。

有时候我们给一般用户的权限太大了也不安全。如果想禁用一些危险的命令,可以通过 -@xxxx直接禁用掉某些危险集合的权限,也可以通过 -xxxx 禁用掉某些子命令的权限

禁用掉子命令的格式: ACL SETUSER 用户名 -xxxx    操作如下

127.0.0.1:6379> ACL SETUSER TEST -flushall -flushdb
OK
127.0.0.1:6379> AUTH TEST 123456
OK
127.0.0.1:6379> flushall
(error) NOPERM this user has no permissions to run the 'flushall' command

可以看到,执行禁用子命令后,切换到TEST用户后,flushall, flushdb的权限已经被禁用了

前面讲的+@xxx,-@xxx, +xxx, -xxx 讲的是增加删除命令集合的权限,增加删除子命令的权限,这些权限的key范围都是~*,也就是全部的key。这个时候依然不安全,因为有些时候为了防止泄密,我们只想让用户拥有个别key的操作权限,此时不仅要限制用户可用的命令集合或子命令,还要限制key的范围

比如我们想让用户 TEST 只对以 testget: 开头的这些 key 有权限,可以像下面这样设置

127.0.0.1:6379> ACL SETUSER TEST resetkeys ~testget:*
OK
127.0.0.1:6379> 

主要注意的是设置命令中的resetkeys,这个表示重置key的范围,如果没有resetkeys,属于追加

设置后,再运行上面的get测试,如下

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> 
127.0.0.1:6379> get val
(error) NOPERM this user has no permissions to access one of the keys used as arguments
127.0.0.1:6379> 
127.0.0.1:6379> get testget:1
(nil)

设置后,TEST用户get其他key时会被提示没有权限,只有get以testget:开头的key时才可以成功

6. 多个复杂权限叠加的示例

给用户user1设置权限规则如下

规则a:对所有的key拥有ttl, exists, get, hget, hmget,zcard 这些只读权限

规则b:对以OnlySet:开头的key拥有 set hset 这些只写权限

规则c:对以User1:开头的key拥有全部权限

规则d:禁用掉命令集合dangerous, admin

这种情况该怎么设置呢,请看

127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"
127.0.0.1:6379> ACL SETUSER user1 on >123456
OK
127.0.0.1:6379> ACL SETUSER user1 (~* +ttl +exists +get +hget +hmget +zcard) (~OnlySet:* +set +hset)
OK
127.0.0.1:6379> ACL SETUSER user1 ~User1:* +@all
OK
127.0.0.1:6379> ACL SETUSER user1 -@dangerous -@admin
OK
127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* &* +@all"
2) "user user1 on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~User1:* resetchannels +@all -@dangerous (~* resetchannels -@all +zcard +hget +exists +hmget +get +ttl) (~OnlySet:* resetchannels -@all +set +hset)"

第一个命令    ACL LIST    查看ACL权限,当前仅有一个default用户

第二个命令    ACL SETUSER user1 on >123456    新建一个user1用户,启用,密码是123456

第三个命令    ACL SETUSER user1 (~* +ttl +exists +get +hget +hmget +zcard) (~OnlySet:* +set +hset)    的意思是给用户user1添加了2个权限,不同权限用()分隔开。第一个(~* +ttl +exists +get +hget +hmget +zcard)   表给所有的key增加子命令ttl  exists  get  hget  hmget  zcard这些权限,即规则a   第二个(~OnlySet:* +set +hset)    表给所有以OnlySet:开头的key增加set, hset权限,即规则b

第四个命令    ACL SETUSER user1 ~User1:* +@all    的意思是对所有以User1:开头的key增加所有权限,即规则c

第五个命令    ACL SETUSER user1 -@dangerous -@admin    给用户user1删除命令集合 dangerous    admin的权限,即规则d

第六个命令    ACL LIST    再次查看ACL权限,可以看到现在user1已经有了,设置的权限也都已经生效了

好了,我们再开一个redis终端,登陆用户user1后进行验证

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值