Redis 6.0 新特性 ACL 介绍

Intro

在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是没有用户的概念的,其实没有办法很好的控制权限,redis 6.0 开始支持用户,可以给每个用户分配不同的权限来控制权限。

下面我们就来介绍一下 Redis 6.0 中的 ACL 吧,下面的示例可以通过 docker 运行了一个 redis-6.0 的容器来实验的

运行一个 redis 6.0 的 docker 容器

因为我本地已经装了一个 redis,6379 端口已经被禁用了,所以使用了 16379 端口

docker run -d --name=redis-server-6.0 -p 16379:6379 redis:6.0-alpine

创建成功之后就可以使用 redis-cli 连上去了

我是直接用的本地的 redis-cli,如果本地没有也可以使用 docker 容器内部的 redis-cli,

docker exec -it redis-server-6.0 redis-cli

AUTH

在 redis 的之前版本中是有一个 “AUTH” 命令,但是之前的版本只是支持一个 Password,是没有用户的概念的,这就导致所有的客户端相当于是使用同一个账户来操作 redis 的,redis 6.0 扩展了 AUTH 的语法:

AUTH <username> <password>

同时也兼容了旧版本的 AUTH

AUTH <password>

使用这种方式时,也就是只提供密码,相当于使用了一个默认的用户 “default”,通过这样的方式,实现了对低版本的兼容

ACL

ACL 使用场景

在使用 ACL 之前,您可能会问自己,这个功能主要用来干嘛,它能帮我实现什么,ACL 可以帮助你实现下面两个主要目标:

  • 通过限制对命令和密钥的访问来提高安全性,以使不受信任的客户端无法访问,而受信任的客户端仅具有对数据库的最低访问级别才能执行所需的工作。例如,某些客户端可能仅能够执行只读命令,
  • 提高操作安全性,以防止由于软件错误或人为错误而导致进程或人员访问 Redis,从而损坏数据或配置。例如,没有必要让工作人员从 Redis 调用 FLUSHALL 命令。

ACL的另一种典型用法与托管Redis实例有关。Redis通常由管理内部Redis基础结构的内部公司团队为其所拥有的其他内部客户提供的一项托管服务,或者由云提供商在软件即服务设置中提供。

在这两种设置中,我们都希望确保为客户排除配置命令。过去,通过命令重命名来完成此操作的方法是一种技巧,它使我们可以长时间不用 ACL 生存,但使用体验并不理想。

通过 ACL 命令来配置 ACL 规则

ACL是使用 DSL(domain specific language)定义的,该 DSL 描述了给定用户能够执行的操作。此类规则始终从左到右从第一个到最后一个实施,因为有时规则的顺序对于理解用户的实际能力很重要。

默认情况下,有一个用户定义,称为default。

我们可以使用 ACL LIST 命令来检查当前启用的 ACL 规则

127.0.0.1:6379> ACL LIST
1) "user default on nopass ~* +@all"

参数说明:

参 数 说明
user 用户
default 表示默认用户名,或则自己定义的用户名
on 表示是否启用该用户,默认为off(禁用)
#... 表示用户密码,nopass表示不需要密码
~* 表示可以访问的Key(正则匹配)
+@ 表示用户的权限,“+”表示授权权限,有权限操作或访问,“-”表示还是没有权限; @为权限分类,可以通过 ACL CAT 查询支持的分类。+@all 表示所有权限,nocommands 表示不给与任何命令的操作权限

权限对key的类型和命令的类型进行了分类,如有对类型进行分类:string、hash、list、set、sortedset,和对命令类型进行分类:connection、admin、dangerous。

执行 ACL CAT 可以查看支持的权限分类列表

127.0.0.1:6379> ACL CAT
1) "keyspace"
2) "read"
3) "write"
4) "set"
5) "sortedset"
6) "list"
7) "hash"
8) "string"
9) "bitmap"
10) "hyperloglog"
11) "geo"
12) "stream"
13) "pubsub"
14) "admin"
15) "fast"
16) "slow"
17) "blocking"
18) "dangerous"
19) "connection"
20) "transaction"
21) "scripting" -- 返回指定类别中的命令
> ACL CAT hash
1) "hsetnx"
2) "hset"
3) "hlen"
4) "hmget"
5) "hincrbyfloat"
6) "hgetall"
7) "hvals"
8) "hscan"
9) "hkeys"
10) "hstrlen"
11) "hget"
12) "hdel"
13) "hexists"
14) "hincrby"
15) "hmset"

