ACL
ACL是什么?
The Redis ACL, short for Access Control List, is the feature that allows certain connections to be limited in terms of the commands that can be executed and the keys that can be accessed. The way it works is that, after connecting, a client is required to provide a username and a valid password to authenticate. If authentication succeeded, the connection is associated with a given user and the limits the user has. Redis can be configured so that new connections are already authenticated with a "default" user (this is the default configuration). Configuring the default user has, as a side effect, the ability to provide only a specific subset of functionalities to connections that are not explicitly authenticated.
In the default configuration, Redis 6 (the first version to have ACLs) works exactly like older versions of Redis. Every new connection is capable of calling every possible command and accessing every key, so the ACL feature is backward compatible with old clients and applications. Also the old way to configure a password, using the requirepass configuration directive, still works as expected. However, it now sets a password for the default user.
翻译过过来就是:ACL该功能允许某些连接在可以执行的命令和可以访问的键方面受到限制。它的工作方式是,连接后,需要客户提供用户名和有效密码以进行身份验证。如果身份验证成功,则该连接与给定用户和用户的限制关联。可以配置,以便已经使用“默认”用户对新连接进行身份验证(这是默认配置)。配置默认用户,仅能为未明确身份验证的连接提供特定功能子集的能力。
在默认配置中,redis 6(第一个具有ACL的版本)的工作原理与旧版本的redis一样。每个新连接都能够调用每个可能的命令并访问每个键,因此ACL功能与旧客户端和应用程序向后兼容。同样,使用需求ePass配置指令配置密码的旧方法仍然可以按预期工作。但是,它现在为默认用户设置密码。
简单的理解:就是授权,给某个用户分配某个功能,让其拥有某些能力。
官网地址:Redis ACL
使用ACL能达到的什么目的
- 希望通过限制对命令和 KEY 的访问来提高安全性。以便不受信任的客户端无法访问,而受信任的客户端仅具有满足要求的最低操作权限。如:某些客户端可能仅能执行只读命令。
- 想提高操作安全性,以防止由于软件或人为错误而导致非授权情况的操作,导致数据或配置的损坏。例如,不应该让所有客户端都能够调用 FLUSHALL 命令。
ACL 规则
redis前置操作
在使用acl之前,我们应该先进行如下操作。
- 安装redis,版本最好为6.0版本及以上版本。
- 修改配置文件
redis.conf
# 修改 aclfile 配置,配置 acl 持久化到指定位置 aclfile ./users.acl # ./users.acl 这个为 acl 的位置,./ 为 redis 的根目录
- 启动redis:
./src/redis-server ./redis.conf
- 进入redis自带的脚手架
./src/redis-cli
,运行以下代码# 1、设置密码 acl setuser default on >password ~* +@all ## password换成自己的密码,其他格式不要动 # 2、保存密码 acl save # 3、重载acl配置 acl load
- 修改配置文件
redis.conf
# 1、注释掉 #bin 127.0.0.1 # 2、修改daemonize daemonize yes # 3、修改protected-mode protected-mode no
- 查看redis的进程
ps -aux|grep redis
,杀掉redis进程kill -9 xxxx
- 重新启动redis
注意:为啥不叫小伙们配置requirepass
自定义密码呢?
The requirepass is not compatible with aclfile option and the ACL LOAD
command, these will cause requirepass to be ignored.
ACL基本语法
ACL其实也是有语法的,就和我们使用get
set
类似的语法。
- acl list :列出所有的用户配置信息
- acl setuser :设置用户
- acl getuser :获取用户设置的详细信息
- acl deluser :删除用户
- acl whoami :查询当前的用户
- acl cat :查询所有可以授权的选择项
- acl load :acl持久化重载acl持久化文件
- acl save :acl持久化手动保存到持久化文件
acl list
列出当前所有用户的详细信息
# 模板语法
acl list
1) "user default on #01c9473577e212b47dea658587c3dafe6d3af1f5759fb865bd606c36f79889b4 ~* &* +@all"
# 用户 用户名 是否可用 密码加密 对所有的key可操作性 分配所有权限
参数 | 说明 |
---|---|
user | 用户 |
default | 表示默认用户名,或则自己定义的用户名 |
on | 表示是否启用该用户,默认为off(禁用) |
#... | 表示用户密码,nopass表示不需要密码 |
~* &* | 表示可以访问的Key(正则匹配) |
+@ | 表示用户的权限,“+”表示授权权限,有权限操作或访问,“-”表示还是没有权限;@为权限分类,可以通过ACL 查询支持的分类。+@all 表示所有权限,nocommands 表示不给与任何命令的操作权限 |
acl cat
刚才说了,查看用户的时候,最后一项是权限。那权限到底有哪些呢?
acl cat
1) "keyspace"
2) "read"
3) "write"
4) "set"
5) "sortedset"
6) "list"
7) "hash"
8) "string"
9) "bitmap"
10) "hyperloglog"
11) "geo"
12) "stream"
13) "pubsub"
14) "admin"
15) "fast"
16) "slow"
17) "blocking"
18) "dangerous"
19) "connection"
20) "transaction"
21) "scripting"
当然,你也可以针对某一项具体的操作,例如查看string里面更详细的子项。
acl cat string
1) "setex"
2) "mset"
3) "getrange"
4) "getdel"
5) "strlen"
6) "mget"
7) "psetex"
8) "setnx"
9) "substr"
10) "incrbyfloat"
11) "setrange"
12) "getset"
13) "incrby"
14) "incr"
15) "decrby"
16) "decr"
17) "lcs"
18) "get"
19) "set"
20) "getex"
21) "msetnx"
22) "append"
此处不在罗列其他的,感兴趣的小伙伴们可以去官网查看。
acl setuser
设置用户,可以设置用户的密码,是启用,对那些key起作用,以及那些操作权限。
# 模板语法
acl setuser username off/on >password keys +/-@commands
username
: 需要授权的用户名off/on
: 是否启用当前的用户password
: 当前用户的密码,前面的 > 不要丢掉,这个地方是明文密码,redis会自动加密keys
: 可以对那些key进行操作,正则表达式,如果全部: ~* ,~bear:* 代表:对bear开头的key有操作权限+/-@commands
: 表示用户的权限,“+”表示授权权限,有权限操作或访问,“-”表示还是没有权限;@为权限分类,可以通过ACL CAT
查询支持的分类。+@all 表示所有权限,nocommands 表示不给与任何命令的操作权限。
其中+/-@commands
分类如下:
1、+<command>
:将命令添加到用户可以调用的命令列表中,如+@hash
2、-<command>
: 将命令从用户可以调用的命令列表中移除,如-@write
3、+@<category>
: 添加一类命令,如:@admin
, @set
, @hash
... 可以ACL CAT
查看具体的操作指令。
4、@all
表示所有命令,包括当前在服务器中存在的命令,以及将来将通过模块加载的命令。
5、-@<category>
: 类似+@
6、+<command>|subcommand
: 允许否则禁用特定子命令。注意,这种形式不允许像-DEBUG | SEGFAULT那样,而只能以“ +”开头。
6、allcommands
:+@all的别名,允许所有命令操作执行。注意,这意味着可以执行将来通过模块系统加载的所有命令。
7、nocommands
:-@all的别名,不允许所有命令操作执行。
下面来看几个实例吧:
acl setuser testuser on >123456 ~* +@all
#意思就是:创建一个testuser,密码为:123456,用户启用,对所有的key都有all所有的操作权限
acl setuser testuser2 on >123456 ~* +@all -@write
#意思就是:创建一个testuser2,密码为:123456,用户启用,对所有的key都有all所有的操作权限,但是去掉写入的权限。(虽然是只读权限,但是自己可以通过acl改动自己的权限)
acl setuser testuser3 on >123456 ~* +@all -@write -@admin
#意思就是:创建一个testuser3,密码为:123456,用户启用,对所有的key都有all所有的操作权限,但是去掉写入的权限,也去掉(admin相关的操作)进行acl操作。(就是只读去权限)
acl deluser
删除用户,顾名思义,就是删除已经存在用户。
# 模板语法
acl deluser username
acl deluser offuser
需要注意的是,删除已经存在的用户,成功返回的是1,删除失败或者不存在的用户返回0;
acl whoami
查看当前登录用户是谁。返回用户名
# 模板语法
acl whoami
这个比较简单,默认账号登录返回default
。
acl save/acl load
# 模板语法
## 持久化保存到配置文件中
acl save
## 重载acl配置文件中内容
acl load
说明一下:这两个一般是成对出现的,使用了acl save
,一般立即使用acl load
。这样做的好处,不用重启redis,就知道最新的acl配置文件,可以及时的获取最新的用户权限数据。
小结
- acl虽然好用,但是第一次使用的时候,一定要设置默认用户的密码,不然无密码也可以登录,这样服务暴露到外面非常危险。
- acl分配权限的时候,一定要分配好权限,不然随便分配了权限控制,但是还可以进行其他操作。相当于白给。
最后就是,由于精力和时间有限,有些知识还是不能完全掌握,如文章出现纰漏或者错误,请下方留言一起讨论交流。
评论区