Redis ACL安全策略详解

一,redis新特性ACL安全策略介绍

        在 Redis6 之前的版本,我们只能使用 requirepass 参数给 default 用户配置登录密码,同一个 redis 集群的所有开发都共享 default 用户,难免会出现误操作把别人的 key 删掉或者数据泄露的情况。

        因此 Redis6 版本推出了 ACL(Access Controller List)访问控制权限的功能,基于此功能,我们可以设置多个用户,并且给每个用户单独设置命令权限和数据权限。

        为了保证向下兼容,Redis6 保留了 default 用户和使用requirepass 的方式给 default 用户设置密码,默认情况下 default 用户拥有 Redis 最大权限,我们使用 redis-cli连接时如果没有指定用户名,用户也是默认 default。

1.1 配置ACL

        配置 ACL 的方式有两种:一种是在 config 文件中直接配置,另一种是在外部 aclfile 中配置。

        配置的命令是一样的,但是两种方式只能选择其中一种,我们之前使用 requirepass 给 default 用户设置密码。

        默认就是使用config 的方式,执行 config rewrite 重写配置后会自动在 config 文件最下面新增一行记录配置 default 的密码和权限

1.2 redis设置密码

        在 Redis 6.0 之前,Redis 只有一个 default 用户也是 Redis 中的超级管理员用户,如果要将其设置密码,需要修改 Redis 配置文件,具体设置密码修改如下

requirepass 123456

修改之后,再次进入 Redis 时,发现已经没有权限操作了。

[root@alvin-test-os redis]# redis-cli --raw
127.0.0.1:6379> set a b
NOAUTH Authentication required

这个时候我们需要使用密码的方式进入

[root@alvin-test-os redis]# redis-cli -a 123456 --raw
Warning: Using a password with '-a' or '-u' option on the command line interface may
not be safe.
127.0.0.1:6379> set a b
OK

1.3 使用ACL

        我们可以直接在 config 配置文件中使用上面 default 用户 ACL 这行 DSL 命令设置用户权限,或者我们也可以配置外部 aclfile 配置权限。

        配置 aclfile 需要先将 config 中配置的 DSL 注释或删除,因为 Redis 不允许两种ACL 管理方式同时使用,否则在启动 redis 的时候会报下面的错误

# Configuring Redis with users defined in redis.conf and at the same setting an ACL
file path is invalid. This setup is very likely to lead to configuration errors and
security holes, please define either an ACL file or declare users directly in your
redis.conf, but not both
 

二,使用外部ACL FILE模式

使用外部 aclfile 文件配置 Default 和其他用户的 ACL 权限

1.注释 redis.conf 中所有已授权的 ACL 命令,

如:
#user default on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* +@all

2.在 config 文件中注释 default 用户的密码,

因为开启 aclfile 之后,requirepass 的密码就失效了:redis.conf
#requirepass 123456

3.在 config 文件中配置 aclfile 的路径,

然后创建该文件,否则重启 redis 服务会报错找不到该文件
aclfile /usr/local/redis/etc/users.acl
touch /usr/local/redis/etc/users.acl

5.重启 redis 服务或使用 aclfile load 命令加载权限
systemctl restart redis

在 redis 命令行中执行:
aclfile load

注意:

  1. 开启 acl file 之后不再推荐在 redis.conf 文件中通过 requirepass 配置 default 的密码,因为它不再生效。
  2. 同时开启 aclfile 之后也不能使用 redis-cli -a xxx 登陆,必须使用 redis-cli --user xxx --pass yyy 来登陆。在没设置密码的时候也可以无密码登录

# 这个时候显示的是无密码状态

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

        在 redis.conf 和 aclfile 模式中配置 DSL 官方更推荐使用 acl file,因为如果在 redis.conf 中配置了权限之后需要重启 redis 服务才能将配置的权限加载至 redis 服务中来,但如果使用 aclfile 模式,可以调用 acl load 命令将 aclfile 中配置的 ACL 权限热加载进环境中,类似于 Mysql 中的 flush privileges。

        但同时我们也可以使用命令:config rewrite 将 acl 权限初始化到 redis.conf 中;同时执行 acl save 可以将 acl 配置持久化到 aclfile 中。

6.例子:

我们添加一个hsslive用户,设置密码为123456,然后acl list查看:

127.0.0.1:6379> acl setuser hsslive on >123456 ~* +@all
OK
127.0.0.1:6379> acl list
["user default on nopass ~* &* +@all","user hsslive on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* resetchannels +@all"
]
127.0.0.1:6379> 

将acl list的数据复制下来即可

users.acl

user default on nopass ~* &* +@all
user hsslive on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 ~* resetchannels +@all

然后在redis的启动配置文件使用aclfile:

aclfile /etc/redis/users.acl

2.1 ACL规则

        ACL 是使用 DSL(Domain specific language)定义的,该 DSL 描述了用户能够执行的操作。该规则始终从上到下,从左到右应用,因为规则的顺序对于理解用户的实际权限很重要。

        ACL 规则可以在 redis.conf 文件以及 users.acl 文件中配置 DSL,也可以在命令行中通过 ACL 命令配置

2.2 ACL启用和禁用

  • on:启用用户:可以以该用户身份进行认证。
  • off:禁用用户:不再可以使用此用户进行身份验证,但是已经通过身份验证的连接仍然可以使用

# 创建一个用户, 默认情况下是非活跃状态
127.0.0.1:6379> ACL SETUSER xiaozhang
OK

# 查看用户
127.0.0.1:6379> acl list
user alvin off #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
-@all
user default on nopass ~* +@all
user xiaozhang off -@all

# 将用户设置成活跃状态
127.0.0.1:6379> ACL SETUSER xiaozhang on
OK

# 再次查看用户列表,发现小张已经变成了活跃状态
127.0.0.1:6379> acl list
user alvin off #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
-@all
user default on nopass ~* +@all
user xiaozhang on -@all
 

三 ,允许和禁止调用命令 

命令解释
+command将命令添加到用户可以调用的命令列表中。
- command将命令从用户可以调用的命令列表中移除。
+@category允许用户调用 类别中的所有命令,有效类别为@admin,@set,@sortedset 等,可通过调用 ACL CAT 命令查看完整列表。特殊类别@all 表示所有命令,包括当前和未来版本中存在的所有命令。
-@禁止用户调用 类别中的所有命令。
+subcommand
allcommands+@all 的别名。包括当前存在的命令以及将来通过模块加载的所有命令。
nocommands-@all 的别名,禁止调用所有命令。

 
# 将 xiaozhang 用户增加密码、设置访问以 name 开头的 key 的权限和 set 权限
127.0.0.1:6379> ACL SETUSER xiaozhang on >abc123 ~name* +set
OK

# 我们可以看到 xiaozhang 目前只具有 set 权限
127.0.0.1:6379> acl list
user xiaozhang on #6ca13d52ca70c883e0...392593af6a84118090 ~name* -@all +set

# 切换用户
127.0.0.1:6379> AUTH xiaozhang abc123
OK

# 设置键值对
127.0.0.1:6379> set name xiaozhang
OK

# 没有获取权限
127.0.0.1:6379> get name
NOPERM this user has no permissions to run the 'get' command or its subcommand


四,允许和禁止访问某些key

命令解释
~添加可以在命令中提及的键模式。例如~和 allkeys 允许所有键。
* resetkeys

使用当前模式覆盖所有允许的模式。

如: ~foo:* ~bar:* resetkeys ~objects:* ,客户端只能访问匹配 object:* 模式的 KEY。

# 将 xiaozhang 用户增加密码、设置访问以 name 开头的 key 的权限和 set 权限
127.0.0.1:6379> ACL SETUSER xiaozhang on >abc123 ~name* +set
OK

五,密码配置

# 查看用户列表
127.0.0.1:6379> acl list
user alvin off -@all
user default on nopass ~* +@all

# 将 alvin 用户设置密码
127.0.0.1:6379> ACL SETUSER alvin on >abc123
OK
127.0.0.1:6379> acl list
user alvin on #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
-@all
user default on nopass ~* +@all

# 切换用户
127.0.0.1:6379> auth alvin abc123
OK

# alvin 没有 set 权限
127.0.0.1:6379> set aaa bbb
NOPERM this user has no permissions to run the 'set' command or its subcommand

六,ACL常用操作