配置用户权限

我们可以通过两种主要方式创建和修改用户:

  • 使用 ACL 命令及其 ACL SETUSER 子命令。
  • 修改服务器配置(可以在其中定义用户)并重新启动服务器,或者如果我们使用的是外部 ACL 文件,则只需发出 ACL LOAD 即可。
+<command>:将命令添加到用户可以调用的命令列表中,如+@hash
-<command>: 将命令从用户可以调用的命令列表中移除
+@<category>: 添加一类命令,如:@admin, @set, @hash ... 可以`ACL CAT` 查看具体的操作指令。特殊类别@all表示所有命令,包括当前在服务器中存在的命令,以及将来将通过模块加载的命令
-@<category>: 类似+@<category>,从客户端可以调用的命令列表中删除命令
+<command>|subcommand: 允许否则禁用特定子命令。注意,这种形式不允许像-DEBUG | SEGFAULT那样,而只能以“ +”开头
allcommands:+@all的别名,允许所有命令操作执行。注意,这意味着可以执行将来通过模块系统加载的所有命令。
nocommands:-@all的别名,不允许所有命令操作执行。

使用 ACL SETUSER 命令

首先,让我们尝试最简单的 ACL SETUSER 命令调用:

> ACL SETUSER alice
OK

在上面的示例中,我根本没有指定任何规则。如果用户不存在,这将使用just created的默认属性来创建用户。如果用户已经存在,则上面的命令将不执行任何操作。

让我们检查一下默认的用户状态:

> ACL LIST
1) "user alice off -@all"
2) "user default on nopass ~* +@all"

刚创建的用户“ alice”为:

处于关闭状态,即已禁用。 AUTH 将不起作用。

无法访问任何命令。请注意,默认情况下,该用户是默认创建的,无法访问任何命令,因此-@all可以忽略上面输出中的,但是 ACL LIST 尝试是显式的,而不是隐式的。

最后,没有用户可以访问的密钥模式。

用户也没有设置密码。

这样的用户是完全无用的。让我们尝试定义用户,使其处于活动状态,具有密码,并且仅可以使用GET命令访问以字符串“ cached:”开头的键名称。

> ACL SETUSER alice on >p1pp0 ~cached:* +get
OK

现在,用户可以执行某些操作,但是会拒绝执行其他没有权限的操作:

> AUTH alice p1pp0
OK
> GET foo
(error) NOPERM this user has no permissions to access one of the keys used as arguments
> GET cached:1234
(nil)
> SET cached:1234 zap
(error) NOPERM this user has no permissions to run the 'set' command or its subcommand

事情按预期进行。为了检查用户alice的配置(请记住用户名区分大小写),可以使用 ACL LIST的替代方法 ACL GETUSER

> ACL GETUSER alice
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "2d9c75..."
5) "commands"
6) "-@all +get"
7) "keys"
8) 1) "cached:*"

如果我们使用RESP3,则输出的可读性可能更高,因此将其作为地图回复返回:

> ACL GETUSER alice
1# "flags" => 1~ "on"
2# "passwords" => 1) "2d9c75..."
3# "commands" => "-@all +get"
4# "keys" => 1) "cached:*"

多次调用ACL SETUSER会发生什么

了解多次调用 ACL SETUSER 会发生什么非常重要。重要的是要知道,每个SETUSER调用都不会重置用户,而只会将ACL规则应用于现有用户。

仅在之前不知道的情况下才重置用户:

在这种情况下,将使用归零的ACL创建一个全新的用户,即该用户无法执行任何操作,被禁用,没有密码等等:为了安全起见,最佳默认值。

但是,以后的调用只会逐步修改用户,因此例如以下调用顺序将导致 myuser 能够同时调用 GETSET

> ACL SETUSER myuser +set
OK
> ACL SETUSER myuser +get
OK > ACL LIST
1) "user default on nopass ~* +@all"
2) "user myuser off -@all +set +get"

使用外部 ACL 文件

有两种方法可以将用户存储在Redis配置中,一种是 redis.conf 中配置,一种是使用一个独立的外部 acl 文件,这两种方式不兼容,只能选择一种方式

通常外部文件的方式更灵活,推荐使用。

内部redis.conf和外部ACL文件中使用的格式是完全相同的,因此从一个切换到另一个很简单

配置内容如下:

user <username> ... acl rules ...

来看一个示例:

