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 categories
    when 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 can
    be used to specify a different size.
LIST
    Show users details in config file format.
LOAD
    Reload users from the ACL file.
LOG [<count> | RESET]
    Show the ACL log entries.
SAVE
    Save the current config to the ACL file.
SETUSER <username> <attribute> [<attribute> ...]
    Create or modify a user with the specified attributes.
USERS
    List all the registered usernames.
WHOAMI
    Return the current connection username.
HELP
    Print 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 的配置因为支持 正则表达式 ,所以还能给出各种不同的表达式,这个正则表达式就推荐更多的小伙伴自行去尝试吧。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第五十八天丨 动态规划part18

739. 每日温度 思路 首先想到的当然是暴力解法&#xff0c;两层for循环&#xff0c;把至少需要等待的天数就搜出来了。时间复杂度是O(n^2) 那么接下来在来看看使用单调栈的解法。 什么时候用单调栈呢&#xff1f; 通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边…

智能配电房管理系统

智能配电房管理系统依托电易云-智慧电力物联网&#xff0c;是一种集成了互联网、物联网、大数据、人工智能等先进技术的管理系统&#xff0c;专门用于配电房的智能化管理和运维。以下是智能配电房管理系统的主要功能和特点&#xff1a; 一、主要功能&#xff1a; 实时监测与数据…

SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法

AND 运算符 SQL的AND运算符用于根据多个条件筛选记录&#xff0c;确保所有条件都为TRUE才返回记录。下面是AND运算符的基本语法&#xff1a; SELECT column1, column2, ... FROM table_name WHERE condition1 AND condition2 AND condition3 ...;column1, column2,等是您要选…

Go 语言数组基础教程 - 数组的声明、初始化和使用方法

数组用于在单个变量中存储相同类型的多个值&#xff0c;而不是为每个值声明单独的变量。 声明数组 在Go中&#xff0c;有两种声明数组的方式&#xff1a; 使用var关键字&#xff1a; 语法 var array_name [length]datatype{values} // 这里定义了长度 或者 var array_n…

Typora for Mac:打造全新文本编辑体验

Typora for Mac是一款与众不同的文本编辑器&#xff0c;它不仅拥有直观易用的界面&#xff0c;还融合了Markdown语法和富文本编辑的功能&#xff0c;为用户带来了前所未有的写作和编辑体验。 一、简洁明了的界面设计 Typora for Mac的界面简洁明了&#xff0c;让用户可以专注…

【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷F

1、常见的加密算法可以分为对称加密算法和非对称加密算法&#xff0c;以下关于它们的描述正确的是 A、AES是一种常见的非对称加密算法 B、凯撒密码是一种非对称加密 C、非对称加密算法的解密使用的秘钥与加密不同 D、对称加密算法无法被暴力破解 答案&#xff1a;C 2、12根…

我为什么开始写技术博客

今天没有技术文章&#xff0c;只是想聊聊认真做CSDN和公众号以来的一些感想。 1.为什么开启技术分享 我不算是一个聪明的人&#xff0c;没有过目不忘的本事&#xff0c;所以从工作开始就养成了做笔记的习惯&#xff1b; 最开始15、16年做模型开发&#xff0c;那时候环境其实就…

LINUX入门篇【6】----第一个LINUX小程序---进度条及相关知识讲解

前言&#xff1a; 本篇我们将开始尝试构建我们的第一个LINUX的小程序----进度条作为一个十分常见的程序&#xff0c;在我们之后的工程实践中也是需要多次运用&#xff0c;但是介于我们目前还没有去学习网络等方面的知识&#xff0c;没法独立的去利用程序去下载一个真正的程序&…

Humanoid Robotics Whole Body Control(WBC)全身控制

系列文章目录 文章目录 系列文章目录前言一、ROS —— 什么是全身控制&#xff1f;二、IEEE - RAS三、维也纳工业大学 —— 自动化与控制研究所&#xff08;ACIN&#xff09;四、IIt&#xff08;意大利技术研究院&#xff09; 前言 谷歌的几种解释 一、ROS —— 什么是全身控制…

PPT基础入门

目录 相关设置快捷键shift 快捷键Ctrl 快捷键Ctrl Shift 组合快捷键快捷键总结 相关设置 设置撤回次数 自动保存 图片压缩 字体嵌入&#xff1a;目的是在不同的电脑上保留已经设置好的字体 多格式导出 &#xff08;1&#xff09;可以导出PDF &#xff08;2&#xff09;可以导…

简单线性回归函数

简单线性回归函数 定义术语理解简单线性回归例子 定义 线性回归&#xff1a;利用线性回归方程中最小平方函数对一个或多个自变量和因变量之间关系进行建模的一个回归分析。该建模的目标为找到各个系数的最佳值让预测误差最小 简单线性回归&#xff1a;只有一个自变量的线性回…

2023.11.18 每日一题(AI自生成应用)【C++】【Python】【Java】【Go】 动态路径分析

目录 一、编程挑战&#xff1a;动态时间序列分析 实际应用&#xff1a; 实现提示&#xff1a; 二、实现 1. C 2. Python 3. JAVA 4. Go 一、编程挑战&#xff1a;动态时间序列分析 问题描述&#xff1a; 假设你是一名软件工程师&#xff0c;需要开发一个应用来分析和预…

贝茄莱BR AS实时数据采集功能

实时数据采集功能在PLC系统调试过程中&#xff0c;有助于调试人员对变量变化进行监测&#xff0c;通过波形对比&#xff0c;反应不同变量间的相互作用。该测试目的在于验证贝加莱系统组态软件的实时数据采集功能。 贝加莱系统组态软件提供Trace功能&#xff0c;连接PLC&#x…

如何在远程协同视频会议中确保安全性?

随着远程工作的普及&#xff0c;远程协同视频会议已成为企业和团队之间进行交流和协作的重要工具。与此同时&#xff0c;会议中的安全性问题也日益凸显。本文将介绍如何在远程协同视频会议中确保安全性&#xff0c;主要包括以下方面&#xff1a; 1、内网部署 将会议服务器部署…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(五)

公共字段自动填充 1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3 步骤三 1.4 功能测试 1.1 问题分析 在前面我们已经完成了后台系统的员工管理功能和菜品分类功能的开发&#xff0c;在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修…

【开源】基于Vue和SpringBoot的婚恋交友网站

项目编号&#xff1a; S 057 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S057&#xff0c;文末获取源码。} 项目编号&#xff1a;S057&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 会员管理模块2.3 新…

腾讯云轻量4核8G12M带宽服务器租用价格和S5实例报价

腾讯云4核8G服务器优惠价格表&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;阿腾云atengyun.com分享腾讯云4核8G服务器详细配置、优惠价格及限制条件&…

llvm源码windows编译

1.克隆llvm源码: git clone --config core.autocrlf=false https://github.com/llvm/llvm-project.git 2.创建build文件夹并生成makefile 生成前置条件: cmake ,ninja,python3要先安装 cmake -S llvm -B build -G Ninja -DCMAKE_BUILD_TYPE=Release 生成成功 3.编译 进…

场景交互与场景漫游-场景漫游器(6)

场景漫游 在浏览整个三维场景时&#xff0c;矩阵变换是非常关键的&#xff0c;通过适当的矩阵变换可以获得各种移动或者渲染效果。因此&#xff0c;在编写自己的场景漫游操作器时&#xff0c;如何作出符合逻辑的矩阵操作器是非常重要的&#xff0c;但这对初学者来说还是有一定难…

Flutter笔记:桌面端应用多窗口管理方案

Flutter笔记 桌面端应用多窗口管理方案 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/134468587 【简介…