Redis 访问控制列表(ACL)

Redis ACL

  • 关于 Redis ACL
  • 与旧版本兼容
  • ACL help
  • ACL 配置模式
    • redis.conf 配置模式
    • 外部 ACL File 配置模式
  • ACL 规则
  • 总结

关于 Redis ACL

Redis ACL (访问控制列表) 是 Access Control List 的缩写,它允许某些连接在可以执行的命令和可以访问的密钥方面受到限制。它的工作方式是,在连接后,客户端需要提供 username/用户名 和有效 password/密码 来进行 authenticate/身份验证。如果身份验证成功,则连接将与给定用户和该用户的限制相关联。Redis 可以配置为新连接已经通过 “default” 用户的身份验证(这是默认配置)。配置默认用户的副作用是,可以仅为未明确验证的连接提供特定的功能子集。

与旧版本兼容

在默认配置中,Redis 6.0(第一个拥有 ACL 的版本)的工作方式与旧版本的 Redis 完全相同。每个新连接都能够调用每一个可能的命令并访问每一个密钥,因此 ACL 功能与旧客户端和应用程序向后兼容。此外,使用 requirepass 配置指令配置密码的旧方法仍然可以正常工作。但是,它现在为 “default” 用户设置了一个密码。

  • Redis6.0 之前的版本中,登陆 Redis Server 只需要输入密码(前提配置了 密码/requirepass )即可,不需要输入 username/用户名,而且密码也是明文配置到配置文件中,安全性不高。并且应用连接也使用该密码,导致应用有所有权限处理数据,风险也极高。
  • Redis6.0 有了 ACL 之后,终于解决了这些不安全的因素,可以按照不同的需求设置相关的用户和权限。

Redis ACL 是向后兼容的,即默认情况下用户为 default,使用的是 requirepass 配置的密码。要是不使用ACL 功能,对旧版客户端来说完全一样。Redis Auth可以有 2 种方式进行工作:

# 旧版本的使用方式,默认用户。兼容旧版本 Redis 的支持
AUTH <password>
# 新版本的使用方式,还需要验证用户名
AUTH <username> <password>
--user <username>  验证用户名
--pass <password>  验证密码,是参数 -a 的别名;配合 --user 使用
--askpass          强制用户输入带有 STDIN 掩码的密码

如果还按照老版本进行配置,那么新版的 redis 还是能够直接通过 密码 字符串来连接,以便和旧版本兼容。通过执行命令 ACL LIST 可以看出系统中有一个名称叫 default 的用户。默认情况下只输入 密码 就能通过 default 这个用户来连接 redis-server

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

ACL 描述规则说明:

参数规则说明
user用户(关键字)
default默认用户名称,此处可自定义
on是否启用该用户,默认为 off(禁用)
#…用户密码, nopass 表示不需要密码
~*可以访问的key(正则匹配)
+@all授权类型,授权方式说明如下介绍

授权方式说明:

参数说明
+授权用户操作命令权限
-回收用户操作命令权限
+@添加一类命令
-@回收一类命令
allcommands/+@all允许所有命令执行
nocommands/-@all不运行所有命令操作执行

由于 Redis 是高性能的数据库,正常情况下每秒可以接收百万级别的请求,因此我们的 用户/密码 一定要是非常复杂的组合,否则很容易就会被暴利跑字典给破解了。

ACL help

现在开始来说明如何在 Redis 中根据 ACL 来定制需要的用户权限。

首先看 ACLhelp,了解大致的使用方法:ACL help

# 进入 redis 容器
docker container exec -it redis6479 /bin/sh# 连接 redis 服务
redis-cli -c -h 192.168.48.190 -p 6479 -a '123456' --raw# 查看 ACL 帮助信息
192.168.48.190:6479> ACL help
ACL <subcommand> [<arg> [value] [opt] ...]. Subcommands are:
CAT [<category>]List all commands that belong to <category>, or all command categorieswhen no category is specified.
DELUSER <username> [<username> ...]Delete a list of users.
DRYRUN <username> <command> [<arg> ...]Returns whether the user can execute the given command without executing the command.
GETUSER <username>Get the user's details.
GENPASS [<bits>]Generate a secure 256-bit user password. The optional `bits` argument canbe used to specify a different size.
LISTShow users details in config file format.
LOADReload users from the ACL file.
LOG [<count> | RESET]Show the ACL log entries.
SAVESave the current config to the ACL file.
SETUSER <username> <attribute> [<attribute> ...]Create or modify a user with the specified attributes.
USERSList all the registered usernames.
WHOAMIReturn the current connection username.
HELPPrint this help.

