zoukankan      html  css  js  c++  java
  • Redis新特性ACL安全策略

    一,redis新特性ACL安全策略介绍

    在 Redis6 之前的版本,我们只能使用 requirepass 参数给 default 用户配置登录密码,同一个 redis 集群的所有开发都共享 default 用户,难免会出现误操作把别人的 key 删掉或者数据泄露的情况
    因此 Redis6 版本推出了 ACL(Access Controller List)访问控制权限的功能,基于此功能,我们可以设置多个
    用户,并且给每个用户单独设置命令权限和数据权限。为了保证向下兼容,Redis6 保留了 default 用户和使用
    requirepass 的方式给 default 用户设置密码,默认情况下 default 用户拥有 Redis 最大权限,我们使用 redis-cli
    连接时如果没有指定用户名,用户也是默认 default。

    1.1 配置ACL

    配置 ACL 的方式有两种,一种是在 config 文件中直接配置,另一种是在外部 aclfile 中配置。配置的命令是
    一样的,但是两种方式只能选择其中一种,我们之前使用 requirepass 给 default 用户设置密码 默认就是使用
    config 的方式,执行 config rewrite 重写配置后会自动在 config 文件最下面新增一行记录配置 default 的密码和
    权限

    1.2 redis设置密码

    在 Redis 6.0 之前,Redis 只有一个 default 用户也是 Redis 中的超级管理员用户,如果要将其设置密码,需要修
    改 Redis 配置文件,具体修改如下

    requirepass 123456
    
    # 修改之后,再次进入 Redis 时,发现已经没有权限操作了。
    [root@alvin-test-os redis]# redis-cli --raw
    127.0.0.1:6379> set a b
    NOAUTH Authentication required
    
    # 这个时候我们需要使用密码的方式进入
    [root@alvin-test-os redis]# redis-cli -a 123456 --raw
    Warning: Using a password with '-a' or '-u' option on the command line interface may
    not be safe.
    127.0.0.1:6379> set a b
    OK
    
    1.3 使用ACL

    我们可以直接在 config 配置文件中使用上面 default 用户 ACL 这行 DSL 命令设置用户权限,或者我们也可
    以配置外部 aclfile 配置权限。配置 aclfile 需要先将 config 中配置的 DSL 注释或删除,因为 Redis 不允许两种
    ACL 管理方式同时使用,否则在启动 redis 的时候会报下面的错误

    # Configuring Redis with users defined in redis.conf and at the same setting an ACL
    file path is invalid. This setup is very likely to lead to configuration errors and
    security holes, please define either an ACL file or declare users directly in your
    redis.conf, but not both
    

    二,使用外部ACLFILE模式

    使用外部 aclfile 文件配置 Default 和其他用户的 ACL 权限

    1.注释 redis.conf 中所有已授权的 ACL 命令,如:
    #user default on #8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
    ~* +@all
    
    2.在 config 文件中注释 default 用户的密码,因为开启 aclfile 之后,requirepass 的密码就失效了:
    redis.conf
    #requirepass 123456
    
    3.在 config 文件中配置 aclfile 的路径,然后创建该文件,否则重启 redis 服务会报错找不到该文件
    aclfile /usr/local/redis/etc/users.acl
    touch /usr/local/redis/etc/users.acl
    
    5.重启 redis 服务或使用 aclfile load 命令加载权限
    systemctl restart redis
    或
    在 redis 命令行中执行:
    aclfile load
    

    开启 aclfile 之后不再推荐在 redis.conf 文件中通过 requirepass 配置 default 的密码,因为它不再生效,同
    时开启 aclfile 之后也不能使用 redis-cli -a xxx 登陆,必须使用 redis-cli --user xxx --pass yyy 来登陆。在没设
    置密码的时候也可以无密码登录

    # 这个时候显示的是无密码状态
    127.0.0.1:6379> acl list
    1) "user default on nopass ~* +@all"
    

    在 redis.conf 和 aclfile 模式中配置 DSL 官方更推荐使用 aclfile,因为如果在 redis.conf 中配置了权限之后
    需要重启 redis 服务才能将配置的权限加载至 redis 服务中来,但如果使用 aclfile 模式,可以调用 acl load 命令
    将 aclfile 中配置的 ACL 权限热加载进环境中,类似于 Mysql 中的 flush privileges。但同时我们也可以使用命令:
    config rewrite 将 acl 权限初始化到 redis.conf 中;同时执行 acl save 可以将 acl 配置持久化到 aclfile 中。

    2.1 ACL规则

    ACL 是使用 DSL(Domain specific language)定义的,该 DSL 描述了用户能够执行的操作。该规则始终
    从上到下,从左到右应用,因为规则的顺序对于理解用户的实际权限很重要。ACL 规则可以在 redis.conf 文件以
    及 users.acl 文件中配置 DSL,也可以在命令行中通过 ACL 命令配置

    2.2 ACL启用和禁用
    1. on:启用用户:可以以该用户身份进行认证。
    2. off:禁用用户:不再可以使用此用户进行身份验证,但是已经通过身份验证的连接仍然可以使用
    # 创建一个用户, 默认情况下是非活跃状态
    127.0.0.1:6379> ACL SETUSER xiaozhang
    OK
    
    # 查看用户
    127.0.0.1:6379> acl list
    user alvin off #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
    -@all
    user default on nopass ~* +@all
    user xiaozhang off -@all
    
    # 将用户设置成活跃状态
    127.0.0.1:6379> ACL SETUSER xiaozhang on
    OK
    
    # 再次查看用户列表,发现小张已经变成了活跃状态
    127.0.0.1:6379> acl list
    user alvin off #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
    -@all
    user default on nopass ~* +@all
    user xiaozhang on -@all
    

    三 ,允许和禁止调用命令

    命令 解释
    +command 将命令添加到用户可以调用的命令列表中。
    - command 将命令从用户可以调用的命令列表中移除。
    +@category 允许用户调用 类别中的所有命令,有效类别为@admin,@set,@sortedset 等,可通过调用 ACL CAT 命令查看完整列表。特殊类别@all 表示所有命令,包括当前和未来版本中存在的所有命令。
    -@ 禁止用户调用 类别中的所有命令。
    + subcommand
    allcommands +@all 的别名。包括当前存在的命令以及将来通过模块加载的所有命令。
    nocommands -@all 的别名,禁止调用所有命令。
    # 将 xiaozhang 用户增加密码、设置访问以 name 开头的 key 的权限和 set 权限
    127.0.0.1:6379> ACL SETUSER xiaozhang on >abc123 ~name* +set
    OK
    
    # 我们可以看到 xiaozhang 目前只具有 set 权限
    127.0.0.1:6379> acl list
    user xiaozhang on #6ca13d52ca70c883e0...392593af6a84118090 ~name* -@all +set
    
    # 切换用户
    127.0.0.1:6379> AUTH xiaozhang abc123
    OK
    
    # 设置键值对
    127.0.0.1:6379> set name xiaozhang
    OK
    
    # 没有获取权限
    127.0.0.1:6379> get name
    NOPERM this user has no permissions to run the 'get' command or its subcommand
    
    

    四,允许和禁止访问某些key

    命令 解释
    ~ 添加可以在命令中提及的键模式。例如~ allkeys 允许所有键。
    * resetkeys 使用当前模式覆盖所有允许的模式。如: ~foo:* ~bar:* resetkeys ~objects:* ,客户端只能访问匹配 object:* 模式的 KEY。
    # 将 xiaozhang 用户增加密码、设置访问以 name 开头的 key 的权限和 set 权限
    127.0.0.1:6379> ACL SETUSER xiaozhang on >abc123 ~name* +set
    OK
    

    五,密码配置

    # 查看用户列表
    127.0.0.1:6379> acl list
    user alvin off -@all
    user default on nopass ~* +@all
    
    # 将 alvin 用户设置密码
    127.0.0.1:6379> ACL SETUSER alvin on >abc123
    OK
    127.0.0.1:6379> acl list
    user alvin on #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
    -@all
    user default on nopass ~* +@all
    
    # 切换用户
    127.0.0.1:6379> auth alvin abc123
    OK
    
    # alvin 没有 set 权限
    127.0.0.1:6379> set aaa bbb
    NOPERM this user has no permissions to run the 'set' command or its subcommand
    

    六,ACL常用操作

    6.1 ACL lIST

    我们可以使用 ACL LIST 命令来查看当前活动的 ACL,默认情况下,有一个“default”户。

    127.0.0.1:6379> ACL list
    1) "user default on nopass ~* +@all"
    127.0.0.1:6379>
    

    其中 user 为关键词,default 为用户名,后面的内容为 ACL 规则描述,on 表示活跃的,nopass 表示无密码,~* 表示所有 key,+@all 表示所有命令。所以上面的命令表示活跃用户 default 无密码且可以访问所有命令以及所有数据。

    6.2 ACL USEr

    返回所有用户名

    127.0.0.1:6379> acl users
    1) "default"
    127.0.0.1:6379>
    
    6.3 ACL WHOAMI

    返回当前用户名

    127.0.0.1:6379> ACL WHOAMI
    "default"
    
    6.4 ACL CAT

    查看命令类型,用于授权

    127.0.0.1:6379> 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
    
    6.5 ACL SETUSER

    若用户不存在,则按默认规则创建用户。若用户存在则该命令不做任何操作。

    127.0.0.1:6379> ACL SETUSER alvin
    OK
    127.0.0.1:6379> acl list
    1) "user alvin off -@all"
    2) "user default on nopass ~* +@all"
    

    6.6 ACL GETUSER

    使用下面的命令查看用户的 ACL 权限

    127.0.0.1:6379> ACL GETUSER xiaozhang
    flags
    on
    passwords
    6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
    commands
    -@all +set
    keys
    name*
    127.0.0.1:6379>
    
    6.7 ACL DELUSER

    删除指定的用户。

    #删除指定的用户
    acl deluser <username>
    127.0.0.1:6379> ACL DELUSER alvin
    1
    
    6.8 ACL SAVE

    我们可以使用 acl save 命令将当前服务器中的 ACL 权限持久化到 aclfile 中,如果没持久化就关闭 redis 服务,那些 ACL 权限就会丢失,因此我们每次授权之后一定要记得 ACL SAVE 将 ACL 权限持久化到 aclfile 中。

    # 查看 users.acl
    [root@alvin-test-os redis]# cat etc/users.acl
    
    # 查看 acl 用户
    [root@alvin-test-os redis]# redis-cli --raw
    127.0.0.1:6379> acl list
    user default on nopass ~* +@all
    user xiaozhang on
    #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090 ~name* -@all
    +set
    
    # 保存 acl 权限配置
    127.0.0.1:6379> acl save
    OK
    127.0.0.1:6379> exit
    
    # 查看 acl 配置文件已经被写入
    [root@alvin-test-os redis]# cat etc/users.acl
    user default on nopass ~* +@all
    user xiaozhang on
    #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090 ~name* -@all
    +set
    
    
    6.9 ACL LOAD

    我们也可以直接在 aclfile 中修改或新增 ACL 权限,修改之后不会立刻生效,我们可以在 redis 命令行中执行 acl load 将该 aclfile 中的权限加载至 redis 服务中。

    #将 aclfile 中的权限加载至 redis 服务中
    acl load
    
    # 查看 acl 用户列表
    127.0.0.1:6379> acl list
    user default on nopass ~* +@all
    user xiaozhang on
    #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090 ~name* -@all
    +set
    
    # 重载
    127.0.0.1:6379> ACL LOAD
    OK
    
    # 查看新用户已经加入
    127.0.0.1:6379> acl list
    user alvin on #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090
    ~name* -@all +set
    user default on nopass ~* +@all
    user xiaozhang on
    #6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090 ~name* -@all
    +set
    
    6.10 AUTH

    使用 auth 命令切换用户

    AUTH <username> <password>
    
  • 相关阅读:
    解决Linux ssh登录马上退出问题
    FineReport实线java报表填报录入的效果图
    CCEditBox/CCEditBoxImplMac
    Android图片异步载入框架Android-Universal-Image-Loader
    HYAppFrame(WinForm框架源代码)安装部署指南
    ASP.NET Web Api 2 接口API文档美化之Swagger
    Android OTA在线升级一(架构分析)【转】
    Android进程间通信(IPC)机制Binder简要介绍和学习计划【转】
    Linux内核源码中的likely和unlikely释疑【转】
    Android蓝牙串口通讯【转】
  • 原文地址:https://www.cnblogs.com/xiaolang666/p/14144784.html
Copyright © 2011-2022 走看看