Redis的ACL怎么用来管权限,保证网络安全不被乱进乱改
- 问答
- 2026-01-07 00:24:31
- 22
Redis的ACL,全称是访问控制列表,是在Redis 6.0版本中引入的一个核心安全特性,在Redis 6.0之前,管理权限的方式非常单一,基本上只依赖于一个全局的密码(通过requirepass配置),任何人只要知道了这个密码,就拥有了对整个Redis数据库的完全控制权,包括读取所有数据、修改任意数据、甚至执行命令关闭服务器,这就像给整个房子只配了一把万能钥匙,任何人拿到钥匙就能进入所有房间,风险极高。
Redis ACL的引入彻底改变了这一局面,它的核心思想是为不同的用户分配不同的权限,实现最小权限原则,也就是说,一个用户只能拥有完成其工作所必需的最少权限,不多也不少,这就像给不同的家庭成员、保姆、维修工分配了不同的钥匙和门禁权限,他们只能进入被允许的区域。
ACL的基本概念:用户、密码和权限规则
根据Redis官方文档(《Redis命令参考》中的ACL相关章节),ACL系统主要围绕以下几个要素构建:
-
用户(Users):ACL系统可以创建多个用户,而不仅仅是使用一个默认用户,默认情况下,Redis有两个预定义用户:
default(默认用户,即没有显式认证时使用的用户)和default(一个特殊的超级用户,默认是禁用的),你可以为你的应用程序、管理员、监控系统等创建独立的用户。
-
密码(Passwords):每个用户可以关联一个或多个密码,密码有两种形式:
>开头的密码:表示明文密码,>mypassword123。- 开头的密码:表示SHA256哈希后的密码,这是更安全的存储方式,因为配置文件中不会出现明文密码,Redis提供了
ACL GENPASS命令可以生成哈希值。
-
权限规则(Rules):这是ACL的核心,它定义了一个用户可以执行哪些命令、可以访问哪些键,规则由一系列关键字组成。
关键的权限规则详解
权限规则的语法是 +命令类别|具体命令|别名 来表示允许,用 来表示禁止,更精细的控制还包括对键模式的匹配。

-
命令控制:
+@all或allcommands:允许执行所有命令,这是超级管理员才应该拥有的权限,非常危险。-@all或nocommands:禁止所有命令,这是新用户的默认状态,你需要在此基础上添加权限。+@read:允许所有只读命令,如GET、LRANGE、SMEMBERS等,这非常适合只需要查询数据的应用程序用户。+@write:允许所有写入命令,如SET、DEL、HSET等。+@admin:允许管理类命令,如SAVE、INFO、CONFIG、SHUTDOWN等,这类命令通常只应分配给极少数管理员。- 你也可以指定单个命令,
+get、+set、-keys,这提供了最精细的控制。
-
键模式控制:这是防止“乱进乱改”的关键,你可以限制用户只能访问特定模式的键。
- 语法是
~<pattern>,模式支持通配符,类似于正则表达式。 ~cache:*表示用户只能访问以cache:开头的键。- 表示允许访问所有键,这是默认行为。
- 通过键模式控制,你可以实现数据隔离,为用户A分配
~user:A:*,为用户B分配~user:B:*,这样他们彼此就无法访问对方的数据。
- 语法是
-
其他控制:
- 可以控制用户是否能够执行Pub/Sub(发布/订阅)操作。
- 可以控制用户是否能够执行Lua脚本。
实战场景:如何配置ACL来保证安全

假设我们有一个简单的Web应用,包含以下角色:
- 应用服务器(App User):负责读写缓存数据,它不应该有关闭服务器或查询所有键的权限。
- 监控系统(Monitor User):只需要定期执行
INFO命令来收集服务器状态,它不应该有任何读写数据的权限。 - 系统管理员(Admin User):拥有全部权限,但只能从特定的管理网络IP地址连接。
我们可以通过Redis命令行(使用ACL SETUSER命令)或直接在redis.conf配置文件中进行配置。
配置示例(在redis.conf中):
# 禁用默认的default用户,要求所有连接都必须认证,这是非常重要的第一步,避免匿名访问。 aclfile /etc/redis/users.acl # 可选:将ACL规则存储在外部文件,便于管理 # 定义应用用户 ‘appuser’ user appuser on >appsecretpassword ~app:* +@read +@write -@admin -keys # 解释: # ‘on’ 表示启用该用户。 # ‘>appsecretpassword’ 是明文密码。 # ‘~app:*’ 表示只能操作以 ‘app:’ 开头的键。 # ‘+@read +@write’ 允许读写命令。 # ‘-@admin’ 明确禁止所有管理命令。 # ‘-keys’ 特别禁止了KEYS命令,因为这个命令在生产环境可能很危险。 # 定义监控用户 ‘monitoruser’ user monitoruser on >monitorpass -@all +info # 解释: # ‘-@all’ 先禁止所有命令。 # ‘+info’ 只允许执行INFO命令。 # 定义管理员用户 ‘adminuser’,并限制IP来源 user adminuser on >supersecretadminpass ~* +@all # 解释: # ‘~*’ 和 ‘+@all’ 表示所有键和所有命令的权限。 # 注意:我们还需要结合防火墙或Redis的‘bind’、‘protected-mode’设置,来限制只有管理IP可以连接到Redis端口(通常是6379),ACL本身也可以按用户限制IP,但通常在网络层控制更直接。
管理ACL的常用命令
ACL LIST:列出所有已定义的ACL规则。ACL SETUSER <username> ...:创建或修改用户。ACL DELUSER <username>:删除用户。ACL GENPASS:生成一个SHA256哈希密码。AUTH <username> <password>:客户端使用用户名和密码进行认证。
Redis ACL是一个强大且灵活的工具,它能极大地增强Redis实例的安全性,通过为不同的服务或用户创建独立的账户,并严格遵循最小权限原则来分配命令和键空间访问权,可以有效地防止因某个应用被入侵而导致整个Redis数据库被“乱进乱改”的灾难性后果,结合良好的网络隔离(如防火墙规则)和定期更换密码等最佳实践,ACL能够为你的Redis服务构筑一道坚实的安全防线。
本文由瞿欣合于2026-01-07发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/75878.html
