Redis===》ACL安全策略发布与订阅redis集群

Posted 一夜暴富--gogogo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis===》ACL安全策略发布与订阅redis集群相关的知识,希望对你有一定的参考价值。

一、Redis新特性ACL安全策略

在Redis6之前的版本,我们只能使用requirepass参数给default用户配置登录密码,同一个Redis集群的所有开发都共享default用户,难免会出现误操作把别人的key删掉或者数据泄露的情况。

因此Redis6版本退出了ACL(Access Controller List)访问控制权限的功能,基于次功能,我们可以设置多个用户,并且给每一个用户单独设置命令权限和数据权限。为了保证向下兼容性,Redis6保留了default用户和使用requirepass 的方式给default用户设置密码,默认情况下default用户拥有Redis最大权限,我们使用的redis-cli链接时如果没有指定用户,默认也是default。

1.配置ACL

#1.查看当前所有用户
127.0.0.1:6379> ACL LIST
1) "user default on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~* +@all"

#2.配置ACL
127.0.0.1:6379> config rewrite
OK   #执行config rewrite重写配置后会自动在conf文件最下面新增一行记录配置default的密码和权限
[root@docker ~]# cd /usr/local/redis/conf
[root@docker conf]# cat redis.conf 
user default on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~* +@all

2.Redis设置密码

在Redis6之前,Redis只有一个default用户也是Redis中的超级管理员用户,如果要将其设置密码,需要修改Redis的配置文件

#设置密码
[root@docker ~]# vim /usr/local/redis/conf/redis.conf 
requirepass 123  #可将此内容注释即没有密码,或修改其他密码

#验证
[root@docker ~]# systemctl restart redis
[root@docker ~]# redis-cli 
127.0.0.1:6379> set a b
OK

3.使用ACL

我们可以直接在conf配置文件中使用上面default用户ACL这行DSL命令设置用户权限,或者我们也可以配置外部aclfile配置权限。配置aclfile需要先将conf中配置的DSL注释或者删除。因为Redis不允许两种ACL管理方式同时使用,否则在启动Redis的时候会报错

#1.创建用户
127.0.0.1:6379> acl setuser test  #创建用户(不设置密码权限默认没有密码没有任何权限)
OK
127.0.0.1:6379> acl list  #查看用户
1) "user default on nopass ~* +@all"
2) "user test off -@all"

#2.启用用户
(用户默认情况下,是未激活状态)
127.0.0.1:6379> acl setuser test on  #激活用户
OK
127.0.0.1:6379> acl list
1) "user default on nopass ~* +@all"
2) "user test on -@all"

#3.给用户增加密码
127.0.0.1:6379> acl setuser test on >123
OK
127.0.0.1:6379> acl list
1) "user default on nopass ~* +@all"  #+@all代表拥有所有权限
2) "user test on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 -@all"  #-@all代表所有权限都没有

#4.查看当前用户
127.0.0.1:6379> acl whoami
"default"  #可以看做Redis的超级用户,拥有所有权限

#5.登录普通用户,是没有acl权限的
[root@docker ~]# redis-cli 
127.0.0.1:6379> auth test 123
OK
127.0.0.1:6379> acl list
(error) NOPERM this user has no permissions to run the 'acl' command or its subcommand

#6.认证
127.0.0.1:6379> auth default 123
OK
127.0.0.1:6379> acl whoami
"default"

#7.给用户设置权限
127.0.0.1:6379> acl setuser test on >123 ~name* +@all  #给test用户以name开头的key加上所有权限
OK
127.0.0.1:6379> acl list
1) "user default on nopass ~* +@all"
2) "user test on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* +@all"

127.0.0.1:6379> acl setuser dashuju  #创建大数据用户
OK
127.0.0.1:6379> acl setuser dashuju on >123 ~dashuju* +set +get  #给大数据用户的dashuju开头的key授set get权限
OK
127.0.0.1:6379> acl list
1) "user dashuju on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~dashuju* -@all +set +get"
2) "user default on nopass ~* +@all"
3) "user test on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* +@all"

#8.展示所有的用户
127.0.0.1:6379> acl list
1) "user dashuju on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~dashuju* -@all +set +get"
2) "user default on nopass ~* +@all"
3) "user test on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* +@all"

