ACL简介(此次版本以6.2版本为模板)
ACL是Access Control List的缩写,该功能允许根据可以执行的命令和可以访问的键来限制某些连接
ACL权限认证可以指定用户指定某些DB,取消高危操作等。
这里只做ACL命令的权限DB和高危权限隔离。搭建请看另一篇文章。
简单一个语法描述下DB隔离
acl setuser test ~* &* +@all -@dangerous -select +select|8 +info +client +role +keys on >test123456
test : 用户名
+@all :增加所有权限
-@dangerous :取消该用户高危操作,如flushdb
-select :取消select权限
+select|8 :只能访问DB8
+info +client +role +keys :增加这些语法的权限
test123456 :密码
ACL权限详解
ACL LIST
1) "user default on nopass ~* &* +@all"
每行的前两个单词是“user”,后跟用户名。接下来的单词是描述不同事物的 ACL 规则。我们将详细展示规则如何工作,但现在只需说默认用户配置为活动(on)、不需要密码(nopass)、访问每个可能的密钥(~*)和发布/订阅通道 (&*),并且能够调用每个可能的命令 (+@all)。
此外,在默认用户的特殊情况下,拥有 nopass 规则意味着新连接将自动通过默认用户进行身份验证,而无需任何显式 AUTH 调用。
另外寻求数据库兼职,可联系此账号
DBA数据库中间件工程师,运维,故障解决,数据迁移,带运维。
7年专业 MySQL,Postgresql,redis,mongodb,kafka,rocketmq,rabbitmq,TIDB,Doris,clickhouse
ACL规则
- 启用和禁止用户:
on:启用用户:可以作为该用户进行身份验证。
off:禁止该用户:无法再对该用户进行身份验证;但是,之前经过身份验证的连接仍然有效。请注意,如果默认用户被标记为关闭,则新连接将以未经身份验证的方式启动,并且将要求用户发送带有 AUTH 选项的 AUTH 或 HELLO,以便以某种方式进行身份验证,无论默认用户配置如何。
- 允许和禁止命令:
+<command>:将命令添加到用户可以调用的命令列表中。可以与 | 一起使用用于允许子命令(例如“+config|get”)授予此账户权限。
- 允许和禁止某些键和键权限:
~<pattern>:添加可作为命令一部分提及的按键模式。例如 ~* 允许所有键。该模式是一种类似于 KEYS 模式的全局样式模式。可以指定多个模式。
- 允许和禁止 Pub/Sub 频道:
&<pattern>:(在 Redis 6.2 及更高版本中可用)添加用户可以访问的 Pub/Sub 通道的 glob 样式模式。可以指定多个通道模式。请注意,模式匹配仅针对 PUBLISH 和 SUBSCRIBE 提到的通道进行,而 PSUBSCRIBE 要求其通道模式与用户允许的通道模式之间进行文字匹配
- 为用户配置有效密码:
password :将此密码添加到用户的有效密码列表中。例如,>mypass 会将“mypass”添加到有效密码列表中。该指令清除 nopass 标志(见下文)。每个用户可以拥有任意数量的密码
nopass:删除用户的所有设置密码,并将该用户标记为不需要密码:这意味着每个密码都对该用户有效。如果此指令用于默认用户,则每个新连接将立即使用默认用户进行身份验证,无需任何显式 AUTH 命令。请注意,resetpass 指令将清除此条件。
如果用户未标记为 nopass 并且没有有效密码列表,则该用户实际上无法使用,因为无法以该用户身份登录
使用 ACL SETUSER 命令创建和编辑用户 ACL
1.使用 ACL 命令及其 ACL SETUSER 子命令。
2.修改服务器配置(可以定义用户)并重新启动服务器。对于外部 ACL 文件,只需调用 ACL LOAD。
最简单的ACL用户
> ACL SETUSER test
OK
ACL SETUSER 命令采用用户名和要应用于用户的 ACL 规则列表。然而上面的例子根本没有指定任何规则。如果用户不存在,这将仅创建用户,并使用新用户的默认值。如果用户已经存在,上面的命令将不会执行任何操作。
检查默认用户状态:
> ACL LIST
1) "user test off resetchannels -@all"
2) "user default on nopass ~* &* +@all"
新用户“test”是:
- 在关闭状态下,因此 AUTH 对用户“alice”不起作用。
- 该用户也没有设置密码。
- 无法访问任何命令。请注意,默认情况下创建的用户无法访问任何命令,因此上面输出中的 -@all 可以省略;然而,ACL LIST 尝试显式而不是隐式。
- 没有用户可以访问的关键模式。
- 没有用户可以访问的 Pub/Sub 通道。
现在给他加密码,权限等
ACL SETUSER test on >test123456 ~test:* +get
现在用户可以做一些事情,但会拒绝做其他事情:
> AUTH test test123456
OK
> GET dd
(error) NOPERM this user has no permissions to access one of the keys used as arguments
> GET test:3343
(nil)
> SET jian:1234 dada
(error) NOPERM this user has no permissions to run the 'set' command
事情正在按预期进行。为了检查用户 test 的配置(请记住用户名区分大小写),可以使用 ACL LIST 的替代方案,它被设计为更适合计算机读取,而 ACL GETUSER 更适合人类可读。
> ACL GETUSER test
1) "flags"
2) 1) "on"
3) "passwords"
4) 1) "2d9c75..."
5) "commands"
6) "-@all +get"
7) "keys"
8) "~test:*"
9) "channels"
10) ""
11) "selectors"
12) (empty array)
ACL GETUSER 返回一个字段值数组,该数组以更可解析的术语描述用户。输出包括标志集、密钥模式列表、密码等。如果我们使用 RESP3,输出可能更具可读性,因此它作为地图回复返回:
> ACL GETUSER test
1# "flags" => 1~ "on"
2# "passwords" => 1) "2d9c75273d72b32df726fb545c8a4edc719f0a95a6fd993950b10c474ad9c927"
3# "commands" => "-@all +get"
4# "keys" => "~test:*"
5# "channels" => ""
6# "selectors" => (empty array)
使用另一个 ACL SETUSER 命令(来自不同的用户,因为 alice 无法运行 ACL 命令),我们可以向用户添加多个模式:
> ACL SETUSER test ~objects:* ~items:* ~public:*
OK
> ACL LIST
1) "user test on #2d9c75... ~test :* ~objects:* ~items:* ~public:* resetchannels -@all +get"
2) "user default on nopass ~* &* +@all"
多次调用 ACL SETUSER
了解多次调用 ACL SETUSER 时会发生什么非常重要。需要了解的重要一点是,每个 ACL SETUSER 调用都不会重置用户,而只会将 ACL 规则应用于现有用户。仅当用户之前不知道时才会重置用户。在这种情况下,将使用清零 ACL 创建一个全新的用户。用户无法执行任何操作、被禁止、没有密码等等。这是安全的最佳默认值。
然而,以后的调用只会增量地修改用户。例如,以下序列:
> ACL SETUSER myuser +set
OK
> ACL SETUSER myuser +get
OK
看下权限
> ACL LIST
1) "user default on nopass ~* &* +@all"
2) "user myuser off resetchannels -@all +get +set"
命令类别
通过逐个指定所有命令来设置用户 ACL 确实很烦人,所以我们这样做:
> ACL SETUSER antirez on +@all -@dangerous >42a979... ~*
通过说 +@all 和 -@dangerous,我们包含了所有命令,然后删除了 Redis 命令表中标记为危险的所有命令。请注意,命令类别从不包含除 +@all 之外的模块命令。如果您说+@all,则用户可以执行所有命令,甚至是通过模块系统加载的未来命令。但是,如果您使用 ACL 规则 +@read 或任何其他规则,则始终排除模块命令。这非常重要,因为您应该只信任 Redis 内部命令表。模块可能会暴露危险的东西,并且在 ACL 只是附加的情况下,即以 +@all -... 的形式,您应该绝对确定您永远不会包含您不想包含的内容。
命令类别及其含义的列表:
admin - 管理命令。普通应用程序永远不需要使用它们。包括REPLICAOF、CONFIG、DEBUG、SAVE、MONITOR、ACL、SHUTDOWN等。
bitmap - 数据类型:位图相关。
blocking - 可能阻塞连接,直到被另一个命令释放。
connection - 影响连接或其他连接的命令。这包括 AUTH、SELECT、COMMAND、CLIENT、ECHO、PING 等。
dangerous- 潜在危险的命令(由于各种原因,每个命令都应谨慎考虑)。这包括 FLUSHALL、MIGRATE、RESTORE、SORT、KEYS、CLIENT、DEBUG、INFO、CONFIG、SAVE、REPLICAOF 等。
geo - 数据类型:与地理空间索引相关。
hash - 数据类型:与哈希相关。
hyperloglog - 数据类型:hyperloglog 相关。
fast - 快速 O(1) 命令。可以循环参数的数量,但不能循环键中元素的数量。
keyspace - 以类型无关的方式写入或读取键、数据库或其元数据。包括DEL、RESTORE、DUMP、RENAME、EXISTS、DBSIZE、KEYS、EXPIRE、TTL、FLUSHALL等。可能修改键空间、键或元数据的命令也将具有写入类别。仅读取键空间、键或元数据的命令将具有读取类别。
list - 数据类型:相关列表。
pubsub - PubSub 相关命令。
read - 从键(值或元数据)读取。请注意,不与按键交互的命令将无法读取或写入。
scripting - 脚本相关。
set - 数据类型:与集合相关。
sortedset - 数据类型:相关的排序集。
slow - 所有命令都不快。
stream - 数据类型:与流相关。
string - 数据类型:字符串相关。
transaction - WATCH / MULTI / EXEC 相关命令。
write - 写入键(值或元数据)。
Redis 还可以使用 Redis ACL CAT 命令向您显示所有类别的列表以及每个类别包含的确切命令。它可以以两种形式使用:
ACL CAT -- Will just list all the categories available
ACL CAT <category-name> -- Will list all the commands inside the category
Examples:示例:
> 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"
正如所看到的,到目前为止有 21 个不同的类别。现在让我们检查一下地理类别中包含哪些命令:
> 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"
请注意,命令可能属于多个类别。例如,像 +@geo -@read 这样的 ACL 规则将导致某些 geo 命令被排除,因为它们是只读命令。