6.1 ACL list 返回所有用户

我们可以使用 ACL LIST 命令来查看当前活动的 ACL,默认情况下,有一个“default”户。

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

        其中 user 为关键词,default 为用户名,后面的内容为 ACL 规则描述,on 表示活跃的,nopass 表示无密码,~* 表示所有 key,+@all 表示所有命令。所以上面的命令表示活跃用户 default 无密码且可以访问所有命令以及所有数据。

6.2 ACL USER 返回所有用户名

127.0.0.1:6379> acl users
1) "default"
127.0.0.1:6379>

6.3 ACL WHOAMI 返回当前用户名

127.0.0.1:6379> ACL WHOAMI
"default"

6.4 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
 

6.5 ACL SETUSER

若用户不存在,则按默认规则创建用户。若用户存在则该命令不做任何操作。

127.0.0.1:6379> ACL SETUSER alvin
OK
127.0.0.1:6379> acl list
1) "user alvin off -@all"
2) "user default on nopass ~* +@all"

6.6 ACL GETUSER  使用下面的命令查看用户的 ACL 权限

127.0.0.1:6379> ACL GETUSER xiaozhang
flags
on
passwords
6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
commands
-@all +set
keys
name*
127.0.0.1:6379>

6.7 ACL DELUSER   删除指定的用户。

#删除指定的用户
acl deluser <username>
127.0.0.1:6379> ACL DELUSER alvin

6.8 ACL SAVE

        我们可以使用 acl save 命令将当前服务器中的 ACL 权限持久化到 aclfile 中。

        如果没持久化就关闭 redis 服务,那些 ACL 权限就会丢失,因此我们每次授权之后一定要记得 ACL SAVE 将 ACL 权限持久化到 aclfile 中。

# 查看 users.acl
[root@alvin-test-os redis]# cat etc/users.acl

# 查看 acl 用户

[root@alvin-test-os redis]# redis-cli --raw
127.0.0.1:6379> acl list
user default on nopass ~* +@all
user xiaozhang on #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090 ~name* -@all +set

# 保存 acl 权限配置
127.0.0.1:6379> acl save
OK
127.0.0.1:6379> exit

# 查看 acl 配置文件已经被写入

[root@alvin-test-os redis]# cat etc/users.acl
user default on nopass ~* +@all
user xiaozhang on
#6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090 ~name* -@all +set

6.9 ACL LOAD

我们也可以直接在 aclfile 中修改或新增 ACL 权限,修改之后不会立刻生效,我们可以在 redis 命令行中执行 acl load 将该 aclfile 中的权限加载至 redis 服务中。

#将 aclfile 中的权限加载至 redis 服务中
acl load

# 查看 acl 用户列表
127.0.0.1:6379> acl list
user default on nopass ~* +@all
user xiaozhang on
#6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090 ~name* -@all
+set

# 重载
127.0.0.1:6379> ACL LOAD
OK

# 查看新用户已经加入
127.0.0.1:6379> acl list
user alvin on #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
~name* -@all +set
user default on nopass ~* +@all
user xiaozhang on
#6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090 ~name* -@all
+set

6.10 AUTH

使用 auth 命令切换用户

AUTH <username> <password>
 

7、场景说明

  1. 创建DBA管理账号
    > ACL SETUSER dba on #6d0ac515af9df81653ed0aa3ffa692663c3f556079791e2f00a4578990da66f3 allkeys +@all
    OK
  2. 创建读写账号
    > ACL SETUSER readwrite on >abc allkeys -@all +@read +@write
    OK
  3. 创建只读账号
    > ACL SETUSER readonly on >abc allkeys -@all +@read
    OK
  4. 创建只写账号
    > ACL SETUSER write_user on >abc allkeys -@all +@write
    OK
  5. 创建复制账号
    > ACL SETUSER replica-user >abc -@all +psync +replconf +ping on
    OK
  6. 创建哨兵账号
    > ACL SETUSER sentinel-user >abc -@all +client +subscribe +publish +ping +info +multi +slaveof +config +client +exec on
    OK
  7. 创建监控账号
    > ACL SETUSER monitor on >abc +monitor
    OK
  8. 创建指定key、有指定类型权限的账号
    -- 指定对h开头的hash类型的key有权限
    > ACL SETUSER ops_user on >abc ~h* +@hash
    OK

    其中key的模式是正则匹配,需要~开头,针对权限则是hash的类,其权限可以通过ACL CAT hash查看。

