一文搞懂redis的用户权限管理(ACL)功能

目录

前言

一、acl基本操作

1.1 、查看用户

1.2、创建用户

1.3、启用/禁用用户

1.4、设置密码/取消密码 

1.5、删除用户

二、用户的权限操作

2.1 、查看所有命令集合

2.2、增加/取消指定命令集合的权限

三、ACL的持久化

3.1、持久化ACL配置

3.2、从配置文件中读取ACL配置

四、其它操作

4.1. ACL测试能否使用指定命令

前言

Redis在6.0之前基本没有用户权限的概念,只有一个连接认证密码,一旦通过了认证就可以随意操作任意的redis数据,无法对用户权限进行精确控制,很容易因为用户权限过大引发误操作。如果想禁用某些不安全的命令,比如flushdb,flushall,只能通过rename-command的方式来避免。

redis6.0发布了权限管理功能ACL(access control list 访问控制列表),可以对不同的用户设置不同的权限,限制用户可使用的命令,可访问的key等。

一、acl基本操作

1.1 、查看用户

[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) "*"

1.2、创建用户

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)的

1.3、启用/禁用用户

启用用户:

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

1.4、设置密码/取消密码 

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

1.5、删除用户

127.0.0.1:6379> ACL DELUSER user
(integer) 1
127.0.0.1:6379> acl list
1) "user default on nopass ~* &* +@all"

二、用户的权限操作

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

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"

2.2、增加/取消指定命令集合的权限

先给用户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)

三、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

3.2、从配置文件中读取ACL配置

如果已经有了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"

四、其它操作

4.1. ACL测试能否使用指定命令

该命令在7及以上版本才支持

  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Redis ACL(Access Control Lists)是 Redis 6.0 中新增的一项功能,用于对 Redis 实例的访问进行细粒度控制。通过 ACL 可以对每个用户分配不同的权限,从而保证 Redis 实例的安全性。 下面是 Redis ACL 的一些配置权限示例: 1. 创建用户 ``` ACL SETUSER username password ``` 其中,`username` 为要创建的用户名,`password` 为该用户的密码。 2. 设置用户权限 ``` ACL SETUSER username on|off [command_name [key_pattern]] ``` 其中,`on` 表示允许该用户执行指定命令,`off` 表示禁止该用户执行指定命令。`command_name` 表示要设置权限的命令名,`key_pattern` 表示要设置权限的键名模式。 例如,设置用户 `test_user` 只能执行 `get` 和 `set` 命令: ``` ACL SETUSER test_user on get set ``` 3. 设置默认权限 ``` ACL SETUSER default on|off [command_name [key_pattern]] ``` 其中,`default` 表示所有用户的默认权限。可以使用 `on` 或 `off` 指定是否允许执行指定的命令。 例如,设置所有用户只能执行 `get` 和 `set` 命令: ``` ACL SETUSER default on get set ``` 4. 查看用户权限 ``` ACL GETUSER username ``` 通过该命令可以查看指定用户的权限。 5. 查看所有用户 ``` ACL USERS ``` 通过该命令可以查看当前 Redis 实例中所有的用户。 6. 删除用户 ``` ACL DELUSER username ``` 通过该命令可以删除指定的用户。 需要注意的是,Redis ACL 需要在 Redis 配置文件中启用,具体配置可以参考 Redis 官方文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值