Redis 6.0终于支持了ACL部分,以替代之前的简单密码方式,避免了在项目中初级用户误操作的问题。
Note: 以下`redis.conf`配置部分使用机翻译 + 人工校正。
################################## SECURITY ###################################
# 警告:由于Redis速度相当快,外部用户每秒可以在一个现代盒型上尝试多达100万个密码。
# 这意味着你应该使用非常强的密码,否则它们很容易被破坏。
# 请注意,由于密码实际上是客户端和服务器之间的共享秘密,任何人都不应该记住,
# 因此密码很容易是/dev/urandom或其他文件中的长字符串,因此使用长而不可访问的密码将不可能进行暴力攻击。
# Redis ACL用户的定义格式如下:
#
# user <username... acl rules ...
#
# 例如:
#
# user worker +@list +@connection ~jobs:* on >ffa9203c493aa99
#
# 特殊用户名“default”用于新连接。
# 如果此用户具有“nopass”规则,则新连接将立即作为“默认”用户进行身份验证,而无需通过AUTH命令提供任何密码。
# 否则,如果“默认”用户未标记为“nopass”,连接将在未经过身份验证的状态下启动,
# 并且将需要AUTH(或HELLO命令AUTH选项)才能进行身份验证并开始工作。
# 描述用户可以做什么的ACL规则如下:
#
# on 启用用户:可以作为该用户进行身份验证。
# off 禁用用户:无法再进行身份验证。
# 对于该用户,但是已经通过身份验证的连接仍然有效。
# skip-sanitize-payload 已跳过RESTORE转储有效负载清理。
# sanitize-payload RESTORE转储负载已清除(默认值)。
# +<command> 允许执行该命令。
# 可以与“|”一起使用以允许子命令(例如“+config|get”)
# -<command> 禁止执行该命令。
# 可以与“|”一起用于阻止子命令(例如“-config|set”)
# +@<category> 允许执行此类别中的所有命令
# 有效类别如@admin、@set、@sortedset。。。
# 等等,请参阅server.c文件中的完整列表,其中
# 对Redis命令表进行了描述和定义。
# 特殊类别@all表示所有命令,但当前存在于服务器中,
# 并且将在将来加载通过模块。
# +<command>|first-arg 允许其他已禁用命令 加 一个特定的起始参数。
# 只有具有子命令的才支持这种格式。
# 若没有子命令,并且不允许作为负形式,如“-SELECT|1”,只有以“+”开头的写法(这功能已弃用,将来可能会被删除。)
# 提示:支持如+config|get, 而info等无子命令可使用"+/-<command>"规则。
# allcommands +@all的别名. 请注意,它意味着拥有能力去执行未来的、由模块系统所加载的命令。
# nocommands -@all的别名.
# ~<pattern> 添加一个模式,pattern可以是命令提及关键字的一部分。
# 例如~*允许所有键。pattern是一个类似于KEYS支持的、glob样式的模式。
# 可以指定多个模式。
# %R~<pattern> 添加键读取模式,指定可以从中读取的键。
#
# %W~<pattern> 添加键写入模式,指定可以写入的键。
# allkeys ~*的别名。
# resetkeys 刷新允许的密钥模式列表。
# &<pattern> 添加(用户可以访问的)Pub/Sub频道的glob风格模式。
# 可以指定多个channel模式。
# allchannels &*的别名。
# resetchannels 刷新允许的通道模式列表。
# ><password> 将此密码添加到用户的有效密码列表中。
# 例如>mypass会将“mypass”添加到列表中。
# 此指令清除“nopass”标志(请参阅下文)。
# <<password> 从有效密码列表中删除此密码。
# nopass 用户的所有设置密码都将被删除,并且用户被标记为不需要密码:
# 这意味着每个密码将对此用户有效。
# 如果此指令是用于默认用户,每个新连接都将立即使用默认用户进行身份验证 ,
# 需要任何明确的AUTH命令。请注意,“resetpass”指令将清除此条件。
# resetpass 刷新允许的密码列表。
# 此外,删除“无通行证”状态。在“resetpass”之后,用户没有关联密码,
# 不添加就无法进行身份验证一些密码(或稍后将其设置为“nopass”)。
# reset 执行以下操作:resetpass、resetkeys、off、-@all,
# 用户会立即返回到相同的、其被创建后的状态。
# (<options>) 用括号内指定的options创建一个新选择器,并将其附加到用户。
# 每个选项都应该用空格分割。第一个字符必须是(和最后一个字符必须是)。
# clearselectors 删除所有当前连接的选择器。
# 请注意,这不会更改“root”用户权限,这里指直接应用于user的权限(括号外)。
#
# ACL规则可以按任何顺序指定:例如,您可以从密码、标志或密钥模式开始,然后标志。
# 但是,请注意,加法和减法规则将根据顺序改变含义。
# 例如,请参见以下示例:
#
# user alice on +@all -DEBUG ~* >somepassword
#
# 这将允许“alice”使用除DEBUG命令外的所有命令,
# 因为+@all将所有命令添加到alice可以使用的命令集中,并且后来删除了DEBUG。
# 但是,如果我们颠倒两个ACL规则的顺序,结果将不同:
#
# user alice on -DEBUG +@all ~* >somepassword
#
# 现在,当alice在允许的命令集中还没有命令时,
# DEBUG被删除了,后来所有的命令都被添加了,所以用户将能够执行所有的命令。
#
# 基本上ACL规则是从左到右处理的。
# 权限组如下:
# * keyspace - 写入或读取键名、数据库或其元数据,以一种类型不可知的方式。
# 包括DEL、RESTORE、DUMP、RENAME、EXISTS、DBSIZE、KEYS、EXPIRE、TTL、FLUSHALL等。
# 命令可以修改keyspace,键或元数据也将具有“写入”类别。
# 仅读取keyspace的命令、密钥或元数据将具有“读取”类别。
#
# * read - 正在读取键(值或元数据)。请注意,不
# 与键交互的命令,将不具有“读取”或“写入”。
# * write - 写入键(值或元数据)。
# * admin - 管理命令。普通应用程序永远不需要使用这些,
# 包括REPLICAOF, CONFIG, DEBUG, SAVE, MONITOR, ACL, SHUTDOWN等。
# * dangerous - 潜在危险操作(每种都应小心考虑各种原因)。
# 这包括FLUSHALL、MIGRATE、RESTORE、SORT、KEYS、CLIENT, DEBUG、INFO、CONFIG、SAVE、REPLICAOF等.
# * connection - 影响当前的或其他的连接.
# 这包括AUTH, SELECT, COMMAND, CLIENT, ECHO, PING等.
# * blocking - 可能会阻塞连接,直到被另一个命令释放。
#
# * fast - 快命令,复杂度 O(1) . 可能循环参数数量的次数,但不等于key中元素数量.
#
# * slow - 所有不快速的命令。
# * pubsub - PUBLISH / SUBSCRIBE 相关的。
# * transaction - WATCH / MULTI / EXEC 相关命令.
# * scripting - script相关.
# * set - 数据类型: sets 相关.
# * sortedset - 数据类型: zsets 相关.
# * list - 数据类型: lists 相关.
# * hash - 数据类型: hashes 相关.
# * string - 数据类型: strings 相关.
# * bitmap - 数据类型: bitmaps 相关.
# * hyperloglog - 数据类型: hyperloglog 相关.
# * geo - 数据类型: geo 相关.
# * stream - 数据类型: streams 相关.
#
# For more information about ACL configuration please refer to
# the Redis web site at https://redis.io/topics/acl
>
# ACL 日志
# (提示:这条不用写入aclfile)
#
# ACL日志跟踪与ACL关联的失败命令和身份验证事件。
# ACL日志可用于对ACL阻止的失败命令进行故障排除。
# ACL日志存储在内存中。
# 您可以使用ACL LOG RESET回收内存。
# 在下面定义ACL日志的最大条目长度:
acllog-max-len 128
# 使用外部ACL文件。
#
# 相比于在此处直接配置用户列表,还可以使用独立配置文件来配置用户。
# 这两种方法不能混用:
# 如果在此处配置用户,同时激活外部ACL文件,则服务器将拒绝启动。
# 外部ACL用户文件的格式与redis.conf中用于描述用户的格式完全相同。
# 备注:要么在.conf文件中配置用户列表, 要么启用aclfile引入外部.acl文件来配置。
#
aclfile /usr/local/etc/redis/users.acl
### 旧的用户系统
默认未启用ACL功能的情况下,使用 `requirepass password` 中的 password 即可连接,并且client拥有所有命令的权限。
注意:这也导致在团队中default拥有危险命令的权限,如flushdb、save卡机、config set等。
### 如何启用ACL功能?
在配置中添加第一行 user username on/off key规则 +@权限组 -@权限组 +命令` ,即启用了ACL功能。
此时 requirepass 设定的密码已被自动忽略, 然后将没有缺省用户, 每一个用户都是有用户名的,在连接时需要提供。
### 如何单独配置到ACL文件中 ?(建议)
1. 在 redis.conf 中注释掉`user ***` 相关的用户申明;(默认为注释掉)
2. 在 redis.conf 启用 aclfile /path/to/users.acl;
3. 创建 `/path/to/users.acl`; (文件名不限, 建议放在和 redis.conf 相同的目录)
.acl文件内容,例如:
user default on &* ~* +@all >654321
user admin on &* ~* +@admin >654321
user web on &* ~* +@all -@admin -@dangerous +info >654321
user readonly on &* ~* +@read +select +ping >69117db8524a8c33789312e76616f1fbec6aedb3f0ca4096672b39c021e06e28
注意: 建议用· acl genpass · 生成长密码。
### 热管理用户
.acl 配置的用户可以被连接命令热载入、保存到文件。
修改acl文件后载入使用 ` acl load `, 通过命令修改后要存入acl文件使用` acl save `
acl genpass
acl userset zhangsan
acl setuser zhangsan ~* +@all -config|set -flushdb >2aafd67405088c485be1b64b7797a3ee9ef4290ce02e96f15160490fc40a1f48
acl deluser lisi
acl save