#9.展示所有用户名
127.0.0.1:6379> acl users
1) "dashuju"
2) "default"
3) "test"

#10.展示当前用户
127.0.0.1:6379> acl whoami
"default"

#11.展示当前可授权限
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.查看一个用户所有的key
127.0.0.1:6379> acl getuser test
1) "flags"
2) 1) "on"
   2) "allcommands"
3) "passwords"
4) 1) "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3"
5) "commands"
6) "+@all"
7) "keys"
8) 1) "name*"

#13.删除一个用户
127.0.0.1:6379> acl list
1) "user dashuju on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~dashuju* -@all +set +get"
2) "user default on nopass ~* +@all"
3) "user test on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* +@all"
127.0.0.1:6379> acl deluser dashuju  #删除大数据用户
(integer) 1
127.0.0.1:6379> acl list
1) "user default on nopass ~* +@all"
2) "user test on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* +@all"

4.保存ACL

我们可以使用 acl save 命令将当前服务器中的 ACL 权限持久化到 aclfile 中,如果没持久化就关闭 redis 服务, 那些 ACL 权限就会丢失,因此我们每次授权之后一定要记得 ACL SAVE 将 ACL 权限持久化到 aclfile中。

#1.首先在redis.conf配置文件中启用aclfile文件
[root@docker conf]# vim /usr/local/redis/conf/redis.conf
aclfile /usr/local/redis/conf/users.acl

#2.重启redis,如果没有user.acl文件可以手动创建一个
[root@docker ~]# systemctl restart redis
[root@docker conf]# ll
总用量 84
-rw-r--r-- 1 root root 85015 5月   1 20:29 redis.conf
[root@docker conf]# touch user.acl
[root@docker conf]# ll
总用量 84
-rw-r--r-- 1 root root 85015 5月   1 20:29 redis.conf
-rw-r--r-- 1 root root     0 5月   1 20:31 users.acl

#3.redis-cli连接到server
[root@docker ~]# redis-cli 
127.0.0.1:6379> acl list
1) "user default on nopass ~* +@all"
127.0.0.1:6379> acl setuser test on >123 ~name* +@all
OK
127.0.0.1:6379> acl list
1) "user default on nopass ~* +@all"
2) "user test on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* +@all"
127.0.0.1:6379> acl save
OK
#4.查看文件是否存入内容
[root@docker conf]# ll  #没acl save之前
总用量 84
-rw-r--r-- 1 root root 84893 5月   1 20:33 redis.conf
-rw-r--r-- 1 root root     0 5月   1 20:31 user.acl
[root@docker conf]# ll  #acl save之前后
总用量 88
-rw-r--r-- 1 root root 84893 5月   1 20:33 redis.conf
-rw-r--r-- 1 root root   124 5月   7 05:41 users.acl  #可以看见文件已有大小,内容已存在

5.加载用户信息

我们也可以直接在 aclfile 中修改或新增 ACL 权限,修改之后不会立刻生效,我们可以在 redis 命令行中执行 acl load 将该 aclfile 中的权限加载至 redis 服务中

#1.修改users.acl文件内容
[root@docker conf]# vim users.acl   #添加一行tests用户信息
user default on nopass ~* +@all
user test on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* +@all
user tests on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* +@all

#2.使用命令重新加载用户信息会生成一个文件中指定的新用户tests
127.0.0.1:6379> acl load
OK
127.0.0.1:6379> acl list
1) "user default on nopass ~* +@all"
2) "user test on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* +@all"
3) "user tests on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* +@all"

二、Redis发布与订阅

Redis 通过 PUBLISH 、 SUBSCRIBE 等命令实现了订阅与发布模式, 这个功能提供两种信息机制, 分别是 订阅/发布到频道和订阅/发布到模式, 下文先讨论订阅/发布到频道的实现, 再讨论订阅/发布到模式的实现

1.角色(发布者、消费者、频道)

1)发布者

发布者最主要的工作就是将信息发布到频道中

2)消费者

消费者最主要的功能就是接收消费频道中的信息

3)频道

频道最主要的功能是存储发布者的信息,然后分别发给每一个消费者

2.模型

在这里插入图片描述

3.发布订阅队列

1)publish 发布 subscribe 订阅

