场景:hadoop集群已经进行kerberos认证
- 启动Hbase相关配置
- Hbase权限分为以下五种:
Read(R) : 可以读取给定范围内数据的权限
Write(W) : 可以在给定范围内写数据
Executor(X) : 可以在指定表执行Endpoints类型的协处理
Create(C) : 可以在给定范围内创建和删除表(包括非该用户创建的表)
Admin(A) : 可以执行集群操作,如平衡数据等
以上5个控制级别都需要为其指定范围,范围定义如下:
Superuser : 超级用户可以执行HBase中所有操作及任何资源(如:hbase用户)
Global: 在全局范围内授予的权限,可以在超级管理下创建多种集群管理员
Namespace: 在命名空间范围内授权,适用于命名空间内所有表
Table: 表范围授权,适用于为指定表进行授权
ColumnFamily: ColumnFamily范围内授权
Cell: 为指定的单元格进行授权
grant
grant <user>, <permissions> [, <@namespace> [, <table> [, <column family> [, <column qualifier>]]]
- 对指定用户授权
使用kerberos 授权的hdfs用户执行创建表,对HDFS文件系统hdfs有最高的权限,但是在hbase shell中创建表也是没有权限(前提是启动kerberos,未启动的集群可以随便搞~)
hbase(main):001:0> create 'test','fn'ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions (user=hdfs@JAST.COM, scope=default, params=[namespace=default,table=default:test,family=fn],action=CREATE)
使用kerberos 授权的hbase用户有最高权限,我们使用hbase,授权给hdfs相关权限
kinit -kt hbase.keytab hbase@JAST.COM # 切换hbase
给hdfs用户授权 Create(C) 、Admin(A) 权限
hbase(main):004:0> grant 'hdfs','CA'
0 row(s) in 0.2240 secondshbase(main):005:0> user_permission
User Namespace,Table,Family,Qualifier:Permission hdfs hbase,hbase:acl,,: [Permission: actions=CREATE,ADMIN]
测试创建表 ,成功
hbase(main):005:0> create 'test2','ss'
0 row(s) in 1.2710 seconds
测试查询数据,发现只能查询、添加使用hdfs创建的表,其他表提示无权限(写入也无权限这里不做测试了)
hbase(main):003:0> scan 'test',{LIMIT=>1}
ROW COLUMN+CELL ERROR: org.apache.hadoop.hbase.security.AccessDeniedException: Insufficient permissions for user 'hdfs' (table=test, action=READ)
也就是说授予CA权限的用户可以对自己新建的表进行读、写、删除等操作,但不能操作非admin用户创建的表。如果admin用户拥有RCA的权限则可以读非admin用户创建的表进行操作(如:读、写、删除操作)
注意:这里给用户设置了A的权限,他同时也可以修改其他用户的相关权限,所以admin谨慎设置,超级用户与hbase用户不受ACL权限控制,即便设置了也不生效
查看权限发现的确与测试结果相同
hbase(main):012:0> user_permission '.*'
User Namespace,Table,Family,Qualifier:Permission hdfs hbase,hbase:acl,,: [Permission: actions=CREATE,ADMIN] hbase default,test,,: [Permission: actions=READ,WRITE,EXEC,CREATE,ADMIN] hdfs default,test2,,: [Permission: actions=READ,WRITE,EXEC,CREATE,ADMIN]
3 row(s) in 0.7510 seconds
重新授权,可以查看所有表数据~
hbase(main):004:0> grant 'hdfs','CAR'
0 row(s) in 0.0700 secondshbase(main):005:0> user_permission
User Namespace,Table,Family,Qualifier:Permission hdfs hbase,hbase:acl,,: [Permission: actions=CREATE,ADMIN,READ]
1 row(s) in 0.0320 seconds#授权后查看数据,成功
hbase(main):005:0> scan 'test',{LIMIT=>1}
ROW COLUMN+CELL 0000300_04bedaa8de0a226b3a7f48f12c5504a8 column=fn:article_type, timestamp=1562936918988, value=2 0000300_04bedaa8de0a226b3a7f48f12c5504a8 column=fn:crawler_site_id, timestamp=1562936918988, value=300 0000300_04bedaa8de0a226b3a7f48f12c5504a8 column=fn:crawler_time, timestamp=1562936918988, value=2019-07-09 20:17:51.473 0000300_04bedaa8de0a226b3a7f48f12c5504a8 column=fn:created_at, timestamp=1562936918988, value=2019-07-09 07:00:00.000 0000300_04bedaa8de0a226b3a7f48f12c5504a8 column=fn:created_date, timestamp=1562936918988, value=20190709 0000300_04bedaa8de0a226b3a7f48f12c5504a8 column=fn:download_type, timestamp=1562936918988, value=297 0000300_04bedaa8de0a226b3a7f48f12c5504a8 column=fn:emotion, timestamp=1562936918988, value=\xE4\xB8\xAD\xE6\x80\xA7 0000300_04bedaa8de0a226b3a7f48f12c5504a8 column=fn:grade_all, timestamp=1562936918988, value=2 0000300_04bedaa8de0a226b3a7f48f12c5504a8 column=fn:media_type, timestamp=1562936918988, value=["002-001","001-002"]
- 赋予某个用户命名空间权限
#给hdfs用户赋予命名空间default读R权限
grant 'hdfs','R','@default'
#hdfs用户移除命名空间default的权限
revoke 'hdfs','@default'
- 赋予某个用户某个表的权限
#给hdfs 赋予表TEST_TABLE_NAME 读权限
grant 'hdfs','R','TEST_TABLE_NAME'
- 赋予某个用户某个列的权限
#赋予权限
grant 'hdfs','R','TEST_TABLE_NAME','fn','text'
#查看
hbase(main):019:0> user_permission 'TEST_TABLE_NAME'
User Namespace,Table,Family,Qualifier:Permission hdfs TEST_TABLE_NAME,fn,text: [Permission: actions=READ]
#删除
revoke 'hdfs','TEST_TABLE_NAME','fn','text'