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

  1. HBase启用授权配置
    1. Hbase -> 配置 -> 搜索 auth -> 勾选 HBase 安全授权 -> 保存更改

      CDH中配置启用 HBase 授权及测试_第1张图片

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

      
        hbase.security.exec.permission.checks
        true
      
      

      CDH中配置启用 HBase 授权及测试_第2张图片

    3. Hbase -> 配置 -> 搜索 super -> 添加超级用户 -> 保存更改

      CDH中配置启用 HBase 授权及测试_第3张图片

    4. 重启 HBase 服务

  2. HBase的 ACLs 权限控制说明

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

    权限 说明
    Read® 可以读取给定范围内的数据
    Write(W) 可以在给定范围内写入数据
    Executor(X) 可以在给定范围内执行协处理器端点
    Create© 可以在给定范围内创建表或删除表(甚至包括未创建的表)
    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 #
      
      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的表

      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
      
      => []
      
      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 访问权限

      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 表并对该表进行操作:

      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 表并对该表进行操作

      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
      
      
  4. 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
    
    => []
    
  5. 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)