注意:以上操作完只有需要执行ACL SAVE。不然重置之后用户信息全部都清空了。

8、redis 集群模式

        如果是redis集群,有多个redis服务节点,临时添加用户的话,需要一个一个节点手动通过指令设置用户。

        获取公国acl file,上传到各个服务器节点,在进行acl load 命令

参考

【精选】redis用户权限管理 - ACL详解第一篇-CSDN博客

Redis新特性ACL安全策略_51CTO博客_redis acl

Redis7命令ACL - 自然博客

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

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

相关文章

基于单片机的智能鱼缸控制系统的设计与实现

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、开发技术和原理的相关知识2.1开发设计目标2.2 开发设计使用技术和原理2.2.1嵌入式技术2.2.2传感器技术 二、基于单片机的智能鱼缸控制系统的总体设计3.1智能鱼缸控制系统的基本组成3.1.1系统的构成部分3.2需求…

高校动物实验室建设要点

高校动物实验室应按照合理的规划布局进行设计&#xff0c;以便满足实验教学和科学研究的需求。如区分功能区域。根据实验室的不同功能&#xff0c;划分出饲养区、实验区、准备区和储存区等功能区域。动物房应根据不同种类动物的需求进行布置&#xff0c;确保各种动物的饲养条件…

uni-app 解决钉钉小程序日期组件uni-datetime-picker不兼容ios问题

最近在使用uni-app开发 钉钉小程序 &#xff0c;遇到一个ios的兼容性问题 uni-datetime-picker 组件在模拟器上可以使用&#xff0c;在真机上不生效问题 文章目录 1. 不兼容的写法&#xff0c;uni-datetime-picker 不兼容IOS2. 兼容的写法&#xff0c;使用 dd.datePicker 实现。…

【ZMQ】ZMQ/ZeroMQ简介、三种消息模式demo程序

ZMQ/ZeroMQ简介、三种消息模式demo程序 一、什么是ZMQ二、ZMQ的特点三、Demo程序代码3.1 发布-订阅模式&#xff08;P/S&#xff09;demo3.2 请求-应答模式&#xff08;REQ/RES&#xff09;demo3.3 推拉模式&#xff08;P/P&#xff09;demo 一、什么是ZMQ ZeroMQ&#xff08;…

Java数组小练习求出数组中的最大值

加油&#xff0c;新时代打工人&#xff01; Java基础八之数组的定义和获取元素 package demo;/*** author wenhao* date 2023/11/04 10:47* description 数组练习*/ public class ArrDemo {public static void main(String[] args) {//求一个数组中的最大值int [] arr {66,12…

ActiveMQ是什么?-九五小庞

MQ是消息中间件&#xff0c;是一种在分布式系统中应用程序借以传递消息的媒介&#xff0c;常用的有ActiveMQ&#xff0c;RabbitMQ&#xff0c;kafka。ActiveMQ是Apache下的开源项目&#xff0c;完全支持JMS1.1和J2EE1.4规范的JMS Provider实现。特点&#xff1a;1、支持多种语言…

Cross-Entropy Loss(多分类损失函数)

文章目录 1. 网络输出output&#xff1a;score2. Cross-Entropy Loss(多分类损失函数) 1. 网络输出output&#xff1a;score 2. Cross-Entropy Loss(多分类损失函数) 先用softmax function把score 变成 probabilities。再用交叉熵损失函数来进行Loss的计算

10个常用的React UI组件库

背景&#xff1a;在快速变化的前端开发世界中&#xff0c;react前端框架简洁明了&#xff0c;赢得了全球开发者的广泛青睐&#xff0c;相比于从零开始创建每一个组件&#xff0c;使用现成的 React UI 组件库可以极大地提高我们的开发效率&#xff0c;React社区已经积累了大量优…

【Midjourney入门教程4】与AI对话,写好prompt的必会方法

