
本文共 3046 字,大约阅读时间需要 10 分钟。
ACL安全策略与消息队列
ACL安全策略
在 Redis 6 之前的版本,我们只能使用 requirepass
参数给 default
用户配置登录密码,同一个 Redis 集群的所有开发都会共享 default
用户,这可能导致误操作导致别人的 key 被删掉或者数据泄露的情况。
因此,Redis 6 版本推出了 ACL(Access Controller List)访问控制权限的功能。基于此功能,我们可以设置多个用户,并且给每个用户单独设置命令权限和数据权限。为了保证向下兼容,Redis 6 保留了 default
用户,并且在使用 redis-cli
连接时,如果没有指定用户名,默认用户仍然是 default
。
在 redis.conf
和 aclfile
模式中配置 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.confrequirepass 123456# 修改之后再次进入Redis时,发现已经没有权限操作了,因为只有一个default用户[root@k8s-master1 ~]# redis-cli --raw127.0.0.1:6379> set a bNOAUTH Authentication required.# 这个时候我们需要使用密码的方式进入[root@k8s-master1 ~]# redis-cli -a 123456 --rawWarning: Using a password with '-a' or '-u' option on the command line interface may not be safe.127.0.0.1:6379> set a bOK
2)通过使用外部 ACL
可以使用原 default
用户 acl
这行 DSL 命令设置用户权限,也可以配置外部 aclfile
权限(配置前需将配置文件中的 DSL 注释或删除,因为 Redis 不允许两种方式同时使用)。
[root@k8s-master1 ~]# vim /usr/local/redis/bin/redis.conf1. 注释所有已授权的 ACL 命令,如:#user default on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92~* +@all2. 注释 `default` 用户的密码(因为开启 `aclfile` 之后,`requirepass` 的密码就失效了)#requirepass 1234563. 配置 `aclfile` 的路径,然后创建该文件,否则重启 Redis 服务会报错找不到该文件# aclfile /usr/local/redis/etc/users.acl4. 通过命令行来创建此空文件即可mkdir /usr/local/redis/etctouch /usr/local/redis/etc/users.acl5. 重启 Redis 服务并加载权限生效systemctl restart redis6. 加载权限生效127.0.0.1:6379> aclfile load
4)创建激活用户
创建用户并激活状态:
127.0.0.1:6379> acl setuser Peng onOK127.0.0.1:6379> acl list1) "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 +@allOK# 切回127.0.0.1:6379> auth egon 123OK
ACL常用命令
1)按条件创建用户
创建用户并设置密码、访问权限等:
127.0.0.1:6379> acl setuser egon on >123 ~name* +setOK127.0.0.1:6379> acl list1) "user egon on #a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 ~name* -@all +set"
2)提权
通过设置用户权限:
# 切换到高权限用户127.0.0.1:6379> auth Peng 123# 提权127.0.0.1:6379> acl setuser egon +@allOK# 切回127.0.0.1:6379> auth egon 123OK
消息队列
Redis 提供了发布与订阅的功能,类似于微信订阅号,订阅号的消息大家都能收到,表示大家都订阅了。
1)发布与订阅到频道
发布者发布信息 -> 通过频道分发给用户 -> 用户通过频道获取订阅的内容。
发布单个频道
127.0.0.1:6379> publish test1 "aaa"(integer) 112
订阅多个频道
127.0.0.1:6379> subscribe test1 test2Reading messages... (press Ctrl-C to quit)1) "message"2) "test1"3) "aaa"1) "message"2) "test2"3) "bbb"
订阅单个频道
127.0.0.1:6379> subscribe test3Reading messages... (press Ctrl-C to quit)1) "message"2) "test3"3) "bbb"
通过上述内容,我们可以清晰地了解 Redis ACL 安全策略的配置方法以及消息队列的使用方式。
发表评论
最新留言
关于作者
