当前位置:首页 > 问答 > 正文

Redis的ACL怎么用来管权限,保证网络安全不被乱进乱改

Redis的ACL,全称是访问控制列表,是在Redis 6.0版本中引入的一个核心安全特性,在Redis 6.0之前,管理权限的方式非常单一,基本上只依赖于一个全局的密码(通过requirepass配置),任何人只要知道了这个密码,就拥有了对整个Redis数据库的完全控制权,包括读取所有数据、修改任意数据、甚至执行命令关闭服务器,这就像给整个房子只配了一把万能钥匙,任何人拿到钥匙就能进入所有房间,风险极高。

Redis ACL的引入彻底改变了这一局面,它的核心思想是为不同的用户分配不同的权限,实现最小权限原则,也就是说,一个用户只能拥有完成其工作所必需的最少权限,不多也不少,这就像给不同的家庭成员、保姆、维修工分配了不同的钥匙和门禁权限,他们只能进入被允许的区域。

ACL的基本概念:用户、密码和权限规则

根据Redis官方文档(《Redis命令参考》中的ACL相关章节),ACL系统主要围绕以下几个要素构建:

  1. 用户(Users):ACL系统可以创建多个用户,而不仅仅是使用一个默认用户,默认情况下,Redis有两个预定义用户:default(默认用户,即没有显式认证时使用的用户)和default(一个特殊的超级用户,默认是禁用的),你可以为你的应用程序、管理员、监控系统等创建独立的用户。

    Redis的ACL怎么用来管权限,保证网络安全不被乱进乱改

  2. 密码(Passwords):每个用户可以关联一个或多个密码,密码有两种形式:

    • >开头的密码:表示明文密码,>mypassword123
    • 开头的密码:表示SHA256哈希后的密码,这是更安全的存储方式,因为配置文件中不会出现明文密码,Redis提供了ACL GENPASS命令可以生成哈希值。
  3. 权限规则(Rules):这是ACL的核心,它定义了一个用户可以执行哪些命令可以访问哪些键,规则由一系列关键字组成。

关键的权限规则详解

权限规则的语法是 +命令类别|具体命令|别名 来表示允许,用 来表示禁止,更精细的控制还包括对键模式的匹配。

Redis的ACL怎么用来管权限,保证网络安全不被乱进乱改

  • 命令控制

    • +@allallcommands:允许执行所有命令,这是超级管理员才应该拥有的权限,非常危险。
    • -@allnocommands:禁止所有命令,这是新用户的默认状态,你需要在此基础上添加权限。
    • +@read:允许所有只读命令,如GETLRANGESMEMBERS等,这非常适合只需要查询数据的应用程序用户。
    • +@write:允许所有写入命令,如SETDELHSET等。
    • +@admin:允许管理类命令,如SAVEINFOCONFIGSHUTDOWN等,这类命令通常只应分配给极少数管理员。
    • 你也可以指定单个命令,+get+set-keys,这提供了最精细的控制。
  • 键模式控制:这是防止“乱进乱改”的关键,你可以限制用户只能访问特定模式的键。

    • 语法是 ~<pattern>,模式支持通配符,类似于正则表达式。
    • ~cache:* 表示用户只能访问以 cache: 开头的键。
    • 表示允许访问所有键,这是默认行为。
    • 通过键模式控制,你可以实现数据隔离,为用户A分配 ~user:A:*,为用户B分配 ~user:B:*,这样他们彼此就无法访问对方的数据。
  • 其他控制

    • 可以控制用户是否能够执行Pub/Sub(发布/订阅)操作。
    • 可以控制用户是否能够执行Lua脚本。

实战场景:如何配置ACL来保证安全

Redis的ACL怎么用来管权限,保证网络安全不被乱进乱改

假设我们有一个简单的Web应用,包含以下角色:

  1. 应用服务器(App User):负责读写缓存数据,它不应该有关闭服务器或查询所有键的权限。
  2. 监控系统(Monitor User):只需要定期执行INFO命令来收集服务器状态,它不应该有任何读写数据的权限。
  3. 系统管理员(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服务构筑一道坚实的安全防线。