较新版本的 Apache HBase(> = 0.92)支持客户端的可选 SASL 身份验证。另见 Matteo Bertozzi 关于了解 Apache HBase 中用户认证和授权的文章。
介绍如何设置 Apache HBase 和客户端以连接到安全的 HBase 资源。
Hadoop 身份验证配置
要使用强身份验证运行 HBase RPC,必须将hbase.security.authentication
设置为kerberos
。在这种情况下,还必须在 core-site.xml 中将hadoop.security.authentication
设置为kerberos
。否则,您将对 HBase 使用强身份验证,但不会对底层 HDFS 使用强身份验证,这将取消任何好处。
Kerberos KDC
您需要有一个有效的 Kerberos KDC。
首先,请参阅 security.prerequisites 并确保您的基础 HDFS 配置是安全的。
将以下内容添加到群集中每台服务器上的hbase-site.xml
文件中:
<property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.hadoop.hbase.security.token.TokenProvider</value>
</property>
部署这些配置更改时,需要完全关闭并重新启动 HBase 服务。
首先,请参阅先决条件并确保您的基础 HDFS 配置是安全的。
将以下内容添加到每个客户端上的hbase-site.xml
文件中:
<property>
<name>hbase.security.authentication</name>
<value>kerberos</value>
</property>
在 2.2.0 版之前,客户端环境必须通过kinit
命令从 KDC 或 keytab 登录到 Kerberos,然后才能与 HBase 集群进行通信。
从 2.2.0 开始,客户端可以在hbase-site.xml
中指定以下配置:
<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>
然后,应用程序可以自动执行登录和凭据续订作业,而不会受到客户端干扰。
它是可选功能,客户端升级到 2.2.0,只要保持hbase.client.keytab.file
和hbase.client.keytab.principal
未设置,它仍然可以保留旧版本中的登录和凭证更新逻辑。
请注意,如果客户端和服务器端站点文件中的hbase.security.authentication
不匹配,则客户端将无法与群集通信。
将 HBase 配置为安全 RPC 后,可以选择配置加密通信。为此,请将以下内容添加到每个客户端上的hbase-site.xml
文件中:
<property>
<name>hbase.rpc.protection</name>
<value>privacy</value>
</property>
此配置属性也可以基于每个连接进行设置。将其设置在Table
提供的Configuration
中:
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
conf.set("hbase.rpc.protection", "privacy");
try (Connection connection = ConnectionFactory.createConnection(conf);
Table table = connection.getTable(TableName.valueOf(tablename))) {
.... do your stuff
}
对于加密通信,预计性能损失约为 10%。
将以下内容添加到每个 Thrift 网关的hbase-site.xml
文件中:
<property>
<name>hbase.thrift.keytab.file</name>
<value>/etc/hbase/conf/hbase.keytab</value>
</property>
<property>
<name>hbase.thrift.kerberos.principal</name>
<value>$USER/_HOST@HADOOP.LOCALDOMAIN</value>
<!-- TODO: This may need to be HTTP/_HOST@<REALM> and _HOST may not work.
You may have to put the concrete full hostname.
-->
</property>
<!-- Add these if you need to configure a different DNS interface from the default -->
<property>
<name>hbase.thrift.dns.interface</name>
<value>default</value>
</property>
<property>
<name>hbase.thrift.dns.nameserver</name>
<value>default</value>
</property>
分别用 $ USER 和 $ KEYTAB 替换相应的凭证和密钥表。
为了使用 Thrift API 主体与 HBase 交互,还需要将hbase.thrift.kerberos.principal
添加到_acl_
表中。例如,要给 Thrift API 主体,thrift_server
,管理访问权限,这样的命令就足够了:
grant 'thrift_server', 'RWCA'
有关 ACL 的更多信息,请参阅访问控制标签(ACL)部分
Thrift 网关将使用提供的凭证对 HBase 进行身份验证。 Thrift 网关本身不会执行任何身份验证。通过 Thrift 网关进行的所有客户端访问都将使用 Thrift 网关的凭证并享有其特权。
安全操作的客户端配置 - Thrift Gateway 描述了如何使用固定用户对 Thrift 客户端进行 HBase 认证。作为替代方案,您可以将 Thrift 网关配置为代表客户端对 HBase 进行身份验证,并使用代理用户访问 HBase。这在用于 Thrift 1 的 HBASE-11349 和用于 Thrift 2 的 HBASE-11474 中实施。
Thrift Framed Transpor 的限制
如果您使用框架式传输,则无法利用此功能,因为此时 SASL 不适用于 Thrift 框架传输。
要启用它,请执行以下操作。
按照安全操作的客户端配置 - Thrift Gateway 中所述的步骤,确保 Thrift 在安全模式下运行。
确保 HBase 配置为允许代理用户,如 REST 网关模拟配置中所述。
在运行 Thrift 网关的每个群集节点的 hbase-site.xml 中,将属性hbase.thrift.security.qop
设置为以下三个值之一:
privacy
- 身份验证,完整性和机密性检查。
integrity
- 身份验证和完整性检查
authentication
- 仅验证身份验证
重新启动 Thrift 网关进程以使更改生效。如果节点正在运行 Thrift,则jps
命令的输出将列出ThriftServer
进程。要在节点上停止 Thrift,请运行命令bin/hbase-daemon.sh stop thrift
。要在节点上启动 Thrift,请运行命令bin/hbase-daemon.sh start thrift
。
doAs
功能配置 Thrift 网关以代表客户端进行身份验证描述如何配置 Thrift 网关以代表客户端对 HBase 进行身份验证,以及如何使用代理用户访问 HBase。此方法的局限性在于,使用一组特定凭据初始化客户端后,它无法在会话期间更改这些凭据。 doAs
功能提供了一种使用同一客户端模拟多个主体的灵活方式。此功能在 HBASE-12640 中针对 Thrift 1 实施,但目前不适用于 Thrift 2。
要启用doAs
功能,请将以下内容添加到每个 Thrift 网关的 hbase-site.xml 文件中:
<property>
<name>hbase.regionserver.thrift.http</name>
<value>true</value>
</property>
<property>
<name>hbase.thrift.support.proxyuser</name>
<value>true/value>
</property>
要在使用doAs
模拟时允许代理用户,请将以下内容添加到每个 HBase 节点的 hbase-site.xml 文件中:
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.proxyuser.$USER.groups</name>
<value>$GROUPS</value>
</property>
<property>
<name>hadoop.proxyuser.$USER.hosts</name>
<value>$GROUPS</value>
</property>
看看演示客户端,了解如何在客户端使用此功能。
将以下内容添加到每个 REST 网关的hbase-site.xml
文件中:
<property>
<name>hbase.rest.keytab.file</name>
<value>$KEYTAB</value>
</property>
<property>
<name>hbase.rest.kerberos.principal</name>
<value>$USER/_HOST@HADOOP.LOCALDOMAIN</value>
</property>
Substitute the appropriate credential and keytab for $USER and $KEYTAB respectively.
REST 网关将使用提供的凭据通过 HBase 进行身份验证。
为了使用 REST API 主体与 HBase 交互,还需要将hbase.rest.kerberos.principal
添加到_acl_
表。例如,要给出 REST API 主体,rest_server
,管理访问权限,这样的命令就足够了:
grant 'rest_server', 'RWCA'
For more information about ACLs, please see the Access Control Labels (ACLs) section
HBase REST 网关支持 SPNEGO HTTP 身份验证,以便客户端访问网关。要为客户端访问启用 REST 网关 Kerberos 身份验证,请将以下内容添加到每个 REST 网关的hbase-site.xml
文件中。
<property>
<name>hbase.rest.support.proxyuser</name>
<value>true</value>
</property>
<property>
<name>hbase.rest.authentication.type</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.rest.authentication.kerberos.principal</name>
<value>HTTP/_HOST@HADOOP.LOCALDOMAIN</value>
</property>
<property>
<name>hbase.rest.authentication.kerberos.keytab</name>
<value>$KEYTAB</value>
</property>
<!-- Add these if you need to configure a different DNS interface from the default -->
<property>
<name>hbase.rest.dns.interface</name>
<value>default</value>
</property>
<property>
<name>hbase.rest.dns.nameserver</name>
<value>default</value>
</property>
用 $ KEYTAB 替换 HTTP 的密钥表。
HBase REST 网关支持不同的'hbase.rest.authentication.type':simple,kerberos。您还可以通过实现 Hadoop AuthenticationHandler 来实现自定义身份验证,然后将完整的类名指定为“hbase.rest.authentication.type”值。有关更多信息,请参阅 SPNEGO HTTP 身份验证。
默认情况下,REST 网关不支持模拟。它代表客户端访问 HBase,就像上一节中配置的用户一样。对于 HBase 服务器,所有请求都来自 REST 网关用户。实际用户不详。您可以打开模拟支持。通过模拟,REST 网关用户是代理用户。 HBase 服务器知道每个请求的实际/真实用户。所以它可以应用适当的授权。
要打开 REST 网关模拟,我们需要配置 HBase 服务器(主服务器和区域服务器)以允许代理用户;配置 REST 网关以启用模拟。
要允许代理用户,请将以下内容添加到每个 HBase 服务器的hbase-site.xml
文件中:
<property>
<name>hadoop.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hadoop.proxyuser.$USER.groups</name>
<value>$GROUPS</value>
</property>
<property>
<name>hadoop.proxyuser.$USER.hosts</name>
<value>$GROUPS</value>
</property>
用 $ USER 替换 REST 网关代理用户,用 $ GROUPS 替换允许的组列表。
要启用 REST 网关模拟,请将以下内容添加到每个 REST 网关的hbase-site.xml
文件中。
<property>
<name>hbase.rest.authentication.type</name>
<value>kerberos</value>
</property>
<property>
<name>hbase.rest.authentication.kerberos.principal</name>
<value>HTTP/_HOST@HADOOP.LOCALDOMAIN</value>
</property>
<property>
<name>hbase.rest.authentication.kerberos.keytab</name>
<value>$KEYTAB</value>
</property>
Substitute the keytab for HTTP for $KEYTAB.