文章目录
一、为什么要学习Redis的ACL功能?
在redis6.0以前只有一个默认用户和一个密码,只要客户端连接上了redis,缓存中的所有数据对所有系统都是公开的,都是可以互相访问的,也可以互相修改,而且许多危险命令权限也同样可以执行,这就会有许多问题,例如:
- A系统添加了一个缓存内容被B系统删除了,导致A系统某个流程异常;
- A系统添加的数据想允许B系统访问,但不允许B系统修改(如单点登录的token,值可以共享给其他系统,但不允许他们修改);
- redis中拥有很多命令不应该对应用程序开放,这些命令开放可能会给redis照成严重问题(例如:config、flushdb、bgsave、shutdown等危险指令)
从上面案例中可以看出低版本的redis会有多严重的问题,并且存在的问题远远不止上面几种情况,因此添加权限配置是很有必要的。
二、ACL安全配置的介绍
Redis ACL是访问控制列表的缩写,它可以实现某些连接在执行的命令
和访问的密钥
方面受到限制。它的工作方式是,在连接后,客户端需要提供用户名和有效密码来进行身份验证。如果身份验证成功,则连接将与给定用户的限制相关联。
在默认配置中,Redis 6(第一个拥有ACL的版本)的工作方式与旧版本的Redis完全相同。每个新连接都能够调用每一个可能的命令并访问每一个密钥,因此ACL功能与旧客户端和应用程序向后兼容。
三、ACL功能模块使用
在Redis6中ACL主要功能包含用户管理、命令权限管理、访问密钥管理三部分,其中用户是最基本的,命令权限和密钥权限都需要基于用户来配置。
3.1. 用户管理
1. 新增用户
acl setuser 用户名 on >密码
on:代表的是启用该用户,相反off则是禁用
>:后面跟的是用户的密码
3.2. 可执行的指定配置
3.2.1. 授权一个明确指令【+】
允许用户执行get指令
acl setuser 用户名 +get
3.2.2. 授权一类指令【+@】
允许用户执行连接一类的指令,具体有哪些类型可以通过acl cat
指令查看
acl setuser 用户名 +@connection
3.2.3. 组合使用
允许用户执行所有除了dangerous类型指令和info的指令
acl setuser 用户名 +@all -@dangerous -info
3.3. 允许访问密钥范围【~】
3.3.1. 允许访问固定前缀的密钥
允许访问密钥前缀为fop:
的密钥
acl setuser 用户名 ~fop:*
3.3.2. 允许访问所有密钥
acl setuser 用户名 ~*
3.4. 列表查看所有acl配置
acl list
四、ACL配置持久化与加载
4.1. 为什么需要持久化ACL配置?
首先redis中间件经常会发布新版本,小版本一般都是修复一些BUG,而大版本则会出现更多新功能,为了让我们的项目可以安全稳定运行,我们需要定期升级中间件,升级中间件就需要涉及数据迁移,如果ACL规则不持久化到文件,每次升级后都得重新以命令方式添加所有ACL配置是很麻烦的,如果持久化了则只需要简单执行加载命令即可,其次持久化在集群环境中也很好用,集群环境中,我们可以在其中一个实例中添加好ACL规则,然后拷贝到其他实例服务上加载进去就可以了。
4.2. ACL文件路径设置
需要在redis.conf文件中指定acl文件路径
aclfile /opt/redis/users.acl
4.3. 持久化ACL配置
acl save
4.4. 加载ACL配置
acl load
注:如需了解更多关于ACL配置内容,可前往Redis官网ACL文档进行学习。