Redis用户权限管理
Redis在6.0之前基本没有用户权限的概念,只有一个连接认证密码,一旦通过了认证就可以随意操作任意的redis数据,无法对用户权限进行精确控制,很容易因为用户权限过大引发误操作。如果想禁用某些不安全的命令,比如flushdb,flushall,只能通过rename-command的方式来避免。
redis6.0发布了权限管理功能ACL(access control list访问控制列表),可以对不同的用户设置不同的权限,限制用户可使用的命令,可访问的key等。
1. acl基本操作
1.1 查看用户
只创建用户,暂时不添加其他权限
sh
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
default
表示default的用户名,为了兼容老版本的Redis没有用户名, 提供default用户。on
表示已启用该用户,off
表禁用nopass
表示没有密码sanitize-payload
用于控制Redis在处理客户端命令时是否对命令的参数进行清理, 以防止这些信息在日志、监控或者其他输出中被泄露。~*
表示可访问全部的数据Key(正则匹配)&*
表示允许用户访问所有Pub/Sub频道(正则匹配)。+@all
表示用户的权限,+
添加权限;-
删减权限;@
为redis命令分类;可以通过ACL CAT
查询相关分类,all
表全部的命令集合,最终+@all
表示拥有所有命令集合的所有权限。
1.2 只查看用户名
sh
127.0.0.1:6379> acl users
1) "default"
2) "qjk_user"
1.3 查看当前使用的用户
sh
127.0.0.1:6379> ACL WHOAMI
"default"
1.4 获取指定用户信息
1.5 创建用户
sh
127.0.0.1:6479> ACL SETUSER user1 on >pwd_u1
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
3) "user user1 on sanitize-payload #21a1bbcd2c36cb07cd8779b3cba6ab183ecfd8b2a86e11f6dc1f674b90634544 resetchannels -@all"
user1创建的时候没有指明权限,-@all
表示没有任何权限,on
表示启用该用户
1.6 启用/禁用用户
sh
## 禁用 user1
127.0.0.1:6379> ACL SETUSER user1 off
OK
jack@mysql01:/opt/module/redis-7.2.4$ ./src/redis-cli
127.0.0.1:6379> auth user1 pwd-u1
(error) WRONGPASS invalid username-password pair or user is disabled.
1.7 设置密码/取消密码
sh
127.0.0.1:6379> ACL SETUSER user1 >111111
OK
>
表示将此密码添加到用户的有效密码列表中。
1.8 删除用户
sh
127.0.0.1:6379> ACL DELUSER user1
OK
1.9 生成密码
sh
## 生成随机8位密码
192.168.154.221:6379> acl genpass 32
"1c817991"
1.10 用户登录
方式1:直接连接的时候指定用户名密码
sh
redis-cli --user user1 -a pwd1234
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> acl whoami
"user1"
方式2:使用auth
命令登录
sh
redis-cli -h 192.168.154.221 -p 6379
192.168.154.221:6379> acl whoami
(error) NOAUTH Authentication required.
192.168.154.221:6379> auth user1 pwd1234
OK
192.168.154.221:6379> acl whoami
"user1"
2. 用户权限配置
2.1 查看所有的权限列表
sh
## 查看权限类别
192.168.154.221: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"
## 查看list命令权限
192.168.154.221:6379> acl cat list
1) "blpop"
2) "sort"
3) "lmpop"
4) "llen"
5) "lrem"
6) "rpop"
7) "lpop"
8) "lset"
9) "lmove"
10) "brpoplpush"
11) "linsert"
12) "rpushx"
13) "sort_ro"
14) "lpush"
15) "ltrim"
16) "lindex"
17) "lpushx"
18) "brpop"
19) "blmove"
20) "lpos"
21) "rpoplpush"
22) "rpush"
23) "blmpop"
24) "lrange"
2.2 添加权限
sh
## 添加user1 genpas和whoami命令权限
127.0.0.1:6379> acl setuser user1 on +acl|genpass +acl|whoami
其中+
表示添加权限,与|
一起使用,表示仅仅允许使用子命令,多个权限用空格隔开。也可以添加一类权限:
sh
127.0.0.1:6379> acl setuser user1 ~* +@string
允许user1操作值类型为string的数据,其中~*
表示key的范围是所有的key。还可以更加精细化的控制限制key的范围:
sh
127.0.0.1:6379> acl setuser user1 on ~kk*
192.168.154.221:6379> get kk1
"123"
(1.34s)
192.168.154.221:6379> get k1
(error) NOPERM No permissions to access a key
2.3 回收权限
sh
127.0.0.1:6379> acl setuser user1 ~* -@string
192.168.154.221:6379> get kk3
(error) NOPERM User user1 has no permissions to run the 'get' command
其中-
表示回收权限。
3. ACL的持久化
Redis默认情况下不持久化ACL配置。这意味着在Redis重启后,所有基于ACL的用户和权限设置会恢复为默认配置。修改redis.conf文件,配置指定文件来存储acl:
sh
vim conf/redis.conf
## 修改1033行
aclfile /opt/module/redis-7.2.4/conf/users.acl
在客户端执行ACL SAVE
能够将当前配置的ACL保存到文件中:
sh
127.0.0.1:6379> acl save
jack@mysql01:/opt/module/redis-7.2.4$ cat /opt/module/redis-7.2.4/conf/users.acl
user default on sanitize-payload #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* &* +@all
user qjk_user on sanitize-payload #e00dd870d5d94aa33e1d835ed6dc9ea18bd541d64ed7f05ecdb022576b7cd14d ~* resetchannels +@all
user user1 on sanitize-payload #0e3e815ab5f1b3bece555b81dde7c3f93b212a1feea22121fcc408cd37558dae ~* resetchannels -@all +acl|genpass +acl|whoami -@string
另外可以使用ACL LOAD
加载写好的acl文件。