Redis 6.0+ 的 ACL 机制

news2025/1/11 0:43:51

Redis Encryption


目录

    • 前言
    • 一、安装 Redis 服务
    • 二、创建 ACL 用户
    • 三、用户密码管理
      • 3.1 删除密码
      • 3.2 重置用户和密码
    • 四、权限管理
      • 4.1 key 管理
      • 4.2 权限管理
    • 五、ACL 用户存储
      • 5.1 配置文件实现
      • 5.2 外部 ACL 文件实现


前言

Redis 6.0+ 引入了 ACL 机制,类似 MySQL 一样全部权限管理,Redis 6.0 之前默认为 default 用户登录,该用户具备 root 权限,在生产中实际上是不安全的,因为只要具备 Redis 实例的密码,就可以以 root 身份对 Redis 进行操作。

因此 Redis 6.0+ 引入了 ACL 机制,ACL是使用 DSL(domain specific language)定义的,该 DSL 描述了给定用户能够执行的操作。那引用 ACL 的目的是什么呢?

  • 访问安全性:ACL 使不受信任的客户端无法访问,而受信任的客户端仅具有对数据库的最低访问级别才能执行所需的工作。
  • 操作安全性:以防止由于软件错误或人为错误而导致进程或人员访问 Redis,从而损坏数据或配置。例如,没有必要让其他人员从 Redis 调用 FLUSHALL 命令。

一、安装 Redis 服务

1、安装 Docker

2、安装 Redis

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

3、登录验证

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

image-20230418163454677

二、创建 ACL 用户

1、创建用户并设置明文密码

ACL SETUSER rab on >zhurs@123

# '>'符号后是明文密码

image-20230418162643165

2、创建用户并设置 Hash 密码

  • 获取 Hash 值

    echo -n "zhurs@123" | shasum -a 256
    

    image-20230418162937832

    随机获取 Hash 值密码

    image-20230419151021926

  • 创建用户

    ACL SETUSER ops on #a9db6465cac424cb70a81fae6f42cd63b7e2292b45795ea88695e9da2baea040
    
    # '#'符号后是Hash值
    

    image-20230418163257814

3、查看所有用户

会发现,不管是明文还是Hash设置密码,Redis 最终存储都是以 Hash 值存储密码。

image-20230418163600209

这些用户是没有权限的,如果你要在创建用户时添加权限,你可以:

ACL SETUSER rab on >zhurs@123 ~* +@all

# '~*' 表示该用户可以访问所有key
# '+@all' 表示拥有这些key的所有权   + 表示授权  - 表示销权

说明:

参数说明
user用户
default用户名(default为默认用户)- - 也可是自定义用户(redis 6.0+)
on是否启用该用户(on 启用,off 禁用)
#…用户密码(#… 密文形式显示,oppass 表示无密码)
~*用户可访问的 key(正则匹配 - - ~* 表示用户可访问所有 key)
+@用户权限,+ 代表授权,- 代表销权;@ 后为权限类型,+@all 表示用户对 redis 具备所有权限

4、查看指定用户信息

ACL GETUSER rab

image-20230418175412239

5、用户登录认证

# 6.0-
AUTH <密码>     # 这种方式的用户为default用户,相当于MySQL的root用户
# 6.0+
AUTH <用户> <密码>

AUTH rab zhurs@123

image-20230418175604891

Windows 客户端工具登录:

image-20230418174020712

正常连接:

image-20230418174311679

三、用户密码管理

3.1 删除密码

1、通过 <! 删除用户密码

删除密码后,AUTH 无法登录,redis 客户端也无法连接,想要连接,需再次设置密码。

相当于是删除密码,而不是设置密码为,如果要设置密码为,可使用nopass来设置。

  • 明文密码

    ACL SETUSER rab <zhurs@123
    
    # '<' 符号之后是前面创建用户时设置的明文密码
    

    image-20230418180333209

  • Hash 密码

    ACL SETUSER ops !a9db6465cac424cb70a81fae6f42cd63b7e2292b45795ea88695e9da2baea040
    
    # '!' 符号之后是前面创建用户时设置的Hash密码
    

    image-20230418180444997

