在2019年纽约的Redis Day上,Salvatore Sanfilippo(AKA Antirez)介绍了即将发布的Redis 6.0的新特性。以下是关于ACLs的内容。

ACLs简介

在过去的十年中,Redis都会有这样的问题:

用户执行FLUSHALL,OK现在整个数据库就空了,或者执行DEBUG SEGFAULT,然后Redis的进程就crash退出了。

(右侧运行redis-server,左侧执行debug segfault后server崩溃退出)

在以前解决这个问题的办法可能是在Redis配置中将危险命令进行rename:

rename-command FLUSHALL ""

这样将命令更名为随机字符串或者直接屏蔽掉,以满足需要。

缺少危险命令管理就会导致很多问题,比如当你使用网络上的一些库的时候,你压根就不知道别人会不会在里面加些FLUSHALL这样的命令,或者你也可以每次用外部代码都进行一轮Code Review。

ACLs,也就是Access Control List,当有了ACLs之后,你就可以控制比如:

当前的用户(连接)只允许使用RPOPLPUSH这些命令,其他命令都无法调用。

是不是很方便?来看看ACLs是怎么工作的。

最佳实践

首先你要做的是定义用户。

当登录的时候,旧版本中默认用户(defaule user)是可以做任何事的,在Redis 6.0中你可以定义默认用户:

127.0.0.1:6379> ACL setuser antirez on >password1 >password2 >foobar +@all ~*

setuser...on表示启用此用户,off则是只定义一个不可用(unaccessable)的用户。

>password1 >password2 >foobar表示设置了3个密码,可以用来做密码轮换策略。

+@all表示用户可以使用所有权限,+后面跟命令权限如+get,或者+@后面跟某一类权限。

~*表示可用(accessable)的键名,这里是*也就是所有键都可被访问。

127.0.0.1:6379> ACL WHOAMI
"default"

现在是处于默认用户下的,切换用户:

127.0.0.1:6379> AUTH antirez foobar
OK

在以前AUTH后面是直接跟密码的,现在是用户名和密码。

127.0.0.1:6379> ACL WHOAMI
"antirez"

因为之前给这个用户设置的是所有命令可用+所有键可见,所以现在跟default用户没有什么区别:

127.0.0.1:6379> GET foo
(nil)
127.0.0.1:6379> SET foo bar
OK

现在去掉一些权限:

127.0.0.1:6379> ACL setuser antirez -SET

把这个用户的SET权限去掉后,就不能进行这个操作了:

127.0.0.1:6379> GET foo
"bar"
127.0.0.1:6379> SET foo 123
(error) NOPERM this user has no permissions to run the 'set' command or its subcommand

再来查看一下现在的ACL list:

127.0.0.1:6379> ACL list
1) "user antirez on >password1 >password2 >foobar ~* +@all -set"
2) "user default on nopass ~* +@all"

类似的,你也可以限制用户可以用任何命令但是却只能看部分键,如object*

备注

ACLs的实现使用了一些小技巧,像用上了命令的位图(commands' bitmaps),以便让它不会在速度上有所下降。

不使用ACLs的话就和原来的Redis 5一样,使用ACLs当然会有一些额外的开销,但是它们非常小,你在benchmarks中不会察觉到新旧版本的区别。

权限控制终于来了!Redis 6.0新特性——ACLs的更多相关文章

  1. Redis 6.0 新特性 ACL 介绍

    Redis 6.0 新特性 ACL 介绍 Intro 在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是没有用户的概念的,其实 ...

  2. Redis 6.0 新特性-多线程连环13问!

    Redis 6.0 来了 在全国一片祥和IT民工欢度五一节假日的时候,Redis 6.0不声不响地于5 月 2 日正式发布了,吓得我赶紧从床上爬起来,学无止境!学无止境! 对于6.0版本,Redis之 ...

  3. redis 6.0新特性

    防止忘记,记录一下 1.多线程IO Redis 6引入多线程IO,但多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程.之所以这么设计是不想因为多线程而变得复杂,需要去控制 key. ...

  4. Redis 6.0 新特性:带你 100% 掌握多线程模型

    Redis 官方在 2020 年 5 月正式推出 6.0 版本,提供很多振奋人心的新特性,所以备受关注. 码老湿,提供了啥特性呀?知道了我能加薪么? 主要特性如下: 多线程处理网络 IO: 客户端缓存 ...

  5. Redis 7.0 新功能新特性总览

    说明:本文根据Redis 7 RC2 的release note 整理并翻译 近日,Redis 开源社区发布了7.0的两个预览版.在这两个预览版中,有很多Redis 7.0中新增加的特性,新增加的命令 ...

  6. Redis4.0新特性

    redis 4.0 新特性 Redis 4.0在2017年7月发布为GA.包含几个重大改进:更好的复制(PSYNC2),线程DEL / FLUSH,混合RDB + AOF格式,活动内存碎片整理,内存使 ...

  7. [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐

    [翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...

  8. Redis 4.0新功能介绍

    Redis 的作者 antirez 在三天之前通过博客文章<The first release candidate of Redis 4.0 is out>发布了 Redis 4.0 的第 ...

  9. Spring Boot 2(一):Spring Boot 2.0新特性

    Spring Boot 2(一):Spring Boot 2.0新特性 Spring Boot依赖于Spring,而Spring Cloud又依赖于Spring Boot,因此Spring Boot2 ...

随机推荐

  1. Python3 并发编程1

    目录 操作系统发展 穿孔卡片 批处理 多道技术(单核) 并发与并行 进程 程序与进程 进程调度 进程的三个状态 同步和异步 阻塞与非阻塞 僵尸进程与孤儿进程 守护进程 Python中的进程操作 Pro ...

  2. C# 导出pdf(浏览器不预览直接下载)

    一.接口部分的代码 [HttpGet] public HttpResponseMessage ExportPdf(string id) { string pdfName = ""; ...

  3. Vue底层实现原理总结

    要实现MVVM 响应式原理,要实现如下几点 1.实现一个数据监听器Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者 2.实现一个指令解析器Compile,对每个元素 ...

  4. 【Java8流】使用学习

    [Java8流]使用学习 ============================================= 1.删除子目录及文件 ============================== ...

  5. Java Swing JFrame实现全屏--无标题,无边框

    实现方式一: import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JFrame; public class T ...

  6. Java开发数据库设计的14个技巧,你知道几个?

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

  7. SQL中Group By和having的用法

    转自 ITGirl笑笑   一.GROUP BY GROUP BY语句用来与聚合函数(aggregate functions such as COUNT, SUM, AVG, MIN, or MAX. ...

  8. 新安装mariadb远程登陆配置及相关问题排查

    前言: 安装过程不再赘述,直接说问题,mysql的远程连接需要解决两个问题:1.允许root用户远程连接.2.允许任意ip远程连接数据库.当然,在测试和解决问题之前,得首先保证你的数据库与远程主机之间 ...

  9. django基础之day09,Forms组件在程序中做了哪些事? 校验数据、渲染标签、展示信息

    ******************************* Forms组件 *************************************************** Forms组件在 ...

  10. ajax数据交互

    目录 一.ORM查询优化 1-1. only与defer 1-2. select_related与prefatch_related 二.MTV与MVC模型 三.choices参数 四.AJAX 4-1 ...