在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. 介绍一款自己实现的rabbit轻量级组件和使用方法

    DotNetCore.RabbitMQ.Extensions介绍 这是一个 基于.NETStandard 2.0的Rabbit轻量级框架,可以让开发人员无需关注底层变动,专注编写业务代码,从而达到便捷 ...

  2. JS基础-垃圾回收机制与内存泄漏的优化

    [V8引擎]浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略 垃圾回收机制 如何判断回收内容 如何确定哪些内存需要回收,哪些内存不需要回收,这是垃圾回收期需要解决的最基本问题.我们可以这样 ...

  3. CCF-CSP题解 201809-4 再卖菜

    碎碎念..近视加老花,还以为第二天除了第二家范围在100以内别的都不确定,于是x**算的记搜复杂度超时了.还鼓捣着什么差分区间最长路,虽然有大神用差分区间做出来了,然而自己并没有看懂. 其实就是一个记 ...

  4. webpack实践(四)- html-webpack-plugin

    webpack系列博客中代码均在github上:https://github.com/JEmbrace/webpack-practice <webpack实践(一)- 先入个门> < ...

  5. 《Java基础知识》Java方法重载和重写

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类 ...

  6. Goodbye 2019,Welcome 2020 | 沉淀 2020

    引言 时间如梭,娃都可以打酱油了. 转眼间第一个五年计划,已过了一半. 年终总结是个打脸的好地方,曾经夸下的海口,有的真的成了海口. 所幸,一切都在按好的方向发展.但乐观背后容易忽略潜在的问 ...

  7. 去掉 Idea 中注入 Mapper 警告的方法

    使用 Idea 的时候,自动装配 Mybatis 的 mapper.会一直出现红色波浪线的警告.看着难受.下面提供几种方式 方式一 为 @Autowired 注解设置required = false ...

  8. iOS----------证书的制作

    https://developer.umeng.com/docs/66632/detail/66748#createappid Certificates-> 卫生许可证 identifiers ...

  9. numpy输出有省略号的问题

    发现很多文章都说加一句 np.set_printoptions(threshold="nan") 或者 np.set_printoptions(threshold=np.nan) ...

  10. Nginx:The Location Block Selection Algorithm

    Nginx:The Location Block Selection Algorithm,摘自NGINX:A PRACTICAL GUIDE TO HIGH PERFORMANCE Nginx配置文件 ...