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

Redis账户权限怎么查,用户权限那些事儿浅析和实操分享

主要结合了Redis官方文档关于ACL的说明、以及几篇技术社区如CSDN、掘金上用户分享的实战经验文章,比如名为“Redis 6.0 ACL机制详解”和“一次Redis权限排查经历”的帖子)

Redis账户权限怎么查,用户权限那些事儿浅析和实操分享

以前我们用Redis,很多时候图省事,就直接用那个默认的账号,密码可能也不设,或者就一个超级密码大家共用,这就像你家大门钥匙放在门口脚垫下面,谁都知道,挺不安全的,后来Redis 6.0版本出了一个很重要的功能,叫做ACL,就是访问控制列表,从那以后,Redis也能像很多数据库一样,给不同的用户分配不同的权限了,今天我们就来聊聊,怎么查看Redis里的用户和权限,以及这里面的一些门道和实际操作。

第一部分:权限查看篇——看看现在都有谁,能干什么

Redis账户权限怎么查,用户权限那些事儿浅析和实操分享

想知道Redis里现在有哪些用户,以及他们都有什么权限,最简单直接的办法就是使用命令行工具。

  1. 连接上Redis:你得用Redis的客户端工具连上你的Redis服务器,通常我们是用redis-cli命令,如果设置了密码,还需要用-a参数输入密码。redis-cli -h 你的服务器地址 -p 6379 -a 你的密码,不过要注意,用-a参数可能会在历史命令里留下密码痕迹,不太安全,更推荐先连接上去,再用AUTH命令认证。

  2. 查看用户列表:连接成功后,输入命令 ACL LIST,这个命令会列出当前Redis实例中所有的用户以及他们详细的权限规则,你会看到类似这样的输出: user default on xxxxxx ~* &* +@all user appuser on yyyyyy ~cache:* &* +get +set +hget +hset 每一行代表一个用户,我们来拆解一下这串“天书”:

    Redis账户权限怎么查,用户权限那些事儿浅析和实操分享

    • user:关键字。
    • default / appuser:用户名。
    • on:表示这个用户是启用的,如果是off,就表示这个用户被禁用了。
    • xxxxxx / yyyyyy:这里是密码的哈希值,你看不到明文密码,是安全的。
    • ~cache:*:这个非常关键!它表示这个用户有权操作的键(Key)的模式,是前缀,cache:*意思是所有以cache:开头的键,就代表可以操作所有的键,如果你看到一个用户只能操作user:123:*这样的键,那他就动不了其他前缀的键。
    • &*:这个是Redis 6.2版本后加入的,表示可以访问所有频道(用于发布订阅功能),同样,可以限制具体的频道模式。
    • +@all+get +set ...:这部分是命令权限,号表示允许执行某个命令。+@all是允许所有命令,这是超级管理员权限,下面的例子只允许执行get, set, hget, hset这几个命令,如果看到-@all或者-某个命令,就表示拒绝,权限是叠加的,一般是先拒绝所有-@all,再一个个加回来+命令
  3. 查看特定用户信息:如果你只想看某一个用户的具体情况,比如想看appuser的权限,可以用 ACL GETUSER appuser,这个命令会把这个用户的权限规则更结构化地展示出来,看得更清楚。

  4. 查看当前连接的用户是谁:有时候你可能会用不同账号连接,想知道当前这个连接用的是哪个账号的权限,可以输入 ACL WHOAMI,它会直接返回当前客户端的用户名。

第二部分:权限浅析与实操篇——怎么管好权限

Redis账户权限怎么查,用户权限那些事儿浅析和实操分享

光会看还不行,我们还得知道怎么设置才合理,避免出问题。

  1. 原则:最小权限原则,这是安全领域的黄金法则,就是给一个用户的权限,刚好够他完成工作就行,一点都不要多,比如一个只用来做缓存的应用程序,它可能只需要GETSETEXPIRE等几个命令,你绝对不应该给它FLUSHDB(清空当前数据库)或者CONFIG(修改服务器配置)这种危险的权限,那些技术社区分享的故障案例里,不少都是因为权限给太大,被误操作或者恶意攻击导致数据丢失。

  2. 实操:创建和管理用户

    • 创建新用户:我们可以用ACL SETUSER命令来创建或修改用户,举个例子,我想创建一个叫data_reader的用户,密码是readonly123,只允许它读数据(比如用GETHGETSMEMBERS等读命令),并且只能读取report:*开头的键,命令可以这样写: ACL SETUSER data_reader on >readonly123 ~report:* &* +@read -@write +@hash +@set ... 这里>readonly123表示设置密码。+@read是允许所有读命令类别,但为了更精确,我们用了-@write拒绝所有写命令,然后再单独加一些需要的读命令类别(@hash, @set)或具体命令,实际中可以根据内置的命令类别来简化操作。
    • 修改用户密码:如果想给用户改密码,也是用ACL SETUSERACL SETUSER data_reader >newpassword
    • 删除用户:用 ACL DELUSER data_reader
  3. 一个常见的实操场景:线上应用和运维账号分离,根据那些经验分享文章里的建议,一个好的实践是:

    • 创建一个权限很小的应用账号(比如叫app_worker),只给它业务必需的命令和键空间,用于日常的应用程序连接。
    • 创建一个高权限的运维账号(比如叫ops_admin),拥有+@all权限,但平时不常用,这个账号的密码要严格管理,只在需要维护、排查问题的时候才使用。
    • 禁用默认的default账号,或者给default账号换一个非常复杂的密码并妥善保存,避免被默认攻击,这样即使有人想用默认空密码试,也进不来。

总结一下

Redis的ACL功能给了我们细化权限管理的能力,核心就是通过ACL LISTACL GETUSER来查看权限状况,管理用户时,牢记“最小权限”原则,利用ACL SETUSER为不同的应用和人员创建合适的账号,只给必要的键访问权和命令执行权,这样做虽然前期会麻烦一点点,但能从很大程度上避免“删库跑路”的悲剧和安全隐患,让Redis用得更加稳妥,希望这些浅析和实操分享对你有帮助。