自建 Redis 中设置 ACL 用户和权限
一、概述
在自建的 Redis 中实现类似于云 Redis 的账号权限管理,可以使用 Redis 6.0 及以上版本的 ACL(Access Control List) 功能来进行权限管理。Redis 的 ACL 允许创建不同的用户,指定其权限,从而控制用户可以执行哪些命令或访问哪些数据。
二、自建 Redis 中设置 ACL 用户和权限的步骤
1. 确保使用 Redis 6.0 或以上版本
ACL 功能从 Redis 6.0 开始支持,所以需要确保 Redis 版本是 6.0 或更高版本。可以通过以下命令检查 Redis 版本:
redis-server --version
2. 配置 Redis 以启用 ACL
在 Redis 配置文件(redis.conf)
中,确保启用了 ACL 功能。默认情况下,ACL 是启用的,但可以检查是否存在类似以下的配置项:
# 默认开启 ACL
# aclfile /path/to/your/aclfile
3. 创建和管理用户
可以通过 ACL SETUSER 命令来创建和管理用户。例如:
# 创建一个名为 "user1" 的用户,密码为 "password123",并授予 "user1" 只能执行 GET 和 SET 命令的权限
ACL SETUSER user1 on >password123 ~* +GET +SET
解释:
- user1:新创建的用户名。
- on:启用该用户。
>password123
:设置该用户的密码。- ~*:用户可以访问所有键。
- +GET +SET:用户只允许执行 GET 和 SET 命令。
4. 配置权限
可以根据需要配置更细粒度的权限。例如,可以限制用户只能访问特定前缀的键,或者只允许特定命令:
- ~prefix:*:只允许访问以 prefix: 开头的键。
- +GET:允许执行 GET 命令。
- -DEL:禁止执行 DEL 命令。
例如,创建一个只能访问 user:*
前缀的用户:
ACL SETUSER user2 on >password456 ~user:* +GET -SET +HGET +HSET
5. 查看和管理用户
可以使用 ACL LIST
来列出当前所有用户和权限:
ACL LIST
6. 配置客户端连接时验证用户身份
客户端在连接 Redis 时,需要提供用户名和密码来进行身份验证。可以在客户端使用 AUTH 命令进行验证:
AUTH user1 password123
如果身份验证成功,客户端将拥有该用户的权限。
7. 限制特定命令
可以使用ACL SETUSER
来限制某些命令。假设想禁用某些高权限命令(例如 FLUSHDB 和 FLUSHALL)
:
ACL SETUSER user3 on >password789 ~* -FLUSHDB -FLUSHALL
这样 user3 用户就无法执行清空数据库的操作。
8. 持久化 ACL 配置
Redis 的 ACL 配置会默认保存到指定的 ACL 文件(在 redis.conf
中配置)。每次 Redis 启动时,都会加载这个文件。如果没有指定路径,默认会保存到dump.rdb
所在的目录。
9. 注意事项
- 在设置 ACL 时,确保为不同的用户分配合理的权限,以防止不必要的安全风险。
- 如果没有显式地设置用户权限,默认的 default 用户将拥有所有权限。
三、权限设置
可以通过 ACL SETUSER 命令来精细控制每个用户的读写权限,控制用户是否能够读取(GET)、写入(SET)或者执行特定命令。以下是一些常见的读写权限配置方式:
3.1 允许读取和写入所有数据
用户能够读写所有的数据(即不限制任何命令),可以设置如下权限:
ACL SETUSER user1 on >password123 ~* +GET +SET +HGET +HSET +LPUSH +RPUSH +LPOP +RPOP +SADD +SREM +ZADD +ZREM
解释:
- user1:用户的名称。
- on:启用该用户。
>password123:设置该用户的密码为 password123。
- ~*:允许访问所有的键。
- +GET +SET +HGET +HSET +LPUSH +RPUSH +LPOP +RPOP +SADD +SREM +ZADD - +ZREM:允许执行所有的读写操作,包括常见的数据类型命令(如字符串、哈希、列表、集合和有序集合的操作)。
3.2 只允许读取数据
户具有读取权限(不能修改数据),可以限制用户只能执行读取命令:
ACL SETUSER user2 on >password456 ~* +GET +HGET +LPUSH +LRANGE +ZRANGE +SISMEMBER
解释:
- user2:用户的名称。
- on:启用该用户。
>password456
:设置该用户的密码为 password456。- ~*:允许访问所有的键。
- +GET +HGET +LPUSH +LRANGE +ZRANGE +SISMEMBER:只允许读取数据,如通过 GET 获取字符串,HGET 获取哈希值,ZRANGE 获取有序集合中的成员等。
这样配置后,user2 用户只能读取数据,不能修改数据或删除数据。
3.3 只允许写入数据
用户能够写入数据(不能读取现有数据),可以将用户的权限限制为只允许写命令:
ACL SETUSER user3 on >password789 ~* +SET +HSET +LPUSH +RPUSH +SADD +ZADD
解释:
- user3:用户的名称。
- on:启用该用户。
>password789
:设置该用户的密码为 password789。- ~*:允许访问所有的键。
- +SET +HSET +LPUSH +RPUSH +SADD +ZADD:允许执行所有的写操作,如设置键值、修改哈希、列表、集合和有序集合等。
这样配置后,user3 用户将只能写入数据,但不能读取数据。
3.4 细粒度控制特定键的读写权限
根据键的前缀来控制权限。例如,假设只允许某个用户对以 user:*
为前缀的键进行读写操作:
ACL SETUSER user4 on >password012 ~user:* +GET +SET +HGET +HSET
解释:
- user4:用户的名称。
- on:启用该用户。
>password012
:设置该用户的密码为 password012。- ~user:*:只允许访问以 user: 开头的键。
- +GET +SET +HGET +HSET:允许执行读取和写入操作。
3.5 禁用某些命令(例如禁止删除操作)
根据需要禁用特定的写命令。比如,可以禁止用户执行删除命令(如 DEL、FLUSHDB、FLUSHALL)
:
ACL SETUSER user5 on >password345 ~* +GET +SET -DEL -FLUSHDB -FLUSHALL
解释:
- user5:用户的名称。
- on:启用该用户。
>password345
:设置该用户的密码为 password345。- ~*:允许访问所有的键。
- +GET +SET:允许执行读取和写入命令。
- -DEL -FLUSHDB -FLUSHALL:禁止执行删除和清空数据库的命令。
3.6 检查 ACL 配置的正确性
通过 ACL GETUSER
查看某个特定用户的权限配置:
ACL GETUSER user1
通过这些步骤,你可以在自建的 Redis 中实现基于用户的权限管理,像云 Redis 一样对不同的账号设置不同的访问权限。