目录
1. 简介
Redis(Remote Dictionary Server),即远程字典服务,是一个使用 C编写的开源(BSD许可)、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,是现在最受欢迎的NoSQL数据库之一。依赖于Redis的高性能、多数据类型等特性,Redis应用场景十分广泛,可用于游戏缓存应用、互联网缓存应用、电商高并发应用及其他缓存加速访问应用,能有效承载巨大的读写压力,轻松实现高并发访问。
Redis最新版本为Redis6.X,其中有Redis6.0.X及Redis6.2.X两个分支。Redis6.0中已于2020年上半年发布,6.0版本最新已发布至6.0.15。Redis6.0带来了诸多新功能:
- 新增ACL权限控制,可实现账号的权限管控;
- 新增TLS加密管理,可实现Redis加密访问控制;
- 多线程IO,可实现单个Redis实例更高性能。
除此之外,Redis6.0还有RESP3协议、客户端缓存加速及redis-benchmark、redis-cli优化等新功能。
本文主要对Redis6.0的ACL权限管控、TLS加密管理及多线程IO进行了测试验证和解析。
2. 新功能测试验证
2.1 新功能——ACL权限控制
2.1.1 ACL简介
Redis ACL 是Access Control List(访问控制列表)的缩写,该功能允许对访问 Redis 的连接做一些可执行命令和可访问 KEY 的限制。它的工作方式是,在连接之后,要求客户端进行身份验证,以提供用户名和有效密码,如果身份验证成功,该客户端连接与给定用户绑定,并具有该用户的访问权限。
Redis6.0版本之前,用户只有一个default用户,同一Redis实例所有读写操作都共享此用户,难免出现误操作删除数据或泄露数据情况。虽然可以使用rename命令禁用部分敏感操作,但也同时意味着需要进行敏感操作时,将有额外操作需要进行,权限管控复杂且不完善。在Redis6.0之后,通过ACL(权限管理)功能,可以设置不同的用户并对其授权命令或数据权限。这一功能,可以有效降低用户误操作导致数据丢失或数据泄露风险。其中,密码由SHA256进行加密。
Tips:linux下sha256加密方式:echo -n passowrd | sha256sum
2.1.2 ACL 参数解析
本章节简要说明ACL常用命令,以及笔者使用时遇到的问题和需关注的地方。
常用的命令如下:
参数 | 说明 |
---|---|
CAT | 查看类别 |
DELUSER | 删除用户 |
GENPASS | 创建密码 |
GETUSER | 获得用户 |
HELP | 帮助 |
LIST | 查看用户详情 |
LOAD | 加载aclfile |
SAVE | 保存至aclfile |
SETUSER | 设置用户 |
USERS | 查看用户 |
WHOAMI | 查看当前用户 |
LOG | 显示日志 |
1)ACL CAT示例:
ACL将所有命令分为21子类,ACL可以较细粒度地进行权限划分,但部分命令同时处于不同的权限子类中,设置多个子类权限时,需关注这些命令权限问题。
2)ACL LIST 示例:
通过ACL生成的用户以如下default、test账号为例,进行简要说明:
参数 | 说明 |
---|---|
user test | 代表用户是test |
on | 代表用户是启用的,如果是off,代表用户是禁用的,在off状态下,登录会失败; |
#e...cc7 | 是sha256加密后的密码串 |
~* | ~为添加指定模式的键(~*代表allkeys) |
+ | 代表用户可以使用该命令,如果是 - ,代表用户无法使用该命令 |
@ | 用户可以使用某类别命令,类别可以通过acl cat获得 |
3)ACL SETUSER示例:
ACL SETUSER时,可通过“>”符号分次设置多个密码且密码均为有效;可通过“<”符号使密码无效化,不建议同一账号设置过多密码。当密码无法找回时,可先删除账号再建立相同权限用户方式更新密码,以防有效密码过多导致密码泄露进而导致数据泄露。
对default用户的权限设置需谨慎。笔者进行测试时,设置了一个与default完全相同的admin用户并将default用户权限缩小,因操作原因出现了权限不可用情况,尽可能保留default权限不删减。
普通用户赋权后,可通过auth username password方式登录普通账号。此方式登录需使用6.0及以上版本redis-cli客户端,低版本客户端无法识别,多版本混用需注意。
笔者测试时,一个实例中生成7000+普通账号,redis运行正常权限管控正常。示例如下:
acl setuser test1 >Admin123 ~* +get #账号test1,密码Admin123
acl setuser test2 >Admin123 ~* +set
acl setuser test2 >Admin123 ~* * +get +set
...
acl setuser test7000 >Admin123 ~* +@all
acl list #7000个用户显示正常
auth test7000 Admin123 #登陆正常
2.1.3 ACL 赋权配置及示例
(1)ACL权限持久化方式
通过上述的ACL SETUSER方式,对用户的账号进行了赋权后可进行持久化。Redis 实现ACL权限持久化的方式主要有两种:
① redis.conf方式:直接将账号密码持久化保存在redis.conf中;
② aclfile方式:将账号密码保存至users.acl文件中,并把users.acl 路径写入redis.conf。
两种方式中,更推荐aclfile方式。因为redis.conf方式加载配置需要重启Redis,而aclfile方式执行acl load即可。
此外,我们可以在客户端对账户密码进行操作,如果使用redis.conf方式,可通过config rewrite持久化;如果使用aclfile方式,可使用acl save进行持久化。
对比项 | redis.conf方式 | aclfile方式 |
---|---|---|
加载配置 | 重启Redis | 执行acl load |
持久化配置 | 执行config rewrite | 执行acl save |
(2)ACL权限持久化配置示例
两种持久化方式的示例如下:
① redis.conf方式
cat redis.conf | grep "~*"可得:
② aclfile方式
- cat users.acl,查看账号密码权限: