redis当中的ACL——访问权限控制列表

2610阅读 0评论2021-06-18 stolennnxb
分类:NOSQL

翻译文,有些个人觉得冗余的就没翻译,原文链接:

ACL--Access Control List的简称,是为了控制某些redis客户端在访问redis服务器时,能够执行的命令和能够获取到的键。在客户端连接的时候,会被要求输入有效的用户名和密码,如果验证成功,则该客户端拥有输入用户名的相关操作权限。redis可以被配置成新连接都指向default user,默认拥有default user的权限。

在redis 6当中,这东西默认配置跟之前的版本一致——每一个新建连接能够执行所有命令,也能够访问所有的key。
AUTH 命令从之前的 `AUTH `扩展到支持`AUTH   `,在没有提供username 参数的时候,默认是default 用户。

ACL通过DSL(Domain Specific Language)来描述一个给定用户的权限,顺序是从第一个到最后一个,从左到右,顺序很重要,默认情况如下:

点击(此处)折叠或打开

  1. > ACL LIST
  2. 1) "user default on nopass ~* +@all"
用户`default` 被配置成活跃的(on), 没有密码,所有的key(~*), 所有的命令(+@all)

ACL 规则
启用或者禁用用户:
允许和禁止命令:
允许和不允许指定键:
  • ~: 添加指定模式的键
  • allkeys: ~*的别名
  • resetkeys:充电之前允许的所有的key的pattern,后面的仍旧生效,如:~foo:* ~bar:* resetkeys ~objects:*,将会导致指定客户端访问objects:*格式的key
为指定用户配置相关密码
  • >: 为当前用户添加有效密码,每个用户可以配置任意数量的密码,如果有一个,则nopass就会失效
  • <: 从用户有效密码列表中删除密码,如果没有,会返回错误
  • #: 将这个SHA-256的哈希值添加的用户的有效密码,避免了明文存储密码
  • !: 移除哈希值
  • nopass: 没有密码,所有新建连接都不用验证
  • resetpass:将所有允许的密码都冲掉,包括nopass,所以,在这之后,如果不添加密码的话,没有办法进行授权
重置用户
  • reset:等同于resetpass, resetkeys, off, -@all。用户状态回到创建之初
用户可以通过两种渠道进行修改相关ACL
1. ACL 命令以及ACL SETUSER子命令
2. 修改服务器配置,重启服务器,或者当时用外部ACL文件的时候,ACL LOAD

点击(此处)折叠或打开

  1. > ACL SETUSER alice
  2. ACL SETUSER alice on >p1pp0 ~cached:* +get
ACL有两种生效方式,redis.conf文件和外部文件,二者不兼容,当使用外部文件时,需要在配置文件中指定:

点击(此处)折叠或打开

  1. aclfile xxxxx
当时用redis.conf文件作为配置的时候,可以使用`CONFIG REWRITE`命令将配置重写;而如果用外部的ACL文件,就可以动态加载和保存`ACL LOAD`  `ACL SAVE`
对哨兵和副本需要允许指定命令才能正常工作,
哨兵不需要访问key,所以其允许的命令如下:

点击(此处)折叠或打开

  1. AUTH, CLIENT, SUBSCRIBE, SCRIPT, PUBLISH, PING, INFO, MULTI, SLAVEOF, CONFIG, CLIENT, EXEC.

  2. >ACL setuser sentinel-user >somepassword +client +subscribe +publish +ping +info +multi +slaveof +config +client +exec on
副本需要允许如下命令:

点击(此处)折叠或打开

  1. PSYNC, REPLCONF, PING
  2. > ACL setuser replica-user >somepassword +psync +replconf +ping on

副本当中的master将默认拥有任何命令的权限,在replica当中,master相当于拥有root权限
注意:
当添加或移除categories, modules的命令会被忽略(+@all除外)
上一篇:C++当中的一些小技巧
下一篇:几个比较神奇的函数