美文网首页
CDH中配置启用 HBase 授权及测试

CDH中配置启用 HBase 授权及测试

作者: lei_charles | 来源:发表于2019-11-24 09:32 被阅读0次
    1. HBase启用授权配置
      1. Hbase -> 配置 -> 搜索 auth -> 勾选 HBase 安全授权 -> 保存更改

        image
      2. Hbase -> 配置 -> 高级 -> 搜索 hbase-site.xml -> 添加配置 -> 保存更改

        <property>
          <name>hbase.security.exec.permission.checks</name>
          <value>true</value>
        </property>
        
        image
      3. Hbase -> 配置 -> 搜索 super -> 添加超级用户 -> 保存更改

        image
      4. 重启 HBase 服务

    2. HBase的 ACLs 权限控制说明

      HBase ACLs的访问分为5个级别:

      权限 说明
      Read(R) 可以读取给定范围内的数据
      Write(W) 可以在给定范围内写入数据
      Executor(X) 可以在给定范围内执行协处理器端点
      Create(C) 可以在给定范围内创建表或删除表(甚至包括未创建的表)
      Admin(A) 可以执行群集操作,例如平衡群集或在给定范围内分配区域

      HBase 授权范围:

      权限 说明
      Superuser 超级用户可以执行HBase中所有操作及任何资源(如:hbase用户)
      Global 在全局范围内授予的权限,可以在超级管理下创建多种集群管理员
      Namespace 在命名空间范围内授权,适用于命名空间内所有表
      Table 表范围授权,适用于为指定表进行授权
      ColumnFamily ColumnFamily范围内授权
      Cell 为指定的单元格进行授权
    3. HBase 权限授权测试

      授权可以通过 grant 命令为 USER、Group、NameSpace 等取消授权,语法如下:

      grant <user> , <permissions> [, <@namespace>[, <table> [, <column family> [, <column qualifier>]]]] 
      
      1. 测试全局范围授权

        授权前使用admin用户访问HBase执行操作,提示admin用户没有权限操作

        hbase(main):001:0> whoami
        admin (auth:SIMPLE)
            groups: admin, admin
        
        hbase(main):002:0> list
        TABLE                                                                                                                                                                                        
        0 row(s) in 0.2000 seconds
        
        => []
        hbase(main):003:0> create_namespace 'my_ns_admin'
        
        ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user 'admin' (global, action=ADMIN)
        
        Create namespace; pass namespace name,
        and optionally a dictionary of namespace configuration.
        Examples:
        
          hbase> create_namespace 'ns1'
          hbase> create_namespace 'ns1', {'PROPERTY_NAME'=>'PROPERTY_VALUE'}
        

        使用hbase超级管理员,为admin用户组全局范围授权,授权admin用户有创建表的权限

        hbase(main):001:0> whoami
        hbase (auth:SIMPLE)
            groups: hbase
        
        hbase(main):002:0> grant '@admin', 'CA'
        0 row(s) in 0.3170 seconds
        
        hbase(main):003:0> user_permission
        User                                             Namespace,Table,Family,Qualifier:Permission                                                                                                 
         @admin                                          hbase,hbase:acl,,: [Permission: actions=CREATE,ADMIN]                                                                                       
        1 row(s) in 0.0610 seconds
        
        hbase(main):004:0> user_permission '.*'
        User                                             Namespace,Table,Family,Qualifier:Permission                                                                                                 
         @admin                                          hbase,hbase:acl,,: [Permission: actions=CREATE,ADMIN]                                                                                       
        1 row(s) in 0.8710 seconds
        

        使用admin用户访问Hbase执行操作

        hbase(main):004:0> create_namespace 'my_ns_admin'
        0 row(s) in 0.0460 seconds
        
        hbase(main):005:0> create 'my_ns_admin:testtable', 'f1'
        0 row(s) in 1.2700 seconds
        
        => Hbase::Table - my_ns_admin:testtable
        hbase(main):006:0> put 'my_ns_admin:testtable','0001','f1:name','charels'
        0 row(s) in 0.1240 seconds
        
        hbase(main):007:0> scan 'my_ns_admin:testtable'
        ROW                                              COLUMN+CELL                                                                                                                                 
         0001                                            column=f1:name, timestamp=1569227721451, value=charels                                                                                      
        1 row(s) in 0.0430 seconds
        
        hbase(main):008:0> scan 'my_ns:test'
        ROW                                              COLUMN+CELL                                                                                                                                 
        
        ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user 'admin' (table=my_ns:test, action=READ)
        
        ...
        

        查看用户权限

        hbase(main):014:0> user_permission '.*'
        User                                             Namespace,Table,Family,Qualifier:Permission                                                                                                 
         @admin                                          hbase,hbase:acl,,: [Permission: actions=CREATE,ADMIN]                                                                                       
         admin                                           my_ns_admin,my_ns_admin:testtable,,: [Permission: actions=READ,WRITE,EXEC,CREATE,ADMIN]                                                     
        2 row(s) in 0.8680 seconds
        

        拥有CA权限的admin用户,可以在HBase库中创建NameSpace和Table,并可以对自己新建的表进行读、写、删除等操作,但不能操作非admin用户创建的表。
        如果admin用户拥有RCA的权限则可以读非admin用户创建的表,admin用户拥有RWCA的权限则可以读、写、删除非admin用户创建的表。

        hbase(main):001:0> put 'my_ns:test','0001','F:name', 'TEST'
        
        ERROR: Failed 1 action: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions (user=admin, scope=my_ns:test, family=F:name, params=[table=my_ns:test,family=F:name],action=WRITE)
            at org.apache.hadoop.hbase.security.access.AccessController.prePut(AccessController.java:1651)
            at org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost$30.call(RegionCoprocessorHost.java:918)
            at org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost$RegionOperation.call(RegionCoprocessorHost.java:1673)
        ...
        hbase(main):005:0> user_permission '.*'
        User                                             Namespace,Table,Family,Qualifier:Permission                                                                                                 
         @admin                                          hbase,hbase:acl,,: [Permission: actions=READ,CREATE,ADMIN]                                                                            
         admin                                           my_ns_admin,my_ns_admin:testtable,,: [Permission: actions=READ,EXEC,CREATE,ADMIN]                                                     
        2 row(s) in 0.9770 seconds
        

        修改admin用户权限为RWCA。

        hbase(main):007:0> grant '@admin', 'RWCA'
        0 row(s) in 0.0790 seconds
        
        hbase(main):008:0> whoami
        hbase (auth:SIMPLE)
            groups: hbase
        
        hbase(main):002:0> put 'my_ns:test','0001','F:name', 'TEST'
        0 row(s) in 0.0160 seconds
        
        hbase(main):003:0> delete 'my_ns:test','0001','F:name' 
        0 row(s) in 0.0330 seconds
        
        hbase(main):005:0> user_permission '.*'
        User                                             Namespace,Table,Family,Qualifier:Permission                                                                                                 
         @admin                                          hbase,hbase:acl,,: [Permission: actions=READ,WRITE,CREATE,ADMIN]                                                                            
         admin                                           my_ns_admin,my_ns_admin:testtable,,: [Permission: actions=READ,WRITE,EXEC,CREATE,ADMIN]                                                     
        2 row(s) in 0.9770 seconds
        hbase(main):006:0> whoami
        admin (auth:SIMPLE)
            groups: admin, admin
        
      2. 测试NameSpace范围授权
        hbase(main):001:0> whoami
        charles (auth:SIMPLE)
            groups: charles, sudo, usr01
        
        hbase(main):002:0> create 'my_ns_admin:charles_table','f1'
        
        ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions (user=charles, scope=my_ns_admin, params=[namespace=my_ns_admin,table=my_ns_admin:charles_table,family=f1],action=CREATE)
        
        ......
        
        hbase(main):003:0> list
        TABLE                                                                                                                                                                                        
        0 row(s) in 0.0160 seconds
        
        => []
        

        使用hbase用户为charles用户授权my_ns_admin空间的所有权限

        hbase(main):018:0> whoami
        hbase (auth:SIMPLE)
            groups: hbase
        
        hbase(main):019:0> grant 'charles','RWCXA','@my_ns_admin'
        0 row(s) in 0.0500 seconds
        

        为 charles 用户授权后,再进行操作

        hbase(main):004:0> list
        TABLE                                                                                                                                                                                        
        my_ns_admin:testtable                                                                                                                                                                        
        1 row(s) in 0.0190 seconds
        
        => ["my_ns_admin:testtable"]
        
        hbase(main):005:0> create 'my_ns_admin:charles_testtable','f1','f2'
        0 row(s) in 1.2390 seconds
        
        => Hbase::Table - my_ns_admin:charles_testtable
        hbase(main):006:0> put 'my_ns_admin:charles_testtable','0001','f1:name','charles'
        0 row(s) in 0.1450 seconds
        
        hbase(main):007:0> scan 'my_ns_admin:charles_testtable'
        ROW                                              COLUMN+CELL                                                                                                                                 
        0001                                            column=f1:name, timestamp=1569295080614, value=charles                                                                                      
        1 row(s) in 0.0570 seconds
        
        hbase(main):008:0> scan 'my_ns_admin:testtable'
        ROW                                              COLUMN+CELL                                                                                                                                 
        0001                                            column=f1:name, timestamp=1569227721451, value=charels                                                                                      
        1 row(s) in 0.0240 seconds
        
        hbase(main):009:0> put 'my_ns_admin:testtable','0001','f1:age',28
        0 row(s) in 0.0080 seconds
        
        hbase(main):010:0> scan 'my_ns_admin:testtable'
        ROW                                              COLUMN+CELL                                                                                                                                 
        0001                                            column=f1:age, timestamp=1569295103019, value=28                                                                                            
        0001                                            column=f1:name, timestamp=1569227721451, value=charels                                                                                      
        1 row(s) in 0.0520 seconds
        
        hbase(main):011:0> disable 'my_ns_admin:testtable'
        0 row(s) in 2.2940 seconds
        
        hbase(main):012:0> drop 'my_ns_admin:testtable'
        0 row(s) in 0.8160 seconds
        

        charles 用户被授权了my_ns_admin空间下所有权限(RWCXA),则可以在该空间下创建、删除表、也可以向该空间下所有表put数据等操作,对于未授权的其它空间无任何操作权限。
        测试在my_ns_admin空间外创建表

        hbase(main):001:0> create 'test_table', 'f1'
        
        ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions (user=charles, scope=default, params=[namespace=default,table=default:test_table,family=f1],action=CREATE)
        ......
        
        hbase(main):003:0> create 'MY_SCHEMA:test_table', 'f1'
        
        ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions (user=charles, scope=MY_SCHEMA, params=[namespace=MY_SCHEMA,table=MY_SCHEMA:test_table,family=f1],action=CREATE)
        ......
        
      3. 测试表范围授权

        使用 test 用户访问 HBase,进行操作,未给 test 用户授予任何权限,该用户查看不到任何表,也无法创建表。

        hbase(main):001:0> whoami
        test (auth:SIMPLE)
            groups: charles
        
        hbase(main):002:0> list
        TABLE                                                                                                                                                                                        
        0 row(s) in 0.1960 seconds
        
        => []
        hbase(main):003:0> create 'test','f1'
        
        ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions (user=test, scope=default, params=[namespace=default,table=default:test,family=f1],action=CREATE)
        
        ......
        

        charles 用户同样也可以为 test 用户授予 my_ns_admin:charles_testtable 表的 RW 权限,拥有 RW 权限的test用户则可以看到该表,并可以对该表进行读写操作,但无法进行其他操作。

        使用 charels 用户为 test 用户授予 my_ns_admin:charels_testtable 表的 RW 权限

        hbase(main):008:0> whoami
        charles (auth:SIMPLE)
            groups: charles
        
        hbase(main):009:0> grant 'test','RW','my_ns_admin:charles_testtable'
        0 row(s) in 0.1420 seconds
        
        hbase(main):012:0> user_permission '.*'
        User                                             Namespace,Table,Family,Qualifier:Permission                                                                                                 
         test                                            my_ns_admin,my_ns_admin:charles_testtable,,: [Permission: actions=READ,WRITE]                                                               
        1 row(s) in 0.0260 seconds
        
        

        再次使用test用户访问HBase

        hbase(main):005:0> whoami
        test (auth:SIMPLE)
            groups: charles
        
        hbase(main):006:0> list
        TABLE                                                                                                                                                                                        
        my_ns_admin:charles_testtable                                                                                                                                                                
        1 row(s) in 0.0140 seconds
        
        => ["my_ns_admin:charles_testtable"]
        hbase(main):007:0> scan my_ns_admin:charles_testtable
        NoMethodError: undefined method `my_ns_admin' for #<Object:0x738a5848>
        
        hbase(main):008:0> scan "my_ns_admin:charles_testtable"
        ROW                                              COLUMN+CELL                                                                                                                                 
         0001                                            column=f1:name, timestamp=1569295080614, value=charles                                                                                      
         0002                                            column=f1:name, timestamp=1569308212541, value=charles                                                                                      
        2 row(s) in 0.2050 seconds
        
        hbase(main):009:0> put 'my_ns_admin:charles_testtable','0001','f2:age','24'
        0 row(s) in 0.0820 seconds
        
        hbase(main):010:0> scan "my_ns_admin:charles_testtable"
        ROW                                              COLUMN+CELL                                                                                                                                 
         0001                                            column=f1:name, timestamp=1569295080614, value=charles                                                                                      
         0001                                            column=f2:age, timestamp=1569313276830, value=24                                                                                            
         0002                                            column=f1:name, timestamp=1569308212541, value=charles                                                                                      
        2 row(s) in 0.0150 seconds
        
        hbase(main):011:0> create 'test_table','f1'
        
        ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions (user=test, scope=default, params=[namespace=default,table=default:test_table,family=f1],action=CREATE)
        
        ......
        
        hbase(main):003:0> create "my_ns_admin:test_table",'f1'
        
        ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions (user=test, scope=my_ns_admin, params=[namespace=my_ns_admin,table=my_ns_admin:test_table,family=f1],action=CREATE)
        
        ......
        
        
      4. 测试ColumnFamily范围授权
         创建两个测试用户testcf和testcf_w
         ```
         [root@node00 ~]# useradd test_cf
         [root@node00 ~]# useradd test_cf_w
         [root@node00 ~]# id test_cf
         uid=1007(test_cf) gid=1007(test_cf) groups=1007(test_cf)
         [root@node00 ~]# id test_cf_w
         uid=1008(test_cf_w) gid=1008(test_cf_w) groups=1008(test_cf_w)
         ```
         在 test_cf 和 test_cf_w 用户未授权的情况下没有任何权限访问HBase的表
         ```shell
         hbase(main):001:0> whoami
         test_cf (auth:SIMPLE)
             groups: test_cf
         
         hbase(main):002:0> list
         TABLE                                                                                                                                                                                        
         0 row(s) in 0.1950 seconds
         
         => []
         ```
         ```shell
         hbase(main):001:0> whoami
         test_cf_w (auth:SIMPLE)
             groups: test_cf_w
         
         hbase(main):002:0> list
         TABLE                                                                                                                                                                                        
         0 row(s) in 0.1950 seconds
         
         => []
         ```
         
         使用 charles 用户为 test_cf 用户授予 my_ns_admin:charles_testtable 表的 f1 列簇的 R 访问权限,为 test_cf_w 用户授予 my_ns_admin:charles_testtable 表的 f2 列簇的 RW 访问权限
    
         ```shell
         hbase(main):013:0> whoami
         charles (auth:SIMPLE)
             groups: charles
         
         hbase(main):014:0> grant 'test_cf','R','my_ns_admin:charles_testtable','f1'
         0 row(s) in 0.1430 seconds
         
         hbase(main):015:0> grant 'test_cf_w','RW','my_ns_admin:charles_testtable','f2'
         0 row(s) in 0.0580 seconds
         
         hbase(main):016:0> user_permission '.*'
         User                                             Namespace,Table,Family,Qualifier:Permission                                                                                                 
          test                                            my_ns_admin,my_ns_admin:charles_testtable,,: [Permission: actions=READ,WRITE]                                                               
          test_cf                                         my_ns_admin,my_ns_admin:charles_testtable,f1,: [Permission: actions=READ]                                                                   
          test_cf_w                                       my_ns_admin,my_ns_admin:charles_testtable,f2,: [Permission: actions=READ,WRITE]                                                             
         3 row(s) in 0.0340 seconds
         hbase(main):017:0> scan "my_ns_admin:charles_testtable"
         ROW                                              COLUMN+CELL                                                                                                                                 
          0001                                            column=f1:name, timestamp=1569295080614, value=charles                                                                                      
          0001                                            column=f2:age, timestamp=1569313276830, value=24                                                                                            
          0002                                            column=f1:name, timestamp=1569308212541, value=charles                                                                                      
         2 row(s) in 0.0530 seconds
         ```
         
         在未给 test_cf 用户赋予 my_ns_admin:charles_testtable 表f1列簇的 Read 权限时,使用 test_cf 用户无法访问到该表,授予了f1列簇 Read 权限后可以查看表中f1列簇的数据,但无法向表中f1列簇写入数据。
    
         使用 test_cf 用户访问 my_ns_admin:charles_testtable 表并对该表进行操作:
         ```shell
         hbase(main):001:0> whoami
         test_cf (auth:SIMPLE)
             groups: test_cf
         
         hbase(main):002:0> list
         TABLE                                                                                                                                                                                        
         my_ns_admin:charles_testtable                                                                                                                                                                
         1 row(s) in 0.0170 seconds
         
         => ["my_ns_admin:charles_testtable"]
         hbase(main):003:0> scan "my_ns_admin:charles_testtable"
         ROW                                              COLUMN+CELL                                                                                                                                 
          0001                                            column=f1:name, timestamp=1569295080614, value=charles                                                                                      
          0002                                            column=f1:name, timestamp=1569308212541, value=charles                                                                                      
         2 row(s) in 0.2210 seconds
         
         hbase(main):004:0> put 'my_ns_admin:charles_testtable','0001','f1:age','33'
    
         ERROR: Failed 1 action: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions (user=test_cf, scope=my_ns_admin:charles_testtable, family=f1:age, params=[table=my_ns_admin:charles_testtable,family=f1:age],action=WRITE)
             at org.apache.hadoop.hbase.security.access.AccessController.prePut(AccessController.java:1651)
             at org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost$30.call(RegionCoprocessorHost.java:918)
         ......
         ```
         
         在未给 test_cf_w 用户赋予 my_ns_admin:charles_testtable 表 f2 列簇的 RW 权限时,使用 test_cf_w 用户无法访问到该表,授予 f2 列簇的 RW 权限后可以查看表中f2列簇的数据,也可以向f2列簇中写数据。
    
         使用 test_cf_w 用户访问 my_ns_admin:charles_testtable 表并对该表进行操作
         ```shell
         hbase(main):003:0> whoami
         test_cf_w (auth:SIMPLE)
             groups: test_cf_w
         
         hbase(main):004:0> list
         TABLE                                                                                                                                                                                        
         my_ns_admin:charles_testtable                                                                                                                                                                
         1 row(s) in 0.0240 seconds
         
         => ["my_ns_admin:charles_testtable"]
         hbase(main):005:0> scan "my_ns_admin:charles_testtable"
         ROW                                              COLUMN+CELL                                                                                                                                 
          0001                                            column=f2:age, timestamp=1569313276830, value=24                                                                                            
         1 row(s) in 0.1270 seconds
         
         hbase(main):006:0> put 'my_ns_admin:charles_testtable','0001','f2:name','test_cf_w'
         0 row(s) in 0.0700 seconds
         
         hbase(main):007:0> scan "my_ns_admin:charles_testtable"
         ROW                                              COLUMN+CELL                                                                                                                                 
          0001                                            column=f2:age, timestamp=1569313276830, value=24                                                                                            
          0001                                            column=f2:name, timestamp=1569315106485, value=test_cf_w                                                                                    
         1 row(s) in 0.0120 seconds
    
         ```
    
    1. HBase 撤销授权测试

      撤销授权可以通过 revoke 命令为 USER、Group、NameSpace 等取消授权,语法如下:

      revoke <user> [, <@namespace>[, <table> [, <column family> [, <column qualifier>]]]]
      

      先撤销 @admin 用户组的权限

      hbase(main):030:0> whoami
      hbase (auth:SIMPLE)
        groups: hbase
      
      hbase(main):031:0> user_permission '.*'
      User                                             Namespace,Table,Family,Qualifier:Permission                                                                                                 
       @admin                                          hbase,hbase:acl,,: [Permission: actions=CREATE,ADMIN]                                                                                       
       test                                            my_ns_admin,my_ns_admin:charles_testtable,,: [Permission: actions=READ,WRITE]                                                               
       test_cf                                         my_ns_admin,my_ns_admin:charles_testtable,f1,: [Permission: actions=READ]                                                                   
       test_cf_w                                       my_ns_admin,my_ns_admin:charles_testtable,f2,: [Permission: actions=READ,WRITE]                                                             
      4 row(s) in 0.8390 seconds
      
      hbase(main):032:0> revoke '@admin'
      0 row(s) in 0.0410 seconds
      
      hbase(main):033:0> user_permission '.*'
      User                                             Namespace,Table,Family,Qualifier:Permission                                                                                                 
       test                                            my_ns_admin,my_ns_admin:charles_testtable,,: [Permission: actions=READ,WRITE]                                                               
       test_cf                                         my_ns_admin,my_ns_admin:charles_testtable,f1,: [Permission: actions=READ]                                                                   
       test_cf_w                                       my_ns_admin,my_ns_admin:charles_testtable,f2,: [Permission: actions=READ,WRITE]                                                             
      3 row(s) in 0.8250 seconds
      

      测试是否撤销权限

      hbase(main):001:0> whoami
      admin (auth:SIMPLE)
        groups: admin, sudo, usr01
      
      hbase(main):002:0> list
      TABLE                                                                                                                                                                                        
      0 row(s) in 0.1620 seconds
      
      => []
      
    2. HBase权限总结
      1. HBase 既可以针对用户也可以针对用户组进行授权,如果需要针对用户组授权则需要在用户组前添加 "@"(如:grant '@admin', 'RWXCA')

      2. 在 CDH 中 HBase 支持 Global、NameSpace、Table、ColumnFamily 范围授权,无法支持 Row 级别授权。

      3. 拥有Admin(A)权限的用户,可以为其它用户进行任何级别授权,在使用HBase授权时需要慎用。

      4. 当为用户或用户组拥有CA权限时,用户和用户组创建表时会默认的为当前操作用户添加该表的RWXCA权限

      5. 可以下面语法查看当前 HBase 的授权

        hbase> user_permission
        hbase> user_permission '@ns1'
        hbase> user_permission '@.*'
        hbase> user_permission '@^[a-c].*'
        hbase> user_permission 'table1'
        hbase> user_permission 'namespace1:table1'
        hbase> user_permission '.*'
        hbase> user_permission '^[A-C].*'
        

    参考: https://www.cloudera.com/documentation/enterprise/latest/topics/cdh_sg_hbase_authorization.html#concept_enm_hhx_yp

    相关文章

      网友评论

          本文标题:CDH中配置启用 HBase 授权及测试

          本文链接:https://www.haomeiwen.com/subject/bzkdwctx.html