如何使用 Redis 的 ACL 功能创建和管理用户
Redis 是一个开源的高性能键值数据库,它支持多种数据类型和命令,可以用于缓存、消息队列、分布式锁等场景。Redis 6.0 版本引入了一个新的特性:访问控制列表(ACL),它允许我们为不同的客户端连接创建和分配不同的用户和权限,从而提高 Redis 的安全性和灵活性。
什么是 Redis 的 ACL 功能
Redis 的 ACL 功能是一种基于用户的认证和授权机制,它可以让我们定义多个用户,每个用户可以有自己的密码、角色、权限和其他设置。我们可以通过 ACL 命令来创建、修改、删除和查询用户,以及设置用户的密码、权限、超时时间等。我们还可以通过 ACL 命令来查看当前连接的用户信息,以及列出所有已定义的用户。
Redis 的 ACL 功能有以下几个优点:
1.提高安全性:我们可以为不同的应用场景或客户端类型创建不同的用户,比如只读用户、只写用户、管理员用户等,然后为每个用户分配合适的权限,从而防止未授权的访问或操作。
2.提高灵活性:我们可以根据需要动态地修改或删除用户,以及调整用户的权限和设置,而不需要重启 Redis 服务或修改配置文件。
3.提高可追溯性:我们可以通过 ACL 命令来查看每个连接的用户信息,以及每个用户执行过的命令,从而方便地进行审计和排错。
如何创建 Redis 用户
要创建 Redis 用户,我们需要使用 ACL SETUSER 命令,它的语法如下:
其中 username 是要创建的用户名,rule 是要设置的规则,可以有以下几种类型:
1.>password:设置用户的密码,必须以 > 开头,后面跟上任意长度的字符串。如果不设置密码,则表示该用户无需密码即可登录。
2.+command|-command:设置用户可以或不能执行的命令,必须以 + 或 - 开头,后面跟上命令名。如果不设置任何命令,则表示该用户可以执行所有命令。
3.+@category|-@category:设置用户可以或不能执行的命令类别,必须以 + 或 - 开头,后面跟上类别名。Redis 将命令分为了几个类别,比如 @read 表示所有读取数据的命令,@write 表示所有写入数据的命令,@admin 表示所有管理 Redis 的命令等。如果不设置任何类别,则表示该用户可以执行所有类别的命令。
4.~pattern [~pattern ...]:设置用户可以访问或修改的键名模式,必须以 ~ 开头,后面跟上一个或多个符合 glob 风格的模式。如果不设置任何模式,则表示该用户可以访问或修改所有键名。
5.on|off:设置用户是否启用,默认为 on。如果设置为 off,则表示该用户被禁用,无法登录或执行任何命令。
6.timeout seconds:设置用户的超时时间,单位为秒。如果一个连接在超过这个时间后没有发送任何命令,则该连接会被断开。如果不设置超时时间,则表示该用户没有超时限制。
例如,我们可以创建一个名为 reader 的用户,它的密码为 123456,只能执行读取数据的命令,且只能访问以 user: 开头的键名,超时时间为 60 秒,命令如下:
如果创建成功,Redis 会返回 OK。我们可以使用 ACL LIST 命令来查看所有已定义的用户及其规则,例如:
输出如下:
我们可以看到,Redis 默认创建了一个名为 default 的用户,它没有密码,可以访问所有键名和执行所有命令。我们也可以看到我们刚刚创建的 reader 用户及其规则。