Redis-day3.1-ACL安全策略与消息队列
发布日期:2021-05-10 01:01:25 浏览次数:21 分类:精选文章

本文共 3046 字,大约阅读时间需要 10 分钟。

ACL安全策略与消息队列

ACL安全策略

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

因此,Redis 6 版本推出了 ACL(Access Controller List)访问控制权限的功能。基于此功能,我们可以设置多个用户,并且给每个用户单独设置命令权限和数据权限。为了保证向下兼容,Redis 6 保留了 default 用户,并且在使用 redis-cli 连接时,如果没有指定用户名,默认用户仍然是 default

redis.confaclfile 模式中配置 DSL 官方更推荐使用 aclfile,因为如果在 redis.conf 中配置了权限之后需要重启 Redis 服务才能将配置的权限加载至 Redis 服务中来;

但是如果使用 aclfile 模式,可以调用 acl load 命令将 aclfile 中配置的 ACL 权限热加载进环境中,类似于 MySQL 中的 flush privileges。同时我们也可以使用命令:config rewrite 将 ACL 权限初始化到 redis.conf 中,同时执行 acl save 可以将 ACL 配置持久化到 aclfile 中。

开启 aclfile 之后不再推荐在 redis.conf 文件中通过 requirepass 配置 default 的密码,因为它不再生效,同时开启 aclfile 之后也不能使用 redis-cli -a xxx 登陆,必须使用 redis-cli --user xxx --pass yyy 来登陆。在没设置密码的时期也可以无密码登录。


Redis 设置密码

1)通过修改配置文件

在 Redis 6.0 之前,Redis 只有一个 default 用户,也是 Redis 中的超管用户,设置密码的方式如下:

# 通过修改配置文件将密码设置为123456
[root@k8s-master1 ~]# vim /usr/local/redis/bin/redis.conf
requirepass 123456
# 修改之后再次进入Redis时,发现已经没有权限操作了,因为只有一个default用户
[root@k8s-master1 ~]# redis-cli --raw
127.0.0.1:6379> set a b
NOAUTH Authentication required.
# 这个时候我们需要使用密码的方式进入
[root@k8s-master1 ~]# redis-cli -a 123456 --raw
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set a b
OK

2)通过使用外部 ACL

可以使用原 default 用户 acl 这行 DSL 命令设置用户权限,也可以配置外部 aclfile 权限(配置前需将配置文件中的 DSL 注释或删除,因为 Redis 不允许两种方式同时使用)。

[root@k8s-master1 ~]# vim /usr/local/redis/bin/redis.conf
1. 注释所有已授权的 ACL 命令,如:#user default on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92~* +@all2. 注释 `default` 用户的密码(因为开启 `aclfile` 之后,`requirepass` 的密码就失效了)#requirepass 1234563. 配置 `aclfile` 的路径,然后创建该文件,否则重启 Redis 服务会报错找不到该文件# aclfile /usr/local/redis/etc/users.acl4. 通过命令行来创建此空文件即可
mkdir /usr/local/redis/etc
touch /usr/local/redis/etc/users.acl
5. 重启 Redis 服务并加载权限生效
systemctl restart redis
6. 加载权限生效
127.0.0.1:6379> aclfile load

4)创建激活用户

创建用户并激活状态:

127.0.0.1:6379> acl setuser Peng on
OK
127.0.0.1:6379> acl list
1) "user Peng on -@all"
2) "user default on nopass ~* +@all"

切换到 egon 用户并提权:

# 切换到高权限用户
127.0.0.1:6379> auth Peng 123
# 提权
127.0.0.1:6379> acl setuser egon +@all
OK
# 切回
127.0.0.1:6379> auth egon 123
OK

ACL常用命令

1)按条件创建用户

创建用户并设置密码、访问权限等:

127.0.0.1:6379> acl setuser egon on >123 ~name* +set
OK
127.0.0.1:6379> acl list
1) "user egon on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* -@all +set"

2)提权

通过设置用户权限:

# 切换到高权限用户
127.0.0.1:6379> auth Peng 123
# 提权
127.0.0.1:6379> acl setuser egon +@all
OK
# 切回
127.0.0.1:6379> auth egon 123
OK

消息队列

Redis 提供了发布与订阅的功能,类似于微信订阅号,订阅号的消息大家都能收到,表示大家都订阅了。

1)发布与订阅到频道

发布者发布信息 -> 通过频道分发给用户 -> 用户通过频道获取订阅的内容。

发布单个频道

127.0.0.1:6379> publish test1 "aaa"
(integer) 112

订阅多个频道

127.0.0.1:6379> subscribe test1 test2
Reading messages... (press Ctrl-C to quit)
1) "message"
2) "test1"
3) "aaa"
1) "message"
2) "test2"
3) "bbb"

订阅单个频道

127.0.0.1:6379> subscribe test3
Reading messages... (press Ctrl-C to quit)
1) "message"
2) "test3"
3) "bbb"

通过上述内容,我们可以清晰地了解 Redis ACL 安全策略的配置方法以及消息队列的使用方式。

上一篇:Redis-day3.2-主从复制
下一篇:Redis-day2-五种数据结构类型与数据持久化AOF+RDB

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2025年04月21日 22时07分57秒