ACL help 翻译说明:

  • ACL<子命令>〔<arg>〔value〕〔opt〕…〕。子命令包括:
    CAT [< category > ]
    列出属于 < category > 或所有命令类别的所有命令,当没有指定类别时。

  • DELUSER<用户名>〔<用户名>…〕
    删除用户列表。

  • DRYRUN<用户名><命令>〔<arg>…〕
    返回用户是否可以在不执行给定命令的情况下执行该命令。

  • GEUSER<用户名>
    获取用户的详细信息。

  • GENPASS[]
    生成一个安全的256位用户密码。可选的“bits”参数可以用于指定不同的大小。

  • LIST
    以配置文件格式显示用户详细信息。

  • LOAD
    从 ACL 文件重新加载用户。

  • LOG [< count >|RESET]
    显示ACL日志条目。

  • SAVE
    将当前配置保存到 ACL 文件中。

  • SETUSER<用户名><属性>〔<属性>…〕
    创建或修改具有指定属性的用户。

  • USERS
    列出所有注册的用户名。

  • WHOAMI
    返回当前连接用户名。

  • HELP
    打印此帮助。

ACL 配置模式

ACL存储模式

在介绍 ACLs 之前,我们先开启 ACL 配置。配置 ACL 的方式有两种:

  1. 用户可以直接在 redis.conf 文件中指定(推荐简单用例);
  2. 可以指定外部 ACL 文件(推荐复杂用例);

由于两种方式是相互不兼容的,所以 Redis 会要求你使用其中的一种。在 redis.conf 中指定用户适用于简单的用例。在复杂的环境中,当需要定义多个用户时,建议使用外部 ACL file,扩展性更佳。

redis.conf 配置模式

redis.conf 和外部 ACL file 中使用的格式是完全相同的,所以从一种方式切换到另一种方式的情况,不需要关注 ACL 命令格式的变化,如下所示:

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

举例:

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

注意:两种配置方式,对于存储新用户配置所使用的命令有所不同。

  • redis.conf 方式:使用 CONFIG REWRITE 来通过重写文件来存储新的用户配置。
  • ACL file 方式:使用 ACL SAVE 来通过重写文件来存储新的用户配置。

外部 ACL File 配置模式

  1. 如果之前使用了 redis.conf 模式,redis.conf 中会有之前已经生效的 DSL,我们需要注释掉。例如:
#user default on nopass ~* &* +@all
  1. 可能我们的 redis.conf 文件中还会有 requirepass 配置,当我们开启 ACL 之后,requirepass 将不在生效,这里我们也注释掉,当然如果不注释也不会有影响:
#requirepass default123
  1. config 文件中配置 aclfile 的路径,需要在 redis.conf 中添加:
# Using an external ACL file
#
# Instead of configuring users here in this file, it is possible to use
# a stand-alone file just listing users. The two methods cannot be mixed:
# if you configure users here and at the same time you activate the external
# ACL file, the server will refuse to start.
#
# The format of the external ACL user file is exactly the same as the
# format that is used inside redis.conf to describe users.
#
aclfile /data/redis7/users.acl# 这里需要注意如果是 docker 方式部署,引用的是 docker 容器中的挂载路径
aclfile /home/redis/conf/users.acl

注意:对应的 users.acl 文件要先建立好,不然重启 redis 时会报错。

创建 users.acl 文件并授权,执行如下命令:

touch /home/redis/conf/users.acl && chmod -R 777 /home/redis/conf/
  1. 重启 redis 即生效。(配置完成之后,default 用户属于无密码状态)

说明:

  • ACL 命令行 中设置的用户权限,不能持久化,redis 重启后就失效了。
  • 开启外部 aclfile 之后,不能使用 redis-cli -a xxx 登陆,必须使用 redis-cli --user xxx --pass yyy 来登陆。
  • aclfile 中的命令配置全部正确才会生效,反之会使用缓存上一次成功的信息。

关于 redis.conf 配置,请查看相关文档:

  • Redis Configuractionhttps://redis.io/docs/management/config/
  • Redis v7.2.0 的 redis.conf 详细配置信息https://raw.githubusercontent.com/redis/redis/7.2/redis.conf
  • Redis 集群配置文件 redis.conf 解析https://blog.csdn.net/qq_39677803/article/details/116239553

ACL 规则

