Redis 6.0 新特性 ACL 介绍

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 CAT1) "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 hash1) "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

  • https://redis.io/topics/acl

  • https://redis.io/commands/auth

  • https://www.cnblogs.com/zhoujinyi/p/13222464.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308710.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Spring5]IOC容器_Bean管理_bean的作用域和bean的生命周期

IOC操作Bean管理&#xff08;bean作用域&#xff09; 1.在Spring里面&#xff0c;设置创建bean实例是单实例还是多实例 2.在Spring里面&#xff0c;默认情况下&#xff0c;bean是单实例对象 package com.atguigu.spring.test;import com.atguigu.spring.collectiontype.Book…

创建型设计模式总结

创建型设计模式总结Intro前面几篇文章已经把创建型设计模式都介绍了&#xff0c;来做一个简单的总结。创建型设计模式&#xff0c;就是用来创建对象的设计模式&#xff0c;根据要创建的对象的复杂度以及是否允许多实例以及是否需要容易扩展等多方面考虑去选择合适的设计模式来创…

手动造轮子——为Ocelot集成Nacos注册中心

前言近期在看博客的时候或者在群里看聊天的时候&#xff0c;发现很多都提到了Ocelot网关的问题。我之前也研究过一点&#xff0c;网关本身是一种通用的解决方案&#xff0c;主要的工作就是拦截请求统一处理&#xff0c;比如认证、授权、熔断、限流、注册发现、负载均衡等等。随…

[Spring5]IOC容器_Bean管理XML方式_自动装配

IOC操作Bean管理&#xff08;xml自动装配&#xff09; package com.atguigu.spring.autowire;public class Dept {Overridepublic String toString() {return "Dept{}";} }package com.atguigu.spring.autowire;public class Emp {private Dept dept;public void se…

程序员修神之路--简约而不简单的分布式通信基石

点击“蓝字”关注&#xff0c;领取架构书籍菜菜哥&#xff0c;请教一个问题呗面试又被卡住了&#xff1f;还是你了解我呀&#xff0c;tcp协议面向连接是怎么回事呢&#xff1f;这个说详细起来&#xff0c;那本好几百页的tcp协议的书籍你倒是可以看看分布式系统可以总结为是处于…

[Spring5]IOC容器_Bean管理XML方式_外部属性文件

IOC操作Bean管理&#xff08;外部属性文件&#xff09; 1.直接配置数据库信息 &#xff08;1&#xff09;配置德鲁伊druid连接池 &#xff08;2&#xff09;引入德鲁伊druid连接池依赖jar包 <!--直接配置连接池--><bean id "dataSource" class "c…

[Spring5]IOC容器_Bean管理注解方式_创建对象

IOC操心Bean管理&#xff08;基于注解方式&#xff09; 1.什么是注解 &#xff08;1&#xff09;注解是代码特殊标记&#xff0c;格式&#xff1a;注解名称(属性名称属性值,属性名称属性值…) &#xff08;2&#xff09;使用注解&#xff0c;注解作用在类上面&#xff0c;方…

一个有趣的问题, 你知道SqlDataAdapter中的Fill是怎么实现的吗

一&#xff1a;背景1. 讲故事最近因为各方面原因换了一份工作&#xff0c;去了一家主营物联柜的公司&#xff0c;有意思的是物联柜上的终端是用 wpf 写的&#xff0c;代码也算是年久失修&#xff0c;感觉技术债还是蛮重的&#xff0c;前几天在调试一个bug的时候&#xff0c;看到…

[Spring5]IOC容器_Bean管理注解方式_组件扫描配置细节

开启组件扫描细节配置 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springf…

一文说通C#中的异步编程

天天写&#xff0c;不一定就明白。又及&#xff0c;前两天看了一个关于同步方法中调用异步方法的文章&#xff0c;里面有些概念不太正确&#xff0c;所以整理了这个文章。一、同步和异步。先说同步。同步概念大家都很熟悉。在异步概念出来之前&#xff0c;我们的代码都是按同步…

[Spring5]IOC容器_Bean管理注解方式_注入属性@Autowired_@Qualified_@Resource_@Value

基于注解方式实现属性注入 &#xff08;1&#xff09;AutoWired&#xff1a;根据属性类型进行自动装配 第一步 把service和dao对象创建&#xff0c;在service和dao类添加创建对象注解 第二步 在service注入dao对象&#xff0c;在service类添加dao类型属性&#xff0c;在属性…

.Net Core in Docker极简入门(上篇)

点击上方蓝字"小黑在哪里"关注我吧环境准备Docker基础概念Docker基础命令Docker命令实践构建Docker镜像Dockerfilebulid & run前言Docker 是一个开源的应用容器引擎&#xff0c;它十分火热&#xff0c;如今几乎成为了后端开发人员必须掌握的一项技能。即使你在生…

ASP.NET Core中的内存缓存

ASP.NET Core中的内存中缓存让我们看看如何通过缓存优化ASP.NET Core应用程序性能我相信&#xff0c;在我们的工作中&#xff0c;每个人都收到来自客户的请求或来自我们应用程序用户的反馈&#xff0c;以提高响应速度。如果在编写代码时仅使用最佳实践还不够&#xff0c;那么我…

[Spring5]IOC容器_Bean管理注解方式_完全注解开发

完全注解开发 &#xff08;1&#xff09;创建配置类&#xff0c;替代xml配置文件 package com.atguigu.spring.config;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;Configuration //作为配置…

ASP.NET Core在 .NET 5 Preview 7的更新

.NET 5 Preview 7现在可以用了&#xff0c;可以进行评估了。这是此版本中的新增功能&#xff1a;Blazor WebAssembly应用程序现在针对.NET 5更新了Blazor WebAssembly的调试要求Blazor的可访问性改进Blazor的性能改进证书认证性能改进发送HTTP/2 PING帧支持Kestrel套接字传输中…

[Spring5]AOP底层原理

AOP底层原理 1.AOP底层使用动态代理 &#xff08;1&#xff09;有两种情况动态代理 第一种 有接口的情况&#xff0c;使用JDK动态代理 a.创建接口实现类代理对象&#xff0c;增强类的方法 第二种 没有接口的情况&#xff0c;使用CGLIB动态代理 a.创建子类的代理对象&#…

Hangfire定时触发作业,好像很简单?

【导读】本节我们继续稍微详细讲讲在我没有详细了解源码的前提下来探讨通过Hangfire定时触发作业有哪些需要注意的事项间隔时间内执行作业举个栗子&#xff0c;每隔10秒监控系统CPU&#xff0c;若CPU飙高&#xff08;根据实际业务定义百分比&#xff09;则在控制台打印输出&…

[Swagger2]Swagger简介

Swagger简介 前后端分离 前端 -> 前端控制层、视图层 后端 -> 后端控制层、服务层、数据访问层 前后端通过API进行交互 前后端相对独立且松耦合 产生的问题 前后端集成&#xff0c;前端或者后端无法做到“及时协商&#xff0c;尽早解决”&#xff0c;最终导致问题…

五分钟快速搭建Serverless免费邮件服务

1. 引言本文将带你快速基于 Azure Function 和 SendGrid 构建一个免费的Serverless&#xff08;无服务器&#xff09;的邮件发送服务&#xff0c;让你感受下Serverless的强大之处。该服务可以每月免费发送2,5000封&#xff0c;这是完全白嫖啊&#xff0c;感兴趣的&#xff0c;赶…

[Swagger2]SpringBoot集成Swagger

SpringBoot集成Swagger 引入依赖 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</…