【翻译】Redis的ACL访问控制机制

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

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Redis ACL(Access Control Lists)是 Redis 6.0 中新增的一项功能,用于对 Redis 实例的访问进行细粒度控制。通过 ACL 可以对每个用户分配不同的权限,从而保证 Redis 实例的安全性。 下面是 Redis ACL 的一些配置权限示例: 1. 创建用户 ``` ACL SETUSER username password ``` 其中,`username` 为要创建的用户名,`password` 为该用户的密码。 2. 设置用户权限 ``` ACL SETUSER username on|off [command_name [key_pattern]] ``` 其中,`on` 表示允许该用户执行指定命令,`off` 表示禁止该用户执行指定命令。`command_name` 表示要设置权限的命令名,`key_pattern` 表示要设置权限的键名模式。 例如,设置用户 `test_user` 只能执行 `get` 和 `set` 命令: ``` ACL SETUSER test_user on get set ``` 3. 设置默认权限 ``` ACL SETUSER default on|off [command_name [key_pattern]] ``` 其中,`default` 表示所有用户的默认权限。可以使用 `on` 或 `off` 指定是否允许执行指定的命令。 例如,设置所有用户只能执行 `get` 和 `set` 命令: ``` ACL SETUSER default on get set ``` 4. 查看用户权限 ``` ACL GETUSER username ``` 通过该命令可以查看指定用户的权限。 5. 查看所有用户 ``` ACL USERS ``` 通过该命令可以查看当前 Redis 实例中所有的用户。 6. 删除用户 ``` ACL DELUSER username ``` 通过该命令可以删除指定的用户。 需要注意的是,Redis ACL 需要在 Redis 配置文件中启用,具体配置可以参考 Redis 官方文档。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值