Redis
6.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
的配置方式有两种:
aclfile
模式,因为在redis.conf
中配置了权限之后需要重启Redis
服务,才能将配置的权限加载至Redis
服务;使用aclfile
模式,可以调用acl load
命令将aclfile
中配置的ACL权限热加载进环境中。参数说明如下:
nopass
表示无须密码访问,即客户端不需要用auth
认证即可使用Redis
,如果需要配置密码,就需要解除nopass
状态,详解如下:
执行以下操作:resetpass
、resetkeys
、resetchannels
、allchannels
(如果设置了 acl-pubsub-default
)、off
、clearselectors
、-@all
。即可重置用户状态为初始状态。
其中,@all
为禁止或允许所有命令。其中@
符号不是所有命令都有。+@all
表示允许用户使用所有命令,-@all
表示禁止这个用户使用所有命令。具体命令如下:
了解这些后,我们基本就能配置出一个较完整的ACL
规则。
接下来看一下客户端操作ACL
配置的常用命令:
通过Redis ACL
,我们可以轻松地实现对Redis
数据库的访问控制,保护重要数据不受未经授权的访问,根据实际需求,精细地管理用户的权限,从而提高系统的安全性和稳定性。在设计和配置ACL
时,请确保平衡安全性和便利性,以确保系统的正常运行和良好的用户体验。