#1.发布一个test管道内容是123
127.0.0.1:6379> publish test 123
(integer) 1

#2.订阅(实时监控test管道的内容)
127.0.0.1:6379> subscribe test
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "test"
3) (integer) 1
1) "message"
2) "test"
3) "123"

三、Redis集群

由于单机 Redis 存储能力受单机限制,以及无法实现读写操作的负载均衡和读写分离,无法保证高可用。本 篇就来介绍 Redis 集群搭建方案及实现原理,实现 Redis 对数据的冗余备份,从而保证数据和服务的高可用。主 从复制是哨兵和集群的基石,因此我们循序渐进,由浅入深一层层的将 Redis 高可用方案抽丝剥茧展示在大家面 前。

1.主从复制

主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器,主从是哨兵和集群模式能够实施 的基础。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。默认 情况下,每台 Redis 服务器都是主节点;且一个主节点可以有零个或多个从节点(0+个从节点),但一个从节点只 能有一个主节点。一般主节点负责接收写请求,从节点负责接收读请求,从而实现读写分离。主从一般部署在不 同机器上,复制时存在网络延时问题,使用参数 repl-disable-tcp-nodelay 选择是否关闭 TCP_NODELAY,默认为关闭:

  1. 关闭:无论数据大小都会及时同步到从节点,占带宽,适用于主从网络好的场景。
  2. 开启:主节点每隔指定时间合并数据为 TCP 包节省带宽,默认为 40 毫秒同步一次,适用于网络环境复 杂或带宽紧张,如跨机房

在这里插入图片描述

2.作用

  • 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
  • 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
  • 负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服 务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量。
  • 读写分离:主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库 的数量。
  • 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础。

3.开启主从配置

配置主从可以在命令行或配置文件中配置,上面提到主节点负责写,从节点负责读,因此推荐开启从服务器 的只读配置,否则的话在从节点的写操作不会同步到主节点会导致数据不一致。

#1.查看主从信息
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_replid:30506cff89f7a58082bcbe39b46e3687f2706dba
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#1.准备主从环境(一主两从)
[root@docker conf]# cp redis.conf  redis-6380.conf 
[root@docker conf]# cp redis.conf  redis-6381.conf 
[root@docker conf]# ll
总用量 256
-rw-r--r-- 1 root root 84893 5月   7 06:24 redis-6380.conf
-rw-r--r-- 1 root root 84893 5月   7 06:24 redis-6381.conf
-rw-r--r-- 1 root root 84893 5月   1 20:33 redis.conf
-rw-r--r-- 1 root root   217 5月   7 05:52 users.acl
#改配置文件对应端口号
[root@docker conf]# vim redis-6380.conf
port 6380
[root@docker conf]# vim redis-6381.conf 
port 6381
#将三个配置文件中aclfile一行内容注释掉

#2.启动三个Redis服务
[root@docker ~]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf 
[root@docker ~]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6380.conf 
[root@docker ~]# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6381.conf 
[root@docker ~]# netstat -lntp|grep redis
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      1297/redis-server 1 
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      1426/redis-server 1 
tcp        0      0 127.0.0.1:6381          0.0.0.0:*               LISTEN      1432/redis-server 1 

#3.redis-cli连接三个服务端
[root@docker ~]# redis-cli -p 6379
127.0.0.1:6379> 
[root@docker conf]# redis-cli -p 6380
127.0.0.1:6380> 
[root@docker ~]# redis-cli -p 6381
127.0.0.1:6381> 

#4.从节点加入主节点
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
127.0.0.1:6379> info replication  #查看集群信息
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=14,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=14,lag=1
master_replid:6f0e47bb4fedf816f83210956ed1d277d82851b9
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14

以上是关于Redis===》ACL安全策略发布与订阅redis集群的主要内容,如果未能解决你的问题,请参考以下文章

Redis===》ACL安全策略发布与订阅redis集群

Redis的安装与新特性ACL安全策略

redis订阅发布消息操作本地缓存

自学总结redis第三部分(安全性主从哨兵事物持久化发布与订阅虚拟内存)

Redis 技术探索「安全实战系列」带你认识一下Redis的权限控制机制ACL(访问控制列表)是什么

Redis系列:发布与订阅