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

Redis用户默认只读咋办,怎么改成能写还能读的权限呢

这个问题通常出现在使用Redis 6.0及以上版本时,因为从这个版本开始,Redis引入了更完善的访问控制列表(ACL)功能,可以更精细地管理用户权限,很多云服务商或者自己搭建Redis时,为了安全起见,创建的默认用户可能只有读权限。

为什么会有默认只读用户? 这主要是出于安全考虑,想象一下,如果你的应用程序只需要从Redis里读取一些缓存数据,比如网站的文章内容、商品信息等,那么给它一个只能读不能写的账号,就算这个应用程序的代码有漏洞被黑客利用了,黑客也无法通过这个账号修改或删除你Redis里的重要数据,这就起到了一个安全防护的作用,这是一种叫做“最小权限原则”的安全实践,只授予账户完成其任务所必需的最小权限。

怎么知道我的用户是不是只读的? 你需要确认你当前使用的用户确实只有读权限,如果你能连接到Redis,可以尝试执行一个写的命令来测试,比如试着用 SET mykey "test" 命令往Redis里写一个简单的键值对,如果返回的错误信息是 (error) NOPERM this user has no permissions to run the 'set' command 或类似的提示,那就说明你的用户没有写的权限。

Redis用户默认只读咋办,怎么改成能写还能读的权限呢

更准确的方法是,使用一个有足够权限的账号(比如默认的超级用户)来查看你的用户的权限配置,你可以使用 ACL LIST 命令来列出所有用户及其权限,在返回的结果中,你会看到类似这样的行: user default on xxxxxx ~* &* +@all user my_readonly_user on xxxxxx ~* &* +@read

这里的关键是最后一部分,+@read 表示这个用户只有读命令的权限,而超级用户通常是 +@all,表示拥有所有权限。

如何将一个只读用户改成可读可写? 核心的方法就是使用Redis的ACL命令来修改用户的权限,你需要一个有权管理用户权限的账号来执行这个操作,通常就是默认的default用户(如果没改过密码且未禁用的话)或者你已知的另一个管理员账号。

Redis用户默认只读咋办,怎么改成能写还能读的权限呢

具体操作步骤如下:

  1. 连接Redis:使用Redis命令行工具redis-cli连接到你的Redis服务器,你可能需要指定主机地址、端口和密码。redis-cli -h your_redis_host -p 6379 -a your_password

  2. 验证当前权限(可选但推荐):先执行 ACL WHOAMI 确认当前登录的用户,然后尝试执行 ACL LIST 查看目标用户的权限详情。

    Redis用户默认只读咋办,怎么改成能写还能读的权限呢

  3. 修改用户权限:使用 ACL SETUSER 命令来重新配置目标用户,这是最关键的一步。 如果你想直接给用户所有权限(可读可写且能执行管理命令),可以运行: ACL SETUSER your_username on >your_password ~* &* +@all 让我们分解一下这个命令:

    • your_username:你要修改的那个只读用户的用户名。
    • on:启用这个用户。
    • >your_password:设置用户的新密码,如果你不想改密码,可以省略 >your_password 部分。
    • :表示这个用户可以访问所有键。 后面跟的是键的模式, 代表所有。
    • &*:这是Redis 7.0及以上版本引入的,表示用户可以访问所有发布/订阅频道,如果你的版本是7.0以上,最好加上。
    • +@all:给用户添加所有命令的权限,这是从只读变成可读可写的核心, 表示添加权限,@all 表示所有命令的类别。

    如果你不想给用户那么大的权限(比如不想让它执行FLUSHDB这种危险的管理命令),可以只给它读写权限,而不是全部权限,一个更安全的做法是: ACL SETUSER your_username on >your_password ~* &* +@read +@write -@dangerous 这个命令的意思是:授予读命令权限(+@read)、写命令权限(+@write),但排除危险命令(-@dangerous),这样更符合生产环境的安全要求。

  4. 验证修改结果:修改完成后,再次使用 ACL LIST 命令检查目标用户的权限字符串是否已经变成了 +@read +@write+@all,用这个用户重新登录,尝试执行读命令(如 GET mykey)和写命令(如 SET mykey2 "value"),确认读写功能都正常。

一些特殊情况和建议

  • 参考Redis官方文档关于ACL的说明:Redis的ACL系统非常灵活,除了简单的读写分类,还可以精确到控制单个命令的权限,如果你有更复杂的需求,可以查阅官方文档。
  • 配置文件修改:通过命令行修改的ACL规则在Redis重启后会丢失,除非你执行了 ACL SAVE 命令将当前ACL规则保存到配置文件(通常是redis.conf)中,执行 ACL SAVE 会将用户配置持久化,你也可以直接修改Redis配置文件中的user指令块,然后重启Redis生效,但更推荐使用命令行修改后保存的方式。
  • 云数据库服务:如果你使用的是阿里云、腾讯云等云服务商提供的Redis数据库,通常他们会提供一个管理控制台,修改用户权限的操作可能需要在控制台上完成,因为可能限制了直接使用ACL命令,你需要登录到云服务商的管理后台,找到Redis实例的用户管理或权限设置部分进行操作。
  • 谨慎授予权限:虽然把用户改成+@all最省事,但从安全角度出发,强烈建议遵循“最小权限原则”,你的应用程序需要什么权限,就只给它什么权限,一个只做缓存的程序,可能只需要GETSETEXPIRE等几个命令的权限,你可以使用 ACL SETUSER 精确添加这些命令,而不是直接给整个写权限。

将Redis只读用户改为可读可写,本质上是使用ACL SETUSER命令,通过+@write+@all参数来为用户添加写命令的权限,操作前请确保你用的账号有权限管理其他用户,并且操作后记得验证和持久化保存配置。