Redis 技术探索「安全实战系列」带你认识一下Redis的权限控制机制ACL(访问控制列表)是什么

Posted 洛神灬殇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 技术探索「安全实战系列」带你认识一下Redis的权限控制机制ACL(访问控制列表)是什么相关的知识,希望对你有一定的参考价值。

ACL是什么?

官网地址:https://redis.io/docs/management/security/acl/

ACL可以称之为访问控制列表(Access Control List)该功能允许某些连接在可以执行的命令和可以访问的Key数据方面受到限制。授权,给某个用户分配某个功能,让其拥有某些能力。

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

ACL的主要作用

在使用ACL之前,您可能需要问问自己,通过实现这一层保护,您希望实现的目标是什么。ACL通常可以很好地实现两个主要目标:

  • 通过限制对命令和 KEY 的访问来提高安全性:这样不受信任的客户机就没有访问权限,而受信任的客户机只有执行所需工作所需的最低级别的数据库访问权限。例如,某些客户端可能只能执行只读命令。

  • 想提高操作安全性:访问Redis的进程或人员不允许由于以防止由于软件或人为错误而导致非授权情况的操作,导致数据或配置的损坏。例如,不应该让所有客户端都能够调用 FLUSHALL 命令。

ACL的另一个典型用法与管理Redis实例有关。Redis通常是由公司内部团队(为其他内部客户处理Redis基础设施)提供的管理服务,或者由云提供商以软件即服务的方式提供。在这两种设置中,我们都希望确保去除客户的相关的一些重要的配置命令。

使用ACL命令配置ACL

Redis AUTH命令在Redis 6中进行了扩展,所以现在可以以双参数形式使用它。

AUTH <username> <password>

当将要进行Redis服务连接的时候,需要客户提供用户名有效密码以进行身份验证。如果身份验证成功,则该连接与给定用户和用户的限制关联。

这里有一个旧形式的例子,所发生的情况是,用于身份验证的用户名是“default”,因此仅指定密码就意味着我们希望根据默认用户进行身份验证。这提供了向后兼容性。

AUTH <password>

以便已经使用“默认”用户对新连接进行身份验证(这是默认配置)。

使用ACL能达到的什么目的

ACL是使用DSL(领域特定语言)定义的,DSL描述了允许给定用户做什么。这样的规则总是从第一个到最后一个,从左到右实现的,因为有时规则的顺序对于理解用户真正能够做什么很重要。

默认情况下,只定义了一个名为default的用户。我们可以使用ACL LIST命令来检查当前活动的ACL,并验证一个新启动的、默认配置的Redis实例的配置是什么:

上面的命令以Redis配置文件中使用的相同格式用户列表,通过将当前为用户设置的ACL转换回他们的描述。

  • 第一部分代表着“user”,后面跟着用户名,上面的案例代表着default。

  • 第二部分描述不同事物的ACL规则。

默认情况下,使用nopass规则意味着新连接将自动使用默认用户进行身份验证,而不需要任何显式的AUTH调用。

ACL的规则介绍

下面是有效的ACL规则列表。某些规则只是单个单词,用于激活或删除标志,或执行对用户ACL的给定更改。其他规则是与命令或类别名称、键模式等连接在一起的字符前缀。

  • +<command>: 将该命令添加到用户可以调用的命令列表中。可以与|一起使用,允许子命令(例如“+config | get”)。

  • -<command>: 将该命令移到用户可以调用的命令列表中。从Redis 7.0开始,它可以与|一起用于阻塞子命令(例如“-config|set”)。

  • +@<category>: 添加该类别中所有用户调用的命令,有效类别为@admin@set, @sortedset,…等等,通过调用ACL CAT命令查看完整的列表。特殊类别@all表示所有命令,包括当前存在于服务器中的命令,以及将来将通过模块加载的命令。

  • -@<category>:类似于+@<类别>,但从客户端可以调用的命令列表中删除命令。

  • +<command> | first-arg:允许在其他情况下禁用命令的特定第一个参数。它只支持没有子命令的命令,并且不允许作为-SELECT | 1 这样的形式,只支持以“+”开头的加法。此特性已弃用,将来可能会被删除。

  • allcommands: +@all的别名。注意,它意味着能够执行通过模块系统加载的所有未来命令。

  • nocommands: -@all的别名。

允许和禁止某些密钥和密钥权限:

~: 添加一个键的模式,可以作为命令的一部分提到。例如~*允许所有的键。该模式是一个全局样式的模式,类似于KEYS的模式。可以指定多个模式。

  • %R~: Redis 7.0及以上版本可用)添加指定的读键模式。它的行为类似于常规键模式,但只授予从匹配给定模式的键读取的权限。

  • %W~: (Redis 7.0及以上版本可用)添加指定的写键模式。它的行为类似于常规键模式,但只授予写入匹配给定模式的键的权限。