关于 ACL 的规则列表,请自行查看官方文档:

  • Redis ACLhttps://redis.io/docs/management/security/acl/#acl-rules
  • Redis Configure-aclshttps://docs.redis.com/latest/rc/security/access-control/data-access-control/configure-acls/

相关博文推荐:

  • Redis Cluster 7.0 用户管理与 ACLs 权限控制,https://blog.csdn.net/weixin_40147979/article/details/128485222

总结

Redis 是一种高性能的缓存数据库,每秒可处理百万级的请求,如果没有很好的 ACL 控制,很可能会被暴力破解;在生产环境中,这是一种重大的安全影响因素,然而 Redis 6.0 扩展的 Auth 得以弥补这一隐患,助力安全生产。如果是新版本的 redis ≥ 6.0,推荐大家尝试外部 ACL file 方式配置来管理用户访问控制权限。

Redis ACL 用户管理方面,其中 key 的配置因为支持 正则表达式 ,所以还能给出各种不同的表达式,这个正则表达式就推荐更多的小伙伴自行去尝试吧。

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

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

相关文章

5-什么是猴子补丁,有什么用途?什么是反射,python中如何使用反射?http和https的区别?

1 什么是猴子补丁&#xff0c;有什么用途 **解释**1 Python猴子补丁&#xff08;Monkey Patch&#xff09;是一种在运行时动态修改代码的技术。通在不修改源代码的情况下&#xff0c;改变代码的执行方式或增加功能2 Monkey Patching是在 运行时(run time) 动态替换属性(attrib…

Vue 路由缓存 防止路由切换数据丢失 路由的生命周期

在切换路由的时候&#xff0c;如果写好了一丢数据在去切换路由在回到写好的数据的路由去将会丢失&#xff0c;这时可以使用路由缓存技术进行保存&#xff0c;这样两个界面来回换数据也不会丢失 在 < router-view >展示的内容都不会被销毁&#xff0c;路由来回切换数据也…

[LeetCode] 7.整数反转

一、题目描述 给你一个 32 位的有符号整数 x &#xff0c;返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] &#xff0c;就返回 0。 假设环境不允许存储 64 位整数&#xff08;有符号或无符号&#xff09;。 示例 1&am…

算法设计与分析复习--贪心(二)

文章目录 上一篇哈夫曼编码单源最短路最小生成树Kruskal算法Prim算法 多机调度问题下一篇 上一篇 算法设计与分析复习–贪心&#xff08;一&#xff09; 哈夫曼编码 产生这种前缀码的方式称为哈夫曼树 哈夫曼树相关习题AcWing 148. 合并果子 #include <iostream> #inc…

【Python百宝箱】视觉算法秀:Python图像处理舞台上的巅峰对决

前言 在数字化时代&#xff0c;图像处理技术已经成为科技和计算机领域中不可或缺的一部分。从医学影像到计算机视觉&#xff0c;图像处理为我们提供了无限的可能性。Python作为一种灵活而强大的编程语言&#xff0c;在图像处理领域表现出色&#xff0c;拥有丰富的库和工具。本…

RT-Thread STM32F407 BMI088--SPI

BMI088是一款高性能6轴惯性传感器&#xff0c;由16位数字三轴24g加速度计和16位数字三轴2000/ s陀螺仪组成。 这里用SPI来驱动BMI088进行数据解读 第一步&#xff0c;首先在 RT-Thread Settings中进行配置 第二步&#xff0c;退出RT-Thread Settings&#xff0c;进入board.h…

Linux|僵死进程

1.僵死进程产生的原因或者条件: 什么是僵死进程? 当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程. 简而言之,就是子进程先结束,并且父进程没有获取它的退出码; 那么僵死进程产生的原因或者条件就是:子进程先于父进程结束,并且父进程没有获取…

C#异常捕获try catch详细介绍

在C#中&#xff0c;异常处理是通过try、catch、finally和throw语句来实现的&#xff0c;它们提供了一种结构化和可预测的方法来处理运行时错误。 C#异常基本用法 try块 异常处理以try块开始&#xff0c;try块包含可能会引发异常的代码。如果在try块中的代码执行过程中发生了…

基于卡尔曼滤波实现行人目标跟踪

目录 1. 作者介绍2. 目标跟踪算法介绍2.1 目标跟踪背景2.2 目标跟踪任务分类2.3 目标跟踪遇到的问题2.4 目标跟踪方法 3. 卡尔曼滤波的目标跟踪算法介绍3.1 所用数据视频说明3.2 卡尔曼滤波3.3 单目标跟踪算法3.3.1 IOU匹配算法3.3.2 卡尔曼滤波的使用方法 3.4 多目标跟踪算法 …