2、通过 nopass 删除用户密码

为了演示,再创建一个用户 test

ACL SETUSER test on >nba ~* +@all

注意:一个用户可设置多个密码:

ACL SETUSER test on >cba ~* +@all

image-20230418181412964

查看用户详细信息:

ACL GETUSER test

image-20230418181917296

开始设置 test 用户密码为

ACL SETUSER test nopass

image-20230418182159429

<#不同的是,该用户是可以登录的,因为密码是空,只需设置密码为空即可登录,如果不设置空密码,也是无法进行用户认证。

auth test      # 无法认证
auth test ''   # 可以认证(为空或填任意密码都不影响)

image-20230418182501637

redis 客户端测试验证:

密码处填不填不影响。

image-20230418182609602

连接验证:

image-20230418182640220

3.2 重置用户和密码

ACL SETUSER test reset

image-20230419150556176

重置后,该用户无法登录连接,可见 test 用户处于 off 禁用状态。

四、权限管理

4.1 key 管理

1、对 test 用户设置可操作的 key

ACL SETUSER test on >zhurs@123 ~foo* ~bar* +@all

# test用户可管理foo、bar开头的key

image-20230419152531283

2、取消用户可操作的 key

通过 resetkeys 实现,此时只能操作 ob 开头的 key,~foo*、~bar* key 已经被 resetkeys 清空。

ACL SETUSER test on >zhurs@123 ~foo* ~bar* resetkeys ~ob* +@all

image-20230419152823519

3、操作所有 key

allkeys~* 效果一样

ACL SETUSER test on >zhurs@123 ~* +@all

image-20230419170056975

4.2 权限管理

1、权限类型

权限有很多,如下是 redis 所有的权限列表:

ACL CAT

image-20230419171923038

如查看某个权限的具体信息:

ACL CAT read

image-20230419172131962

2、权限设置

ACL SETUSER test on >zhurs@123 ~foo* ~bar* +@hash

# test用户只有对hash类型的key有权限

image-20230419172659504

可见,取消了所有权限,仅限制为 hash 权限。其他权限就不一一举例了,各位可自行尝试。

五、ACL 用户存储

这里注意一下,以上的操作是通过 ACL 命令实现的,这些操作都只是临时存储与内存中,如果服务器或实例重启后,ACL 所设置的数据将会丢失。如下图你会发现,前面创建的 test 用户已经不见了。

image-20230419173312166

那 Redis 6.0+ 是如何存储创建的用户呢?官方给出了两种方法:直接将用户信息写入配置文件 redis.conf 中、指定外部 ACL 文件。

这两种方法是相互不兼容的,因此,我们只能选择其中任意一种,考虑到生产上的复杂环境问题,官方建议使用外部 ACL 文件方式。

5.1 配置文件实现

方法比较简单,直接在 redis.conf 配置文件中追加以下内容,如果有多个用户继续往下追加即可

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

image-20230419175928830

然后重启一下 redis 实例:

docker restart redis

登录验证:

是没问题的。

image-20230419180108307

5.2 外部 ACL 文件实现

因为不兼容,所以在做这个实验前先去掉配置文件中追加的 user work ... 内容,然后在配置文件中指定外部 ACL 文件路径:

找到配置文件 aclfile /etc/redis/users.acl 部分,并打开注释。

我自定义的配置文件路径为:/data/users.acl

image-20230419180652171

手动创建 users.acl 文件:

vim users.acl

# 文件加入下面内容
user root +@all ~* on >zhurs@123
user dev +@list +@connection ~jobs:* on >ffa9203c493aa99
user ops +@list +@connection ~jobs:* on >kka2023addwedw4

重启 Redis 实例:

docker restart redis

登录查看:

image-20230419181841209

此时redis.conf 配置文件中定义的密码已经失效,因此这就导致原本的 default 用户又可以无密码登录了,所以我们需要禁用 default 用户:

ACL SETUSER default reset

image-20230419183105049

哨兵和副本的 ACL 规则可查看官方文档。

参考:官方文档

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

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

相关文章

表单验证:自定义校验规则

