zoukankan      html  css  js  c++  java
  • 第十五章 ACL安全策略

    一、ACL概述

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

    二、配置ACL

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

    1. 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
    

    三、使用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.
    

    1.使用外部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
    
    4.重启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. ACL规则

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

    3. 启用和禁用

    1.on:启用用户:可以以该用户身份进行认证。
    2.off:禁用用户:不再可以使用此用户进行身份验证,但是已经通过身份验证的连接仍然可以使用。
    

    4. 案例

    # 创建一个用户, 默认情况下是非活跃状态
    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
    

    5. 允许和禁止调用命令

    命令 解释
    + 将命令添加到用户可以调用的命令列表中。
    - 将命令从用户可以调用的命令列表中移除。
    +@ 允许用户调用 类别中的所有命令,有效类别为@admin,@set,@sortedset等,可通过调用ACL CAT命令查看完整列表。特殊类别@all表示所有命令,包括当前和未来版本中存在的所有命令。
    -@ 禁止用户调用 类别中的所有命令。
    +|subcommand 允许使用已禁用命令的特定子命令。
    allcommands +@all的别名。包括当前存在的命令以及将来通过模块加载的所有命令。
    nocommands -@all的别名,禁止调用所有命令。

    6. 案例

    # 将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
    

    7. 允许和禁止访问某些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
    

    8. 密码配置

    命令 解释
    > 将此密码添加到用户的有效密码列表中。例如,>mypass将“mypass”添加到有效密码列表中。该命令会清除用户的nopass标记。每个用户可以有任意数量的有效密码。
    < 从有效密码列表中删除此密码。若该用户的有效密码列表中没有此密码则会返回错误信息。
    # 将此SHA-256哈希值添加到用户的有效密码列表中。该哈希值将与为ACL用户输入的密码的哈希值进行比较。允许用户将哈希存储在users.acl文件中,而不是存储明文密码。仅接受SHA-256哈希值,因为密码哈希必须为64个字符且小写的十六进制字符。
    ! 从有效密码列表中删除该哈希值。当不知道哈希值对应的明文是什么时很有用。
    nopass 移除该用户已设置的所有密码,并将该用户标记为nopass无密码状态:任何密码都可以登录。resetpass命令可以清除nopass这种状态。
    resetpass 情况该用户的所有密码列表。而且移除nopass状态。resetpass之后用户没有关联的密码同时也无法使用无密码登录,因此resetpass之后必须添加密码或改为nopass状态才能正常登录。
    reset 重置用户状态为初始状态。执行以下操作resetpass,resetkeys,off,-@all。

    9. 案例

    # 查看用户列表
    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常用操作

    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无密码且可以访问所有命令以及所有数据。
    

    2. ACL USER

    返回所有用户名。
    127.0.0.1:6379> acl users
    1) "default"
    127.0.0.1:6379>
    

    3. ACL WHOAMI

    返回当前用户名。
    127.0.0.1:6379> ACL WHOAMI
    "default"
    

    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"
    

    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. 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>
    

    7.

    ACL DELUSER

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

    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
    

    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
    

    10. AUTH

    使用auth命令切换用户。
    AUTH <username> <password>
    
  • 相关阅读:
    C#使用Json
    JQuery AJAX介绍
    封装一个自己的 Ajax小框架
    AJAX跨域实现
    AJAX 一些常用方法
    完整的 AJAX 写法(支持多浏览器)
    AJAX 简单上手
    利用反射生成SQL语句
    访问Access数据库(有多个数据库时 体现多态)
    DataTable操作(建表,建行,建列,添加数据)
  • 原文地址:https://www.cnblogs.com/jhno1/p/15689289.html
Copyright © 2011-2022 走看看