较新版本的 Apache HBase(> = 0.92)支持客户端的可选 SASL 身份验证。另见 Matteo Bertozzi 关于了解 Apache HBase 中用户认证和授权的文章

介绍如何设置 Apache HBase 和客户端以连接到安全的 HBase 资源。

61.1。先决条件

Hadoop 身份验证配置

要使用强身份验证运行 HBase RPC,必须将hbase.security.authentication设置为kerberos。在这种情况下,还必须在 core-site.xml 中将hadoop.security.authentication设置为kerberos。否则,您将对 HBase 使用强身份验证,但不会对底层 HDFS 使用强身份验证,这将取消任何好处。

Kerberos KDC

您需要有一个有效的 Kerberos KDC。

61.2。用于安全操作的服务器端配置

首先,请参阅 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 服务。

61.3。用于安全操作的客户端配置

首先,请参阅先决条件并确保您的基础 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.filehbase.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%。

61.4。用于安全操作的客户端配置 - Thrift Gateway

将以下内容添加到每个 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 网关的凭证并享有其特权。

61.5。配置 Thrift 网关以代表客户端进行身份验证

安全操作的客户端配置 - Thrift Gateway 描述了如何使用固定用户对 Thrift 客户端进行 HBase 认证。作为替代方案,您可以将 Thrift 网关配置为代表客户端对 HBase 进行身份验证,并使用代理用户访问 HBase。这在用于 Thrift 1 的 HBASE-11349 和用于 Thrift 2 的 HBASE-11474 中实施。

Thrift Framed Transpor 的限制

如果您使用框架式传输,则无法利用此功能,因为此时 SASL 不适用于 Thrift 框架传输。

要启用它,请执行以下操作。

  1. 按照安全操作的客户端配置 - Thrift Gateway 中所述的步骤,确保 Thrift 在安全模式下运行。

  2. 确保 HBase 配置为允许代理用户,如 REST 网关模拟配置中所述。

  3. 在运行 Thrift 网关的每个群集节点的 hbase-site.xml 中,将属性hbase.thrift.security.qop设置为以下三个值之一:

    • privacy - 身份验证,完整性和机密性检查。

    • integrity - 身份验证和完整性检查

    • authentication - 仅验证身份验证

  4. 重新启动 Thrift 网关进程以使更改生效。如果节点正在运行 Thrift,则jps命令的输出将列出ThriftServer进程。要在节点上停止 Thrift,请运行命令bin/hbase-daemon.sh stop thrift。要在节点上启动 Thrift,请运行命令bin/hbase-daemon.sh start thrift

61.6。配置 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> 

看看演示客户端,了解如何在客户端使用此功能。

61.7。用于安全操作的客户端配置 - REST 网关

将以下内容添加到每个 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 身份验证

61.8。 REST 网关模拟配置

默认情况下,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.