zoukankan      html  css  js  c++  java
  • Ozone Native ACL的应用

    前言


    Ozone作为对象存储系统,它在权限访问这块用的是ACL的管控方式,而不是采用文件系统UGO(User-Group-Others)的方式。不过Ozone对传统ACL进行自定义的一些扩展,除了基本的READ, WRITE,访问权限外,还细分出了DELETE,LIST等等权限。本文笔者来简单聊聊Ozone的native ACL的使用。

    Ozone Native ACL的Access Type


    这里笔者特意强调了Native ACL的关键字,因为Ozone结合了自身系统设计,在ACL的Access类型上,不是简单的Read/Write/Execute三个类型。

    在其ACL Type中,总共细分出了9大类型:

    • READ,获取Volume, Bucket, Key信息权限
    • WRITE,拥有Volume/Bucket/Key的部分修改操作权限,这里的WRITE权限不代表允许所有的修改行为操作
    • CREATE,创建Volume/Bucket/Key的操作权限
    • LIST,获取Volume/Bucket/Key列表的操作权限
    • DELETE,拥有删除Volume/Bucket/Key的操作权限
    • READ_ACL,读取Volume/Bucket/Key ACL信息权限
    • WRITE_ACL,修改Volume/Bucket/Key ACL信息权限
    • ALL,拥有对Volume/Bucket/Key的所有操作权限
    • NONE,无任何Volume/Bucket/Key的操作权限

    Ozone Native ACL的启用


    目前Ozone发布的最新版本还是在alpha版本阶段,笔者测试的版本是ozone-0.4.1-alpha,在此版本中它的ACL功能是默认disable的。在ACL disable模式下,任何用户只要配上正确的om通信地址,就可以对volume/bucket/key执行操作的。

    所以将Ozone投入生产使用前,如果需要Security方面的考虑,我们要将Ozone的ACL功能开启,更新如下配置:

    <property>
       <name>ozone.acl.enabled</name>
       <value>true</value>
    </property>
    

    在Ozone ACL开启之后,我们还要进行额外的authorizer的配置,来选择用哪个authorizer类做ACL的访问控制,ozone-0.4.1-alpha版本中使用的是默认OzoneAccessAuthorizer类。此类对于任何的access检查都是返回true的,基本就是没有检查行为了。

    /**
     * Default implementation for {@link IAccessAuthorizer}.
     * */
    public class OzoneAccessAuthorizer implements IAccessAuthorizer {
    
      @Override
      public boolean checkAccess(IOzoneObj ozoneObject, RequestContext context)
          throws OMException {
        return true;
      }
    }
    

    我们要把authorizer实例切换为Ozone Native的ACL类,

    <property>
       <name>ozone.acl.authorizer.class</name>
       <value>org.apache.hadoop.ozone.security.acl.OzoneNativeAuthorizer</value>
    </property>
    

    ozone.acl.enabled,ozone.acl.authorizer.class配置完毕并重启OM服务后,OM的Native ACL就能发挥作用了。

    Ozone Native ACL的shell命令使用


    下面我们来看几个例子,进一步了解ozone acl的命令使用。

    首先ozone对volume, bucket, key都支持了acl的相关操作命令,如下所示:

    [hdfs@lyq yiqlin]$ /home/hdfs/apache/ozone/bin/ozone sh volume -h
    Usage: ozone sh volume [-hV] [COMMAND]
    Volume specific operations
    -h, --help Show this help message and exit.
    -V, --version Print version information and exit.
    Commands:
    info returns information about a specific volume
    list, ls List the volumes of a given user
    create Creates a volume for the specified user
    update Updates parameter of the volumes
    delete deletes a volume if it is empty
    addacl Add a new Acl.
    removeacl Remove an acl.
    setacl Set acls.
    getacl List all acls.
    [hdfs@lyq yiqlin]$ /home/hdfs/apache/ozone/bin/ozone sh bucket -h
    Usage: ozone sh bucket [-hV] [COMMAND]
    Bucket specific operations
    -h, --help Show this help message and exit.
    -V, --version Print version information and exit.
    Commands:
    info returns information about a bucket
    list, ls lists the buckets in a volume.
    create creates a bucket in a given volume
    delete deletes an empty bucket
    addacl Add a new Acl.
    removeacl Remove an acl.
    getacl List all acls.
    setacl Set acls.
    [hdfs@lyq yiqlin]$ /home/hdfs/apache/ozone/bin/ozone sh key -h
    Usage: ozone sh key [-hV] [COMMAND]
    Key specific operations
    -h, --help Show this help message and exit.
    -V, --version Print version information and exit.
    Commands:
    info returns information about an existing key
    list, ls list all keys in a given bucket
    get Gets a specific key from ozone server
    put creates or overwrites an existing key
    rename renames an existing key
    delete deletes an existing key
    addacl Add a new Acl.
    removeacl Remove an acl.
    setacl Set acls.
    getacl List all acls.

    从上面子命令参数可以看出,这里的acl操作主要支持以下4类:

    • addacl,在现有acl中,再新添加acl信息
    • removeacl,从现有acl中,移出部分acl信息
    • setacl,重置acl信息
    • getacl,获取acl信息

    我们可以通过调用acl子命令的方式进一步查看acl信息组织形式,

    Usage: ozone sh key addacl [-hV] -a= [-s=]
    Add a new Acl.

    -a, --acl= Add acl.r = READ,w = WRITE,c = CREATE,d = DELETE,l =
    LIST,a = ALL,n = NONE,x = READ_AC,y = WRITE_ACEx user:
    user1:rw or group:hadoop:rw

    这里的acl格式为user:[user name]:[access type…],例如user:user1:rw。

    下面我们创建一个bucket为例,然后在其上进行acl的测试。
    首先创建一个新的测试bucket,

    [hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket create /testvolume2/fakebucket
    2019-12-10 05:01:06,455 [main] INFO - Creating Bucket: testvolume2/fakebucket, with Versioning false and Storage Type set to DISK and Encryption set to false

    然后获取这个测试bucket的信息,下面的acl属性,笔者认为是个bug。

    [hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket info /testvolume2/fakebucket
    {
    “volumeName” : “testvolume2”,
    “bucketName” : “fakebucket”,
    “createdOn” : “Tue, 10 Dec 2019 12:01:06 GMT”,
    “acls” : null,
    “versioning” : “DISABLED”,
    “storageType” : “DISK”,
    “encryptionKeyName” : “N/A”
    }

    然后用getacl命令获取bucket acl信息:

    [hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket getacl /testvolume2/fakebucket
    [ {
    “type” : “USER”,
    “name” : “hdfs”,
    “aclScope” : “ACCESS”,
    “aclList” : [ “ALL” ]
    }, {
    “type” : “GROUP”,
    “name” : “hdfs”,
    “aclScope” : “ACCESS”,
    “aclList” : [ “ALL” ]
    } ]

    我们可以看到hdfs作为这个bucket的创建者,拥有这个bucket的所有访问权限,并且没有其它任何用户的Access权限信息。
    然后此时,我们将用户切换成另外一个用户,然后执行info命令获取bucket信息,

    [yiqlin@lyq hdfs]$ /home/hdfs/ozone/bin/ozone sh bucket info /testvolume2/fakebucket
    PERMISSION_DENIED User yiqlin doesn’t have READ permission to access bucket

    [yiqlin@lyq hdfs]$ /home/hdfs/ozone/bin/ozone sh bucket getacl /testvolume2/fakebucket
    PERMISSION_DENIED User yiqlin doesn’t have READ_ACL permission to access bucket

    然后我们再切换回hdfs身份,给用户添加一定的acl权限,

    [hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket addacl -a user:yiqlin:r /testvolume2/fakebucket
    “Acl set successfully: true”

    然后我们可以通过getacl得到最新的acl列表:

    [hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket getacl /testvolume2/fakebucket
    [ {
    “type” : “USER”,
    “name” : “hdfs”,
    “aclScope” : “ACCESS”,
    “aclList” : [ “ALL” ]
    }, {
    “type” : “GROUP”,
    “name” : “hdfs”,
    “aclScope” : “ACCESS”,
    “aclList” : [ “ALL” ]
    }, {
    “type” : “USER”,
    “name” : “yiqlin”,
    “aclScope” : “ACCESS”,
    “aclList” : [ “READ” ]
    } ]

    从上面输出可以看到,用户yiqlin已经拥有了read此bucket的权限了,
    然后我们切到yiqlin用户,执行info操作,操作执行成功:

    [yiqlin@lyq hdfs]$ /home/hdfs/ozone/bin/ozone sh bucket info /testvolume2/fakebucket
    {
    “volumeName” : “testvolume2”,
    “bucketName” : “fakebucket”,
    “createdOn” : “Tue, 10 Dec 2019 12:01:06 GMT”,
    “acls” : null,
    “versioning” : “DISABLED”,
    “storageType” : “DISK”,
    “encryptionKeyName” : “N/A”
    }

    如果需要设置acl的信息比较多,我们可以直接执行重置acl指令,如下:

    [hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket setacl -al user:yiqlin:rx,user:hdfs:a /testvolume2/fakebucket
    “Acl set successfully: true”
    [hdfs@lyq ~]$ /home/hdfs/ozone/bin/ozone sh bucket getacl /testvolume2/fakebucket
    [ {
    “type” : “USER”,
    “name” : “yiqlin”,
    “aclScope” : “ACCESS”,
    “aclList” : [ “READ”, “READ_ACL” ]
    }, {
    “type” : “USER”,
    “name” : “hdfs”,
    “aclScope” : “ACCESS”,
    “aclList” : [ “ALL” ]
    } ]

    综上所使用的结果来看,Ozone这套acl权限管控模式在使用得当的情况下能够做到比较精细化的访问控制。

  • 相关阅读:
    XCode下Swift – WebView IOS demo
    swift-初探webView与JS交互
    Swift 实践之UIWebView
    iOS 权限判断 跳转对应设置界面
    iOS~判断应用是否有定位权限
    iOS 判断是否有权限访问相机,相册
    UIAlertController中TextField的用法
    Swift-UITextField用法
    多年iOS开发经验总结(一)
    Python lambda和reduce函数
  • 原文地址:https://www.cnblogs.com/bianqi/p/12183501.html
Copyright © 2011-2022 走看看