%RW~: (Redis 7.0及以上版本可用)

  • allkeys: ~*的别名

  • resetkeys: 刷新允许的键模式列表。例如ACL ~foo:* ~bar:* resetkeys ~objects:*,将只允许客户端访问匹配模式对象:*的键。


ACL指令介绍

  • acl list :列出所有的用户配置信息
  • acl setuser :设置用户
  • acl getuser :获取用户设置的详细信息
  • acl deluser :删除用户
  • acl whoami :查询当前的用户
  • acl cat :查询所有可以授权的选择项
  • acl load :acl持久化重载acl持久化文件
  • acl save :acl持久化手动保存到持久化文件
acl list

列出当前所有用户的详细信息

> ACL LIST
1) "user default on nopass ~* &* +@all"
结果详解
  • user:代表着用户
  • default:表示默认用户名,或则自己定义的用户名
  • on:表示是否启用该用户,默认为off(禁用)
  • #…:表示用户密码,nopass表示不需要密码
  • ~* &*:表示可以访问的Key(正则匹配)
  • +@:表示用户的权限,“+”表示授权权限,有权限操作或访问,“-”表示还是没有权限;@为权限分类,可以通过ACL查询支持的分类。+@all 表示所有权限,nocommands 表示不给与任何命令的操作权限

acl cat

Redis还可以显示所有类别的列表和每个类别包括使用Redis ACL CAT命令的确切命令。它有两种使用形式:

ACL CAT -- 会列出所有可用的类别
指令结果
 > 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"
CAT指令(2)
ACL CAT <category-name> -- 将列出类别内的所有命令

目前有21个不同的类别。现在让我们检查一下哪个命令属于geo类别:

 > ACL CAT geo
 1) "geohash"
 2) "georadius_ro"
 3) "georadiusbymember"
 4) "geopos"
 5) "geoadd"
 6) "georadiusbymember_ro"
 7) "geodist"
 8) "georadius"
 9) "geosearch"
10) "geosearchstore"
acl setuser

设置用户,可以设置用户的密码,是启用,对那些key起作用,以及那些操作权限。

acl setuser username off/on >password keys +/-@commands
  • username : 需要授权的用户名
  • off/on : 是否启用当前的用户
  • password : 当前用户的密码,前面的 > 不要丢掉,这个地方是明文密码,redis会自动加密
  • keys : 可以对那些key进行操作,正则表达式,如果全部: ~* ,~bear:* 代表:对bear开头的key有操作权限
  • +/-@commands : 表示用户的权限,“+”表示授权权限,有权限操作或访问,“-”表示还是没有权限;@为权限分类,可以通过ACL CAT查询支持的分类。+@all 表示所有权限,nocommands 表示不给与任何命令的操作权限。
实践案例
acl setuser redisadmin on >123456 ~* +@all

上面指令代表:创建一个redisadmin,密码为:123456,用户启用,对所有的key都有all所有的操作权限。

acl setuser redisReadOnly on >123456 ~* +@all -@write

上面指令代表:创建一个redisReadOnly,密码为:123456,用户启用,对所有的key都有all所有的操作权限,但是去掉写入的权限。

虽然是只读权限,但是自己可以通过acl改动自己的权限

acl setuser read on >123456 ~* +@all -@write -@admin

上面指令代表:创建一个testuser3,密码为:123456,用户启用,对所有的key都有all所有的操作权限,但是去掉写入的权限,也去掉(admin相关的操作)进行acl操作。(就是只读去权限)

acl deluser

删除用户,顾名思义,就是删除已经存在用户。

acl deluser username
acl deluser offuser

需要注意的是,删除已经存在的用户,成功返回的是1,删除失败或者不存在的用户返回0;

acl save/acl load
持久化保存到配置文件中

acl save

重载acl配置文件中内容

acl load

这两个一般是成对出现的,使用了acl save,一般立即使用acl load。这样做的好处,不用重启redis,就知道最新的acl配置文件,可以及时的获取最新的用户权限数据。

以上是关于Redis 技术探索「安全实战系列」带你认识一下Redis的权限控制机制ACL(访问控制列表)是什么的主要内容,如果未能解决你的问题,请参考以下文章

Redis技术探索「实战开发系列」针对于Sentinel的特性分析及开发实战指南

带你涨姿势,认识一下Netty!

Dubbo3 终极特性「云原生三中心架构」带你探索 Dubbo3 体系下的配置中心和元数据中心注册中心的原理及开发实战(中)

Dubbo3 终极特性「云原生三中心架构」带你探索 Dubbo3 体系下的配置中心和元数据中心注册中心的原理及开发实战(中)

Redis实战专题「性能监控系列」全方位探索Redis的性能监控以及优化指南

带你涨知识,认识一下打破世界纪录的数据库OceanBase!