Element UI 为我们提供了表单校验规则&#xff0c;但业务需要&#xff0c;我们常常要自定义校验规则 需求 实现表单中一个输入框&#xff0c;不能输入大于30的数字 思路 hrml&#xff1a; 自定义校验规则&#xff1a; 约定的校验规则&#xff1a; 代码 <template&g…

集群聊天服务器项目(一)——模块分层设计

本项目对程序不同功能进行分层设计&#xff0c;分为网络层、业务层、和数据层。 C面向接口编程也就是面向抽象类&#xff0c;网络模块和业务模块尽量解耦。 网络层 网络层主要封装的是网络连接方面的一些功能&#xff0c;即socket相关操作,这里该项目采用的是muduo网络库作为…

《Netty》从零开始学netty源码(三十九)之PoolSubPage的内存释放

PoolSubPage.free PoolSubPage的内存释放相对来说比较简单&#xff1a; 首先根据段的偏移量bitmapIdx找到bitmap的long[]数组的索引q&#xff0c;将bitmap[q]这个long的二进制位的占用位r置为0&#xff0c;表示已经释放。如果PoolSubPage的段已经全部释放了&#xff0c;且池中…

测试开发岗 - 常见面试题

1. 什么是软件测试&#xff0c; 谈谈你对软件测试的了解 软件测试就是验证产品特性是否符合用户需求, 软件测试贯穿于软件的整个生命周期. >>> 那软件测试具体是什么呢 ? 就拿生活中的例子来说, 比如说我们去商场买衣服, 会有以下几个步骤 : 第一步: 我们会走进门店…

【网络安全】命令执行漏洞

命令执行漏洞 命令执行漏洞原理危害检测方法有回显检测方法; (分号) 从左到右执行| (管道符) 将见面命令的输入为后面命令的标准输入&(后台任务符号) 命令从左到右执行&&(与) 逻辑与&#xff0c;前面命令执行成功后才会执行||(或) 逻辑或&#xff0c;前面执行失败才…

LeetCode算法小抄-- 图的遍历

