HBase 安全相关配置。
Kerberos认证
HBase配置Kerberos时,需要Hadoop和Zookeeper同时配置Kerberos接入。
Server的hbase-site.xml配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| <property> <name>hbase.security.authentication</name> <value>kerberos</value> </property>
<property> <name>hbase.security.authorization</name> <value>true</value> </property>
<property> <name>hbase.master.kerberos.principal</name> <value>hbase/_HOST@IDATA.RUIJIE.COM</value> </property> <property> <name>hbase.regionserver.kerberos.principal</name> <value>hbase/_HOST@IDATA.RUIJIE.COM</value> </property> <property> <name>hbase.thrift.kerberos.principal</name> <value>hbase/_HOST@IDATA.RUIJIE.COM</value> </property>
<property> <name>hbase.master.keytab.file</name> <value>hbase.keytab</value> </property> <property> <name>hbase.regionserver.keytab.file</name> <value>hbase.keytab</value> </property> <property> <name>hbase.thrift.keytab.file</name> <value>/etc/hbase/conf/hbase.keytab</value> </property>
<property> <name>hbase.coprocessor.master.classes</name> <value>org.apache.hadoop.hbase.security.access.AccessControllerorg.apache.hadoop.hbase.security.visibility.VisibilityController</value> </property>
<property> <name>hbase.coprocessor.region.classes</name> <value>org.apache.hadoop.hbase.security.access.AccessController,org.apache.hadoop.hbase.security.visibility.VisibilityController,org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.SecureBulkLoadEndpoint</value> </property>
|
配置jaas.conf
在Apache hbase版本的配置文件中,可以在hbase-env.sh文件中指定jaas.conf文件的地址,配置该文件主要是为了让HBase通过特权账户访问Zookeeper。
1
| export HBASE_OPTS="-Djava.security.auth.login.config=$HBASE_CONFIG_DIR/jaas.conf"
|
Client相关配置
当HBase配置Kerberos认证之后,Client需要以下额外配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <property> <name>hbase.security.authentication</name> <value>kerberos</value> </property>
<property> <name>hbase.client.keytab.file</name> <value>/local/path/to/client/keytab</value> </property>
<property> <name>hbase.client.keytab.principal</name> <value>foo@EXAMPLE.COM</value> </property>
|
Thrift、REST 访问HBase
略
数据安全
对接Kerberos后,可以针对用户需要,为HBase开启不同的数据安全策略(必须配置)。
HBase提供以下安全策略:
- 基于 RBAC 的访问控制,包括:命名空间、表、列族、列的ACL
- 基于可见性标签的 Cell 访问控制
- HFiles 和 WAL 的数据透明加密
Tag机制
HBase的部分安全功能需要 HFile V3 格式的支持。
1 2 3 4
| <property> <name>hfile.format.version</name> <value>3</value> </property>
|
Tag 是 HFile v3 的新特性。 Tag是cell的metadata资源,被直接存储在HFiles中,一个 Cell 可以包括一个或者多个 tag 。HBase的cell级别ACL,以及visibility labels 需要通过 Tag 能力支持。
Tag可以在列族级别指定压缩的格式(当WAL使用加密时,不支持对Tag进行压缩)。用户读取Cell时,Coprocessors 会在RPC传输层分离Tag,因此对用户来说Tag是不可见的。
ACLs
HBase 提供用户/用户组的权限认证功能。
由于HBase本身不保存user-groups映射,所有的映射关系来自Hadoop,通常情况下在HBase的RBAC体系中,Group被作为Role。
ACLs相关配置
HBase 的ACL控制通过 Coprocessors 实现,大部分ACL逻辑实现在org.apache.hadoop.hbase.security.access.AccessController类中。
配置HBase 的ACL包括以下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <property> <name>hbase.security.authorization</name> <value>true</value> </property> <property> <name>hbase.coprocessor.region.classes</name> <value>org.apache.hadoop.hbase.security.access.AccessController, org.apache.hadoop.hbase.security.token.TokenProvider</value> </property> <property> <name>hbase.coprocessor.master.classes</name> <value>org.apache.hadoop.hbase.security.access.AccessController</value> </property> <property> <name>hbase.coprocessor.regionserver.classes</name> <value>org.apache.hadoop.hbase.security.access.AccessController</value> </property>
<property> <name>hbase.security.exec.permission.checks</name> <value>true</value> </property>
|
权限类型
HBase提供的权限包括:
权限 |
说明 |
备注 |
Read |
读权限 |
|
Write |
写权限 |
|
Execute |
执行权限,即执行相关的Coprocessors的权限 |
|
Create |
创建表、删除表的权限 |
|
Admin |
管理员权限,包括:表的balance操作、region assin、grant、revoke等操作 |
由于Admin权限能够给自己赋权,因此该权限是最高权限 |
权限范围
包括以下权限范围:
Scope |
说明 |
备注 |
Superuser |
HBase中的超级用户,默认情况下,启动用户hbase是超级用户。HBase中可以配置多个超级用户。超级用户有一切权限 |
hbase.superuser配置项可以指定超级用户 |
global |
整个HBase空间的权限范围 |
|
namespaces |
命名空间范围 |
|
tables |
表级权限范围 |
|
ColumnFamily |
列族级权限范围 |
|
常用权限命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| grant 'user', 'RWXCA', 'TABLE', 'CF', 'CQ'
grant '@admin', 'RWXCA'
grant 'root','RWXCA','@my-NS'
grant 'root','RW','my-table'
grant 'root', 'RW', 'my-table', 'cf1'
grant 'root', 'RW', 'my-table', 'cf2','A'
|
1 2 3 4
|
revoke 'user', '@<namespace>', 'table','cf','qualifier'
|
1 2 3 4 5 6 7
| user_permission '<scope>'
scan 'hbase:acl'
|
Cell/Row级别的权限
Cell/Row级别的权限控制,需要而外配置以下参数:
1 2 3 4 5 6 7 8 9 10 11
|
<property> <name>hfile.format.version</name> <value>3</value> </property>
<property> <name>hbase.security.access.early_out</name> <value>false</value> </property>
|
通过以下命令提供Cell权限:
1 2 3 4 5 6 7
| grant 'table', {'user'=>'RW', ... }, { 筛选条件 }
grant 'linqing:test',{'root'=>'RW','admin'=>'W'},{FILTER => "(PrefixFilter('roww'))"}
grant 'linqing:test',{'root'=>''},{FILTER => "(PrefixFilter('roww'))"}
|
PS: 关于筛选条件可以参考官网
可视化标签
Cell权限控制是通过可视化标签实现的。 通常情况下可视化标签这个feature,可以作为HBase的视图特性!
可视化标签只需要VisibilityController类就可以运行!不需要配置AccessController
通过标签,可以实现以下效果:
在A用户有整张表的读权限是,使某些Cell对A来说不可见。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| add_labels 'linqing'
set_visibility 'linqing:test','linqing',{COLUMN =>'cf1'}
set_auths 'root','linqing'
clear_auths 'root','linqing'
get_auths 'root'
scan 'linqing:test',{ AUTHORIZATIONS =>['linqing']}
|
PS:HBase可以自定义标签算法,参考
参考
How-to: Enable User Authentication and Authorization in Apache HBase
权限矩阵
Apache HBase Cell Level Security, Part 1
Apache HBase Cell Level Security, Part 2