user worker +@list +@connection ~jobs:* on >ffa9203c493aa99

当您要使用外部ACL文件时,需要指定名为的配置指令 aclfile,如下所示:

aclfile /etc/redis/users.acl

当仅在redis.conf 文件内部直接指定几个用户时,可以使用CONFIG REWRITE以便通过重写将新的用户配置存储在文件中。

但是,外部ACL文件功能更强大。您可以执行以下操作:

  • 使用 ACL LOAD 重新加载外部 ACL 文件,通常在你手动修改了这个文件,希望 redis 重新加载的时候使用,需要注意的是要确保 acl 文件内容的正确性
  • 使用 ACL SAVE 将当前 ACL 配置保存到一个外部文件

More

redis 6.0 的 ACL 特性为我们带来了更好的权限控制方案,安全性更好,有需要的快来体验一下吧

Reference

Redis 6.0 新特性 ACL 介绍的更多相关文章

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

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

  2. Apache Spark 2.2.0 新特性详细介绍

    本章内容: 待整理 参考文献: Apache Spark 2.2.0新特性详细介绍 Introducing Apache Spark 2.2

  3. 权限控制终于来了!Redis 6.0新特性——ACLs

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

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

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

  5. redis 6.0新特性

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

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

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

  7. Redis4.0新特性

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

  8. C# 9.0 新特性之模式匹配简化

    阅读本文大概需要 2 分钟. 记得在 MS Build 2020 大会上,C# 语言开发项目经理 Mads Torgersen 宣称 C# 9.0 将会随着 .NET 5 在今年 11 月份正式发布. ...

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

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

随机推荐

  1. JVM源码分析之Object.wait/notify(All)完全解读

    概述 本文其实一直都想写,因为各种原因一直拖着没写,直到开公众号的第一天,有朋友再次问到这个问题,这次让我静心下来准备写下这篇文章,本文有些东西是我自己的理解,比如为什么JDK一开始要这么设计,初衷是 ...

  2. 如何从OutLook正确取得定期会议的时间?(待解决)

    背景: 用Microsoft.Office.Interop.Outlook取得日历项,然后根据业务要求筛选. 现象: 如果是定期会议,使用AppointmentItem.Start/End取得的是该定 ...

  3. 关于HTTP 请求方式: GET和POST的比较的本质

    什么是HTTP? 超文本传输协议(HyperText Transfer Protocol -- HTTP)是一个设计来使客户端和服务器顺利进行通讯的协议. HTTP在客户端和服务器之间以request ...

  4. JavaWeb网上图书商城完整项目--21.用户模块各层相关类的创建

    1.现在要为user用户模块创建类 用户模块功能包括:注册.激活.登录.退出.修改密码. User类对照着t_user表来写即可.我们要保证User类的属性名称与t_user表的列名称完全相同. 我们 ...

  5. SSH网上商城二

    1.实现的功能如下 当用户登陆成功之后,在首页显示所有的一级分类 显示热门商品 显示最新商品 当用户点击某个一级分类的菜单选项的时候,显示当前一级分类菜单项下所有的二级分类,并且按照分页的形式显示该二 ...

  6. ASP.NET Core Blazor Webassembly 之 渐进式应用(PWA)

    Blazor支持渐进式应用开发也就是PWA.使用PWA模式可以使得web应用有原生应用般的体验. 什么是PWA PWA应用是指那些使用指定技术和标准模式来开发的web应用,这将同时赋予它们web应用和 ...

  7. oracle闪回,找回已提交修改的记录

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/qq_24521431/article/details/84580166 例如删除ward_id为96 ...

  8. Nginx配置upstream实现负载均衡1

    如果Nginx没有仅仅只能代理一台服务器的话,那它也不可能像今天这么火,Nginx可以配置代理多台服务器,当一台服务器宕机之后,仍能保持系统可用.具体配置过程如下: 1. 在http节点下,添加ups ...

  9. 09 . Prometheus监控tomcat+jvm

    List CentOS7.3 prometheus-2.2.1.linux-amd64.tar.gz redis_exporter-v0.30.0.linux-amd64.tar.gz 节点名 IP ...

  10. 宿主机ping不通虚拟机,虚拟机能ping通宿主机问题

    打开虚拟机管理器,点开设置=>网络,网络选的是NAT,所以宿主机不能直接ping能虚拟机!!! 问题描述 查看虚拟机ip,  #ifconfig如下图: 宿主机ping虚拟机ip,无法通信,如下 ...