Redis 访问控制列表(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 是高性能的数据库,正常情况下每秒可以接收百万级别的请求,因此我们的 用户/密码 一定要是非常复杂的组合(推荐密码长度不低于12位),否则很容易就会被暴利跑字典给破解了。

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 服务使 redis.conf 配置生效:

systemctl restart redis

外部 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 /etc/redis/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 用户属于无密码状态)
# 重启 redis 服务
systemctl restart redis
# 或在 redis 命令行中执行 aclfile load 命令加载权限
aclfile load

两种模式对比

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

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

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

对比 configaclfile

项目名称redis.confusers.acl
配置格式DSLDSL
加载配置systemctl restart redissystemctl restart redis / aclfile load
命令行持久化配置config rewriteacl save

ACL 命令行持久化配置:

上面可以看到,我们在 config 配置文件中配置的 ACL 权限,需要执行 ACL LOAD 或者 重启 Redis 服务才能生效,事实上我们可以直接在命令行下配置 ACL在命令行模式下配置的 ACL 权限无需重启服务即可生效。我们也可以在命令行模式下配置 ACL 并将其持久化到aclfile 或者 config 文件中(这取决于配置文件中选择的是 config 模式 还是 外部 aclfile 模式),一旦将权限持久化到 aclfilecofig 文件中,下次重启就会自动加载该权限,如果忘记持久化,一旦服务宕机或重启,该权限就会丢失。

# 如果使用 config 模式,将 ACL 权限持久化到 redis.conf 文件中使用下面的命令:
config rewrite
 
# 如果使用 aclfile 模式,将 ACL 权限持久化到 users.acl 文件中使用下面的命令:
acl save

说明:

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

开启 ACL 登录举例:

# 未启用 ACL 登录(传统方式)
redis-cli -c -h 192.168.48.190 -p 6479 -a '123456' --raw

# 启用 ACL 登录(默认用户 default)
redis-cli -c -h 192.168.48.190 -p 6479 --user default --pass 123456

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

ACL 规则可以在 redis.conf 文件以及 users.acl 文件中配置 DSL,也可以在命令行中通过 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 得以弥补这一隐患,使用 ACL 可以更细粒度的控制用户权限隔离,更好的助力安全生产。如果是新版本的 redis ≥ 6.0,推荐大家尝试 外部 ACL file 方式 配置来管理用户访问控制权限。

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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChaITSimpleLove

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值