LeetCode算法小抄-- 图的遍历 图基本概念遍历广度优先算法(BFS)框架[111. 二叉树的最小深度](https://leetcode.cn/problems/minimum-depth-of-binary-tree/)[752. 打开转盘锁](https://leetcode.cn/problems/open-the-lock/)[773. 滑动谜题](https://leetcode.cn/problems/sli…

文章伪原创生成器在线-文章伪原创工具免费入口

文章自动生成器 在现代科技快速发展的时代中&#xff0c;自动化技术已经深入到了各个领域。而随着人工智能技术的提高&#xff0c;自动化技术在创意和写作领域越来越成熟。现在有一款名为“文章自动生成器”的软件&#xff0c;可以轻松地生成高质量的文章。 今天&#xff0c;我…

STM32之MPU6050获取欧拉角

STM32之MPU6050获取欧拉角 MPU6050MPU6050特点MPU6050电路图以及框图MPU6050框图MPU6050电路图 MPU6050相关寄存器电源管理寄存器1&#xff08;0x6B&#xff09;陀螺仪配置寄存器&#xff08;0x1B&#xff09;加速度计配置寄存器&#xff08;0x1C&#xff09;陀螺仪采样率分频寄…

Vue中的ajax【Vue】

4. Vue 中的 ajax 4.1 解决开发环境 Ajax 跨域问题 方法一&#xff1a; 在vue.config.js中添加如下配置&#xff1a; devServer:{proxy:"http://localhost:5000" }说明&#xff1a; 优点&#xff1a;配置简单&#xff0c;请求资源时直接发给前端&#xff08;808…

更懂业务的用友iuap平台,助力企业升级数智化底座

4月19日&#xff0c;一年一度的用友BIP技术大会如约而至。近千位来自三十个行业的企业家、CIO/CDO、企业主管、专家学者、媒体、分析师代表现场参与大会。伴随企业数智化推进&#xff0c;越来越多的企业需要升级数智底座平台。会上&#xff0c;用友介绍了更懂企业业务的用友BIP…

Android 开发为什么会要用到组件化与插件化?好处在哪?

对于开发者来说&#xff0c;写好代码的第一步就是具备良好的架构能力。但是这项基本的能力&#xff0c;也很少有人具备。就拿最常用的项目架构组件化来说&#xff0c;有多少人用过&#xff1f;又有谁去了解过组件化开发中真正会遇到的问题&#xff0c;以及如何解决&#xff1f;…

Nacos 1.4.x 升级至 2.x 详细步骤及遇到的问题,亲测可行

此前使用的nacos版本是1.4.5&#xff0c;现在nacos最新版本为2.2.2&#xff0c;且修复了旧版本的一些安全问题&#xff0c;下面把详细的升级步骤记录一下&#xff0c;大家一起学习&#xff0c;亲测有效。 主要参考nacos官方升级文档&#xff1a;https://nacos.io/zh-cn/docs/v2…

瑞吉外卖项目——读写分离

读写分离 读和写所有压力都由一台数据库承担&#xff0c;压力大数据库服务器磁盘损坏则数据丢失&#xff0c;单点故障 Mysql主从复制 介绍 MySQL主从复制是一个异步的复制过程&#xff0c;底层是基于Nysql数据库自带的二进制日志功能。 就是一台或多台MysQL数据库&#xf…

字符串 --- 找子串匹配算法

1.基本介绍 主串&#xff1a;形如 “hello world”的字符串作为一个整体 子串&#xff1a;上面主串的一部分如“world” 在计算机世界&#xff0c;主串找子串的模式很常见&#xff0c;比如要在word文件中找一句指定的话&#xff0c;那么面对海量的信息&#xff0c;我们匹配算法…

最新入河排污口设置论证、水质影响预测与模拟、污水处理工艺分析及典型建设项目入河排污口方案报告书实例分析

目录 专题一 入河排污口设置论证相关法律与制度解读 专题二 水域纳污能力核算方法 &#xff08;讲授与实操相结合&#xff09; 专题三 入河排污口设置方案、分析范围、论证范围、模型预测范围确定方法 专题四 入河排污口所在水域水质现状与取水、排污状况分析 专题五 入河…

React State 状态

React State(状态) React 把组件看成是一个状态机&#xff08;State Machines&#xff09;。通过与用户的交互&#xff0c;实现不同状态&#xff0c;然后渲染 UI&#xff0c;让用户界面和数据保持一致。 React 里&#xff0c;只需更新组件的 state&#xff0c;然后根据新的 s…

SPI通讯

1、介绍 SPI是高速、全双工、同步的通信总线。 SPI应用于存储芯片、AD转换器及LCD中。 同步、异步区别&#xff1a;是否有时钟线&#xff0c;例如SPI、I2C是同步通信&#xff0c;需要用到时钟线&#xff0c;串口是异步通信&#xff0c;没有时钟线。 SPI通信需要四根线&…

【数据结构】单链表(详解)

【数据结构】单链表&#xff08;详解&#xff09; 1.前言1.1本章节重点1.2 什么是单链表1.3 结构体设计1.4结构体传参 2. SList.h展示3. SList.c展示4. 各个接口函数的实现4.1 尾插4.2 打印4.3 头插4.3.1内存开辟函数4.3.2插入 4.4 尾删4.5 头删4.6 查找4.7 给定一个位置在这个…

今天面了个字节跳动拿35K出来的,真是砂纸擦屁股,给我露了一手啊

今年的金三银四已经快要结束了&#xff0c;很多小伙伴收获不错&#xff0c;拿到了心仪的 offer。 各大论坛和社区里也看见不少小伙伴慷慨地分享了常见的面试题和八股文&#xff0c;为此咱这里也统一做一次大整理和大归类&#xff0c;这也算是划重点了。 俗话说得好&#xff0c…

为什么选择学习python?

对于编程初学者来说&#xff0c;python更加简单易学&#xff0c;便于初学者入门~ 学Python之前&#xff1a;这玩意真有传说中那么好么&#xff1f; 学Python之后&#xff1a;唉呀妈呀&#xff0c;真香~ 别人花2天时间处理的Excel数据&#xff0c;你用Python 只花1小时&#…