到V6.0版本为止, Redis的安全设置共有两种方式, 一种是通过requirepass设置密码, 第二种是通过ACL进行更精确的安全设置.
一. requirepass
在之前V6.0版本前,可以使用 requirepass 设置用户访问密码.
1.1
redis.conf 配置文件
在redis.conf中通过 requirepass项配置访问密码;
requirepass pwd # pwd为设置密码
1.2
命令方式设置
通过config set requirepass命令设置访问密码
127.0.0.1:6379> config set requirepass "pwd"
OK
1.3
清空密码
127.0.0.1:6379> CONFIG SET requirepass ""
OK
这种方式的缺点就是无法对访问进行精确控制, 很容易因为用户权限太大而带来误操作的风险, 因此在 V6.0 版本中引入ACL 机制, 能对用户操作进行精确控制;
二. ACL访问控制列表
Redis6.0发布了权限管理功能ACL(access control list 访问控制列表), 可以根据不同的用户设置不同的权限, 限制用户访问命令和待访问的数据.
ACL是使用领域专用语言DSL(Domain specific language)定义的, 描述用户能够执行的操作, 其中规则是从上到下, 从左到右应用;
2.1
acl setuser
创建用户或者设置用户访问规则;
127.0.0.1:6379> acl setuser u1 on >pwd ~* +get
OK
2.2
acl list
查看权限列表;
127.0.0.1:6379> acl list
1) "user default on nopass ~* &* +@all"
2) "user u1 on #a1159e9df3670d549d04524532629f5477ceb7deec9b45e47e8c009506ecb2c8 ~* &* -@all +get"
user 用户
u1 用户名, default是系统默认用户名, 兼容旧版本;
on 是否启用用户, 默认为off(禁用);
#... 用户密码, nopass表示不需要密码;
~* 可访问的数据Key(正则匹配);
+@ 表示用户的权限, "+"添加权限, "-"删减权限; @为redis命令分类, 可以通过 ACL CAT 查询相关分类. +@all 表示所有权限;
2.3
auth 登录
使用指定用户登录;
127.0.0.1:6379> auth u1 pwd
OK
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379> set a a
(error) NOPERM this user has no permissions to run the 'set' command or its subcommand
2.4
acl setuser
使用setuser设置其他规则;
2.4.1
仅添加用户
127.0.0.1:6379> acl setuser u1
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 off &* -@all"
2.4.2
启用用户
127.0.0.1:6379> acl setuser u1 on
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"
2.4.3
禁用用户
127.0.0.1:6379> acl setuser u1 off
OK
2.4.4
设置密码
127.0.0.1:6379> acl setuser u1 >pwd
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on #a1159e9df3670d549d04524532629f5477ceb7deec9b45e47e8c009506ecb2c8 &* -@all"
2.4.5
删除密码
127.0.0.1:6379> acl setuser u1 <pwd
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"
2.4.6
添加用户指定命令权限
127.0.0.1:6379> acl setuser u1 +get
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all +get"
2.4.7
删除用户指定命令权限
127.0.0.1:6379> acl setuser u1 -get
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"
2.4.8
添加用户指定种类命令权限
127.0.0.1:6379> acl setuser u1 +@set
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all +@set"
2.4.9
删除用户指定种类命令权限
127.0.0.1:6379> acl setuser u1 -@set
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"
127.0.0.1:6379>
2.5
acl getuser
查看指定用户权限信息
127.0.0.1:6379> acl getuser u1
1) "flags"
2) 1) "on"
2) "allchannels"
3) "passwords"
4) (empty array)
5) "commands"
6) "-@all"
7) "keys"
8) (empty array)
9) "channels"
10) 1) "*"
127.0.0.1:6379>
2.6
acl deluser
删除指定用户
127.0.0.1:6379> acl setuser u2
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"
3) "user u2 off &* -@all"
127.0.0.1:6379> acl deluser u2
(integer) 1
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
2) "user u1 on &* -@all"
127.0.0.1:6379>
2.7
acl cat
查看命令类别或者指定类别下的命令
2.7.1
查看所有种类
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"
2.7.2
查看指定种类下所有命令
127.0.0.1:6379> acl cat string
1) "msetnx"
2) "setex"
3) "getrange"
4) "setrange"
5) "decr"
6) "getset"
7) "substr"
8) "incr"
9) "strlen"
10) "setnx"
11) "get"
12) "stralgo"
13) "mset"
14) "psetex"
15) "append"
16) "getdel"
17) "getex"
18) "incrby"
19) "decrby"
20) "set"
21) "incrbyfloat"
22) "mget"
127.0.0.1:6379>
2.8
acl log
查看安全日志
127.0.0.1:6379> acl log
1) 1) "count"
2) (integer) 1
3) "reason"
4) "command"
5) "context"
6) "toplevel"
7) "object"
8) "acl"
9) "username"
10) "u1"
11) "age-seconds"
12) "236.501"
13) "client-info"
14) "id=4 addr=127.0.0.1:40204 laddr=127.0.0.1:6379 fd=8 name= age=506 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=23 qbuf-free=40931 argv-mem=7 obl=0 oll=0 omem=0 tot-mem=61463 events=r cmd=acl user=u1 redir=-1"
2) 1) "count"
2) (integer) 1
3) "reason"
4) "auth"
5) "context"
6) "toplevel"
7) "object"
8) "auth"
9) "username"
10) "u2"
11) "age-seconds"
12) "372.00299999999999"
13) "client-info"
14) "id=4 addr=127.0.0.1:40204 laddr=127.0.0.1:6379 fd=8 name= age=371 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=31 qbuf-free=40923 argv-mem=9 obl=0 oll=0 omem=0 tot-mem=61473 events=r cmd=auth user=default redir=-1"
2.9
acl whoami
查看当前用户
127.0.0.1:6379> acl whoami
"default"
2.10
acl genpas
随机生成密码
该命令默认创建一个 256 bit 的 32 字节的伪随机字符串, 并将其转换为 64 字节的字母+数字的字符串. 如有有参数, 则使用指定的位数长度.
127.0.0.1:6379> acl genpass
"f0bc11d9dc86a6e2bd32555ed3a0cc8f03cdcab51d57eaa11b4d8f7a2d8362ac"
127.0.0.1:6379> acl genpass 16
"337b"
127.0.0.1:6379> acl genpass 32
"49d6ccd4"
127.0.0.1:6379>
2.11
aclfile 权限存储文件
在redis.conf中配置aclfile项
aclfile /etc/redis/users.acl
2.11.1
acl save
将当前 ACL 配置保存到一个外部文件
127.0.0.1:6379> acl list
1) "user default on nopass ~* &* +@all"
127.0.0.1:6379>
127.0.0.1:6379>
127.0.0.1:6379> acl setuser u1
OK
127.0.0.1:6379> acl save
OK
查看acl文件
# cat users.acl
user default on nopass ~* &* +@all
user u1 off &* -@all
2.11.2
acl load
acl load命令是将保存权限的aclfile文件加载到系统中; 加载后可以对文件进行修改;
# cat users.acl
user default on nopass ~* &* +@all
加载ACL数据
127.0.0.1:6379> acl load
OK
127.0.0.1:6379> acl list
1) "user default on nopass sanitize-payload ~* &* +@all"
总结
以上, 就是redis的密码设置访问, 权限控制等安全设置.