-
HBase启用授权配置
-
Hbase -> 配置 -> 搜索 auth -> 勾选 HBase 安全授权 -> 保存更改
image -
Hbase -> 配置 -> 高级 -> 搜索 hbase-site.xml -> 添加配置 -> 保存更改
image<property> <name>hbase.security.exec.permission.checks</name> <value>true</value> </property>
-
Hbase -> 配置 -> 搜索 super -> 添加超级用户 -> 保存更改
image -
重启 HBase 服务
-
-
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 为指定的单元格进行授权 -
HBase 权限授权测试
授权可以通过 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
-
测试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) ......
-
测试表范围授权
使用 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) ......
-
测试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
```
-
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 => []
-
HBase权限总结
-
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].*'
-
网友评论