rocketmq 安装dashboard1.0.0 mq消息控制台安装 rocketmq控制台安装 rocketmq-dashboard-1.0.0编译安装

1. 官网&#xff1a; 下载 | RocketMQ 2. dashboard安装包位置&#xff1a; 在连接最下面&#xff0c;点击download.zip即可 3. 需要安装maven, 编译命令&#xff1a; mvn clean install -U -Dmaven.test.skiptrue4. 启动jar: java -jar rocketmq-dashboard-1.0.0.jar &…

在线随机字符串生成工具

具体请前往&#xff1a;在线随机字符串生成器--通过该工具生成动态复杂随机密码,随机字符串等&#xff0c;加密盐等

Leetcode—141.环形链表【简单】

2023每日刷题&#xff08;三十三&#xff09; Leetcode—141.环形链表 快慢指针算法思想 关于快慢指针为什么能检测出环&#xff0c;可以这么思考。 假设存在一个环: 慢指针进入环后&#xff0c;快指针和慢指针之间相距为d&#xff0c;每一次移动&#xff0c;d都会缩小1&…

【项目设计】网络版五子棋游戏

文章目录 一、项目介绍1. 项目简介2. 开发环境3. 核心技术4. 开发阶段 二、环境搭建1. 安装 wget 工具2. 更换 yum 源3. 安装 lrzsz 传输工具4. 安装⾼版本 gcc/g 编译器5. 安装 gdb 调试器6. 安装分布式版本控制工具 git7. 安装 cmake8. 安装 boost 库9. 安装 Jsoncpp 库10. 安…

iOS线程

1.任务、线程、队列 每一个要执行的操作都是任务&#xff1a;比如说函数 一个队列中可以放很多个线程&#xff0c;一个线程中有很多个任务 可以这样看&#xff1a;有一个办事所&#xff08;队列&#xff09;&#xff0c;所里有很多窗口&#xff08;线程&#xff09;&#xff0c…

DM8共享集群DSC初始化DB实例报错

DM8共享集群DSC初始化DB实例报错 问题描述 启动dmcss和dmasmsvr服务启动后&#xff0c;初始化DB实例提示如下报错&#xff1a; [dmdbalocalhost DSC0]$ /dmdb8/dmdbms/bin/dminit control/dmdb8/dmdbms/dsc_config/DSC0/dminit.ini initdb V8 db version: 0x7000c file dm.k…

[AI]ChatGPT4 与 ChatGPT3.5 区别有多大

ChatGPT 3.5 注册已经不需要手机了&#xff0c;直接邮箱认证就可以&#xff0c;这可真算是好消息&#xff0c;坏消息是 ChatGPT 4 还是要收费。 那么 GPT-3.5 与 GPT-4 区别有多大呢&#xff0c;下面简单测试一下。 以从 TDengine 订阅数据为例&#xff0c;TDengine 算是不太小…

Appium自动化测试:通过appium的inspector功能无法启动app的原因

在打开appium-desktop程序&#xff0c;点击inspector功能&#xff0c;填写app的配置信息&#xff0c;启动服务提示如下&#xff1a; 报错信息&#xff1a; An unknown server-side error occurred while processing the command. Original error: Cannot start the cc.knowyo…

专业数据标注公司:景联文科技领航数据标注行业,满足大模型时代新需求

随着大模型的蓬勃发展和相关政策的逐步推进&#xff0c;为数据要素市场化配置的加速推进提供了有力的技术保障和政策支持。数据要素生产力度的不断提升&#xff0c;为数据标注产业带来了迅速发展的契机。 根据国家工信安全发展研究中心测算&#xff0c;2022年中国数据加工环节的…

leetcode (力扣) 201. 数字范围按位与 (位运算)

文章目录 题目描述思路分析完整代码 题目描述 给你两个整数 left 和 right &#xff0c;表示区间 [left, right] &#xff0c;返回此区间内所有数字 按位与 的结果&#xff08;包含 left 、right 端点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;left 5, right 7 输出…

c# 字符串转换为byte

c# 字符串转换为byte using System.Text; class proj {internal static void Main(string[] args){byte[] anew byte[3];Console.WriteLine("打印a");Console.WriteLine("a的长度{0}",a.Length);foreach (byte b in a){ Console.WriteLine(b); }a Encodi…