HBase ACLs的访问分为5个级别:
权限 | 说明 |
---|---|
Read® | 可以读取给定范围内的数据 |
Write(W) | 可以在给定范围内写入数据 |
Executor(X) | 可以在给定范围内执行协处理器端点 |
Create© | 可以在给定范围内创建表或删除表(甚至包括未创建的表) |
Admin(A) | 可以执行群集操作,例如平衡群集或在给定范围内分配区域 |
HBase 授权范围:
权限 | 说明 |
---|---|
Superuser | 超级用户可以执行HBase中所有操作及任何资源(如:hbase用户) |
Global | 在全局范围内授予的权限,可以在超级管理下创建多种集群管理员 |
Namespace | 在命名空间范围内授权,适用于命名空间内所有表 |
Table | 表范围授权,适用于为指定表进行授权 |
ColumnFamily | ColumnFamily范围内授权 |
Cell | 为指定的单元格进行授权 |
授权可以通过 grant 命令为 USER、Group、NameSpace 等取消授权,语法如下:
grant <user> , <permissions> [, <@namespace>[, <table> [, <column family> [, <column qualifier>]]]]
授权前使用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
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)
......
使用 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)
......
创建两个测试用户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
撤销授权可以通过 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
=> []
HBase 既可以针对用户也可以针对用户组进行授权,如果需要针对用户组授权则需要在用户组前添加 “@”(如:grant ‘@admin’, ‘RWXCA’)
在 CDH 中 HBase 支持 Global、NameSpace、Table、ColumnFamily 范围授权,无法支持 Row 级别授权。
拥有Admin(A)权限的用户,可以为其它用户进行任何级别授权,在使用HBase授权时需要慎用。
当为用户或用户组拥有CA权限时,用户和用户组创建表时会默认的为当前操作用户添加该表的RWXCA权限
可以下面语法查看当前 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