文章目录 1、语法2、单词3、要学习prompt 框架4、善用参数&#xff08;注意版本&#xff09;5、善用模版6、临摹7、垫图 木匠不会因为电动工具的出现而被淘汰&#xff0c;反而善用工具的木匠&#xff0c;收入更高了。 想要驾驭好Midjourney&#xff0c;可以从以下方面出发调整&…

搭建 L2TP over IPSec VPN

记得开放允许访问 UDP 500、1701、4500共3个端口 1. 服务器安装软件: yum -y install openswan xl2tpd ppp2. 服务器配置文件 /etc/ipsec.conf 修改内容如下&#xff0c;云服务器一般网卡地址填私网地址: config setupprotostacknetkeylogfile/var/log/ipsec.logvirtual_pri…

智能工厂架构

引:https://www.bilibili.com/video/BV1Vs4y167Kx/?spm_id_from=333.788&vd_source=297c866c71fa77b161812ad631ea2c25 智能工厂框架 智能工厂五层系统框架 MES 数据共享 <

JumpServer开源堡垒机与万里安全数据库完成兼容性认证

近日&#xff0c;中国领先的开源软件提供商FIT2CLOUD飞致云宣布&#xff0c;JumpServer开源堡垒机已经与万里安全数据库软件GreatDB完成兼容性认证。针对产品的功能、性能、兼容性方面&#xff0c;经过双方共同测试&#xff0c;万里安全数据库软件&#xff08;简称&#xff1a;…

软件测试用例方法---边界值法

原则&#xff1a; 输入最小值&#xff08;min&#xff09;、稍大于最小值&#xff08;min&#xff09;、域内任意值&#xff08;nom&#xff09;、稍小于最大值&#xff08;max-&#xff09;、最大值&#xff08;max&#xff09; 写法&#xff1a;“单故障”假设&#xff08;致…

Redis Part2

Redis中如何的去存放一个Java对象&#xff1f; 直接存放Json类型即可&#xff0c;因为我们Json类型最终就是一个String类型。 Spring Boot整合Redis 三步骤完成SpringBoot对Redis数据库的整合 引入spring-boot-starter-data-redis依赖在application.yml中配置Redis信息注入Re…

关于pytorch张量维度转换及张量运算

关于pytorch张量维度转换大全 1 tensor.view()2 tensor.reshape()3 tensor.squeeze()和tensor.unsqueeze()3.1 tensor.squeeze() 降维3.2 tensor.unsqueeze(idx)升维 4 tensor.permute()5 torch.cat([a,b],dim)6 torch.stack()7 torch.chunk()和torch.split()8 与tensor相乘运算…

Unity中Shader的GI相关数据的准备

文章目录 前言一、把 Unity 中用到的 GI 的函数移植到我们自定义的 cginc 文件中二、开始使用和 GI 相关的方法1、了解 UnityGI 结构体的内容,并且准备 UnityGI 的数据2、了解 SurfaceOutput 结构体&#xff0c;并且准备数据3、了解并准备 UnityGIInput 结构体&#xff0c;并且…

centos7安装oxidized备份软件

首先需要提前下载ruby&#xff0c;因为默认yum安装的版本太低 https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz 1、yum remove ruby ruby-devel&#xff08;有就卸载&#xff0c;没有则忽略&#xff09; 2、将下载好的ruby包解压到/opt下 [rootoxidized ruby-…

第6章_多表查询

文章目录 多表查询概述1 一个案例引发的多表连接1.1 案例说明1.2 笛卡尔积理解演示代码 2 多表查询分类讲解2.1 等值连接 & 非等值连接2.1.1 等值连接2.1.2 非等值连接 自连接 & 非自连接内连接与外连接演示代码 3 SQL99语法实现多表查询3.1 基本语法3.2 内连接&#x…

汽车托运3种运车方式对比

汽车托运有以下几种托运方式&#xff1a;笼车托运&#xff0c;小板托运&#xff0c;火车托运;这几种托运方式的托运时长及托运费用都不一样。下面分别介绍一下&#xff0c;3种托运方式的优点及不便。 ①笼车托运。价格在1-2元/公里&#xff0c;笼车托运是目前主流的托运方式。笼…

2023.11.03 homework

小学4年级数学 1 2 3 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 1958 1959 1960 1961 1962 1963 1964 1965 1966 1967 1968 1969 1970 1971 1972 1973 1974 19…