Redis ACL权限控制

TrumanWong
5/17/2024
TrumanWong

Redis6.0之前版本只提供了一个轻量级的访问控制功能,服务端可通过requirepass命令设置密码,客户端只需通过auth命令输入密码,认证成功后,就拥有全量命令执行权限。

这种方式十分不安全,如:

针对场景1和场景2,一般可以通过rename-command命令重命名或禁用这些危险函数。但是还有另外一个问题,即多个线上业务通常共用一个Redis实例,可能会,当然也存在数据泄露风险。用户只通过rename-command命令是防止不了自己的key被其他用户访问的。

为了解决上述问题,Redis 6.0开始引入了ACL(Access Control Lists)权限控制机制,可以方便地。基于ACL权限控制,Redis 6.0可以设置多个用户,允许你以细粒度的方式管理用户对Redis的访问权限。当然,ACL是向上兼容的,默认在不做任何配置的情况下,所有客户端都拥有全量命令执行权限,且继续支持以requirepass配置密码的方式进行鉴权。

ACL概述

ACL可以对不同的用户设置命令权限或数据权限,这样就能避免有些用户因误操作而导致数据丢失或降低数据泄露的风险。ACL相关的命令配置分为3部分:ACLS规则(语法)、用户关联命令配置、用户关联数据配置。

配置ACL

ACL是使用DSL(Domain Specific Language,领域专用语言)来定义的。ACL的配置方式有两种:

注意:这两种方法互不兼容,因此Redis要求使用其中一种。官方更推荐使用aclfile模式,因为redis.conf中配置了权限之后需要重启Redis服务,才能将配置的权限加载至Redis服务;使用aclfile模式,可以调用acl load命令将aclfile中配置的ACL权限热加载进环境中

启用和禁用用户

参数说明如下:

为用户配置有效密码

nopass表示无须密码访问,即客户端不需要用auth认证即可使用Redis,如果需要配置密码,就需要解除nopass状态,详解如下:

重置用户

执行以下操作:resetpassresetkeysresetchannelsallchannels(如果设置了 acl-pubsub-default)、offclearselectors-@all。即可重置用户状态为初始状态。

允许和禁止用户调用命令(用户关联命令配置)

其中,@all为禁止或允许所有命令。其中@符号不是所有命令都有。+@all表示允许用户使用所有命令,-@all表示禁止这个用户使用所有命令。具体命令如下:

允许或禁止用户访问某些键

了解这些后,我们基本就能配置出一个较完整的ACL规则。

接下来看一下客户端操作ACL配置的常用命令:

允许和禁止 Pub/Sub 频道:

总结

通过Redis ACL,我们可以轻松地实现对Redis数据库的访问控制,保护重要数据不受未经授权的访问,根据实际需求,精细地管理用户的权限,从而提高系统的安全性和稳定性。在设计和配置ACL时,请确保平衡安全性和便利性,以确保系统的正常运行和良好的用户体验。