Kerberos编辑

添加于 6.7。

Elasticsearch for Apache Hadoop 的 Kerberos 支持需要 Elasticsearch 6.7 或更高版本

保护 Hadoop 安全意味着使用 Kerberos。Elasticsearch 支持 Kerberos 作为一种身份验证方法。虽然保护 Elasticsearch 安全不需要使用 Kerberos,但对于那些已经部署 Kerberos 来保护其 Hadoop 集群的人来说,这是一个方便的选择。本章旨在说明设置 elasticsearch-hadoop 以使用 Kerberos 身份验证访问 Elasticsearch 所需的步骤。

Elasticsearch for Apache Hadoop 完全通过 HTTP 与 Elasticsearch 通信。为了支持 HTTP 上的 Kerberos 身份验证,elasticsearch-hadoop 使用 简单和受保护的 GSSAPI 协商机制 (SPNEGO) 来协商使用哪种底层身份验证方法(在本例中为 Kerberos)并将约定的凭据传输到服务器。此身份验证机制使用 HTTP 协商 身份验证标准执行,其中请求被发送到服务器,并且接收回包含进一步推进协商的有效负载的响应。客户端和服务器之间的协商完成后,请求被接受并返回成功响应。

Elasticsearch for Apache Hadoop 利用 Hadoop 的用户管理流程;在对 Elasticsearch 进行身份验证时,将使用当前 Hadoop 用户的 Kerberos 凭据。这意味着必须在 Hadoop 中启用 Kerberos 身份验证,以便 elasticsearch-hadoop 获取用户的 Kerberos 凭据。在使用不依赖 Hadoop 运行时的集成的情况下,可能需要执行其他步骤以确保正在运行的进程具有可用于身份验证的 Kerberos 凭据。建议您查阅您正在使用的每个框架的文档,了解如何配置安全性。

设置您的环境编辑

本文档假设您已经配置了启用了 Kerberos 身份验证的 Hadoop 集群(必需)。部署 Kerberos 和保护 Hadoop 的一般过程超出了本文档的范围。

在开始之前,您需要确保在您的 Kerberos 部署中为您的用户配置了主体,并为每个 Elasticsearch 节点配置了服务主体。要在 Elasticsearch 上启用 Kerberos 身份验证,必须 使用 Kerberos 领域进行配置。建议您熟悉如何配置 Elasticsearch Kerberos 领域,以便您可以进行适当的调整以适应您的部署。您可以在 Elastic Stack 文档 中找到有关它们如何工作的更多信息。

此外,您还需要在 Elasticsearch 中 配置 API 密钥领域。Hadoop 和其他分布式数据处理框架仅在启动作业的过程中使用 Kerberos 进行身份验证。作业启动后,工作进程通常会与原始 Kerberos 凭据断开连接,并且需要其他形式的身份验证。Hadoop 服务通常提供在作业提交期间获取*委托令牌*的机制。然后,这些令牌被分发到工作进程,这些进程使用令牌代表运行作业的用户进行身份验证。Elasticsearch for Apache Hadoop 获取 API 密钥是为了向工作进程提供令牌以进行身份验证。

连接器设置编辑

以下设置用于将 elasticsearch-hadoop 配置为使用 Kerberos 身份验证

es.security.authentication(默认为 simple,如果设置了 es.net.http.auth.user,则为 basic
必需。与大多数 Hadoop 集成类似,此属性指示使用哪种方法对 Elasticsearch 进行身份验证。默认情况下,该值为 simple,除非设置了 es.net.http.auth.user,在这种情况下,它将默认为 basic。此设置的可用选项包括:simple 表示不进行身份验证,basic 表示进行基本 http 身份验证,pki 表示依赖证书,以及 kerberos 表示应使用 SPNEGO 上的 Kerberos 身份验证。
es.net.spnego.auth.elasticsearch.principal(默认无)
如果 es.security.authentication 设置为 kerberos,则为必需。详细说明 Elasticsearch 服务器运行时使用的服务主体名称。这通常采用 HTTP/node.address@REALM 的形式。由于 Elasticsearch 是分布式的,并且应该为每个节点使用一个服务主体,因此您可以使用 _HOST 模式(例如 HTTP/_HOST@REALM)让 elasticsearch-hadoop 在运行时替换它正在通信的节点的地址。请注意,elasticsearch-hadoop 将尝试将节点 IP 地址反向解析为主机名,以便执行此替换。
es.net.spnego.auth.mutual(默认为 false)
可选。SPNEGO 机制假设身份验证可能需要多个来回请求-响应周期才能使请求被服务器完全接受。当服务器最终接受请求时,响应包含一个有效负载,可以对其进行验证以确保服务器是其声称的主体。将其设置为 true 会指示 elasticsearch-hadoop 执行此相互身份验证,并在检测到来自服务器的无效凭据时使响应失败。

Hadoop 上的 Kerberos编辑

要求编辑

在使用 Kerberos 身份验证访问 Elasticsearch 之前,必须在 Hadoop 中启用 Kerberos 身份验证。

配置 elasticsearch-hadoop编辑

Elasticsearch for Apache Hadoop 只需要 一些设置 即可配置 Kerberos 身份验证。最好在您的 core-site.xml 配置中设置这些属性,以便可以在整个 Hadoop 部署中获取它们,就像为 Hadoop 中的服务启用安全选项一样。

<configuration>
    ...
    <property>
        <name>es.security.authentication</name>
        <value>kerberos</value>
    </property>
    <property>
        <name>es.net.spnego.auth.elasticsearch.principal</name>
        <value>HTTP/[email protected]</value>
    </property>
    ...
</configuration>

YARN 上的 Kerberos编辑

当应用程序在 YARN 集群上启动时,它们会将其所有应用程序凭据发送到资源管理器进程,以便将它们分发到容器。资源管理器能够续订这些凭据中即将过期的任何令牌,并在作业完成后取消令牌。来自 Elasticsearch 的令牌的默认寿命为 7 天,并且不可续订。最佳做法是配置 YARN,以便它能够在运行结束时取消这些令牌,以降低未经授权使用的风险,并减少 Elasticsearch 必须执行的维护工作量。

要将 YARN 配置为允许它在运行结束时取消 Elasticsearch 令牌,您必须将 elasticsearch-hadoop jar 添加到资源管理器的类路径中。您可以通过将 jar 放置在资源管理器的本地文件系统上,并在 YARN_USER_CLASSPATH 环境变量中设置 jar 的路径来做到这一点。添加 jar 后,需要重新启动资源管理器。

export YARN_USER_CLASSPATH=/path/to/elasticsearch-hadoop.jar

此外,elasticsearch-hadoop 的连接信息应该出现在 Hadoop 配置中,最好是 core-site.xml 中。这是因为当资源管理器取消令牌时,它不会考虑作业配置。如果 Hadoop 配置中没有连接设置,资源管理器将无法与 Elasticsearch 通信以取消令牌。

以下是一些常见的安全属性,资源管理器需要这些属性才能联系 Elasticsearch 以取消令牌

<configuration>
    ...
    <property>
        <name>es.nodes</name>
        <value>es-master-1,es-master-2,es-master-3</value> 
    </property>
    <property>
        <name>es.security.authentication</name> 
        <value>kerberos</value>
    </property>
    <property>
        <name>es.net.spnego.auth.elasticsearch.principal</name> 
        <value>HTTP/_HOST@REALM</value>
    </property>
    <property>
        <name>es.net.ssl</name> 
        <value>true</value>
    </property>
    <property>
        <name>es.net.ssl.keystore.location</name> 
        <value>file:///path/to/ssl/keystore</value>
    </property>
    <property>
        <name>es.net.ssl.truststore.location</name> 
        <value>file:///path/to/ssl/truststore</value>
    </property>
    <property>
        <name>es.keystore.location</name> 
        <value>file:///path/to/es/secure/store</value>
    </property>
    ...
</configuration>

一些 Elasticsearch 节点的地址。这些可以是任何节点(或所有节点),只要它们都属于同一个集群。

必须在设置中将身份验证配置为 kerberos

取消令牌不需要 Elasticsearch 服务主体的名称,但在 core-site.xml 中包含该属性对于某些集成(如 Spark)是必需的。

如果您使用的是安全的 Elasticsearch 部署,则应启用 SSL。

本地文件系统上用于访问 SSL 密钥库的位置。

本地文件系统上用于访问 SSL 信任库的位置。

本地文件系统上用于访问 elasticsearch-hadoop 安全存储以进行安全设置 的位置。

使用 Map/Reduce 的 Kerberos编辑

在启动 Map/Reduce 作业之前,您必须将 Elasticsearch 的委托令牌添加到作业的凭据集中。EsMapReduceUtil 实用程序类可以用来为您完成此操作。在将作业提交到集群之前,只需将作业传递给它即可。该实用程序将使用本地 Kerberos 凭据建立与 Elasticsearch 的连接,请求 API 密钥,并将密钥存储在作业的凭据集中,供工作进程使用。

Job job = Job.getInstance(getConf(), "My-Job-Name"); 

// Configure Job Here...

EsMapReduceUtil.initCredentials(job); 

if (!job.waitForCompletion(true)) { 
    return 1;
}

创建新的作业实例

EsMapReduceUtil 获取 Elasticsearch 的作业委托令牌

将作业提交到集群

您可以在作业对象配置期间的任何时间获取作业委托令牌,只要设置了特定于 elasticsearch-hadoop 的配置即可。通常在提交作业之前立即执行此操作就足够了。您应该为每个作业只执行一次此操作,因为每次调用都会浪费地获取另一个 API 密钥。

此外,该实用程序还与 mapred API 类兼容

JobConf jobConf = new JobConf(getConf()); 
jobConf.setJobName("My-Job-Name");

// Configure JobConf Here...

EsMapReduceUtil.initCredentials(jobConf); 

JobClient.runJob(jobConf).waitForCompletion(); 

创建新的作业配置

获取 Elasticsearch 委托令牌

将作业提交到集群

使用 Hive 的 Kerberos编辑

要求编辑

仅使用 HiveServer2 支持在 Elasticsearch 上使用 Kerberos 身份验证。

在 Hive 中使用 Kerberos 身份验证访问 Elasticsearch 之前,必须为 Hadoop 启用 Kerberos 身份验证。在对 Elasticsearch 使用 Kerberos 身份验证之前,请确保您已完成 配置 Hadoop 集群 以及 配置 YARN 服务 所需的所有步骤。

最后,确保已启用 Hive 安全性。

由于 Hive 依赖于 Elasticsearch 中的用户模拟,因此建议您熟悉 Elasticsearch 身份验证授权

为 Hive 配置用户模拟设置编辑

Hive 的安全模型遵循基于代理的方法。当客户端向安全的 Hive 服务器提交查询时,Hive 会使用 Kerberos 对客户端进行身份验证。一旦 Hive 确定了客户端的身份,它就会使用*代理用户*包装自己的身份。代理用户包含客户端的简单用户名,但不包含任何凭据。相反,预计所有交互都将以 Hive 主体模拟客户端用户的身份执行。这就是为什么在配置 Hive 安全性时,必须在 Hadoop 配置中指定 Hive 允许模拟哪些用户

<property>
    <name>hadoop.proxyuser.hive.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.hive.groups</name>
    <value>*</value>
</property>

Elasticsearch 支持用户模拟,但只能模拟来自某些领域实现的用户。大多数 Kerberos 部署都包含其他身份管理组件,例如 LDAPActive Directory。在这些情况下,您可以在 Elasticsearch 中配置这些领域以允许用户模拟。

如果您只使用 Kerberos,或者您使用的解决方案 Elasticsearch 不支持用户模拟,则必须将您的 Kerberos 主体镜像到 Elasticsearch 中的 本机领域文件领域。将 Kerberos 主体镜像到其中一个领域时,请将新用户的用户名设置为主体名称的主要部分,不带任何领域或主机信息。例如,client@REALM 将只是 client,而 someservice/domain.name@REALM 将只是 someservice

您可以按照以下步骤镜像用户

创建最终用户角色编辑

为将查询 Hive 的最终用户创建一个角色。在本例中,我们将为访问与 hive-index-* 匹配的索引创建一个简单的角色。我们所有的 Hive 用户最终都将使用此角色在 Elasticsearch 中读取、写入和更新索引。

PUT _security/role/hive_user_role 
{
  "run_as": [],
  "cluster": ["monitor", "manage_token"], 
  "indices": [
      {
        "names": [ "hive-index-*" ],  
        "privileges": [ "read", "write", "manage" ]
      }
  ]
}

我们的示例角色名称是 hive_user_role

用户应该能够查询基本的集群信息并管理令牌。

我们的用户将能够对索引执行读写和管理操作。

为 Kerberos 用户主体创建角色映射编辑

现在已经创建了用户角色,我们必须将 Kerberos 用户主体映射到该角色。Elasticsearch 不知道 Kerberos 管理的主体的完整列表。因此,希望连接到 Elasticsearch 的每个主体都必须映射到身份验证后将被授予的角色列表。

POST /_security/role_mapping/hive_user_1_mapping
{
  "roles": [ "hive_user_role" ], 
  "enabled": true,
  "rules": {
    "field" : { "username" : "hive.user.1@REALM" } 
  }
}

我们将此映射的角色设置为我们的示例角色 hive_user_role

当用户主体 hive.user.1@REALM 进行身份验证时,它将获得 hive_user_role 的权限。

将用户镜像到本机领域编辑

如果您要部署 LDAPActive Directory 以及 Kerberos,则您可能不必执行此步骤。只要 Kerberos 主体上的简单名称(例如 hive.user.1)与 LDAP 或 Active Directory 中的用户名完全匹配,Elasticsearch 就会通过在这些领域中查找用户名来执行用户模拟。

将用户镜像到本机领域将允许 Elasticsearch 接受来自原始主体的身份验证请求,以及接受来自模拟用户的 Hive 的请求。您可以在本机领域中创建一个用户,如下所示

PUT /_security/user/hive.user.1 
{
  "enabled" : true,
  "password" : "swordfish", 
  "roles" : [ "hive_user_role" ], 
  "metadata" : {
    "principal" : "hive.user.1@REALM" 
  }
}

用户名是 hive.user.1,它是我们要镜像的 hive.user.1@REALM 主体的简单名称格式。

在此处为用户提供密码。理想情况下,这应该是一个安全生成的随机密码,因为此镜像用户仅用于模拟目的。

将用户的角色设置为示例角色 hive_user_role

这不是必需的,但将用户的原始主体设置为元数据可能有助于您自己的簿记。

创建用于模拟 Hive 用户的角色编辑

使用 Kerberos 主体的角色映射和用于模拟的本机用户配置 Elasticsearch 后,您必须创建一个 Hive 将用于模拟这些用户的角色。

PUT _security/role/hive_proxier
{
  "run_as": ["hive.user.1"] 
}

Hive 的代理角色应仅限于以将使用 Hive 的用户的身份运行。

为 Hive 的服务主体创建角色映射编辑

现在有了要模拟的用户以及可以模拟他们的角色,请确保将 Hive 主体映射到代理角色,以及它正在模拟的用户可能拥有的任何角色。这允许 Hive 主体创建和读取索引、文档或执行其模拟用户可能能够执行的任何其他操作。当 Hive 模拟用户时,它必须具有这些角色,否则它将无法完全模拟该用户。

POST /_security/role_mapping/hive_hiveserver2_mapping
{
  "roles": [
    "hive_user_role", 
    "hive_proxier" 
  ],
  "enabled": true,
  "rules": {
    "field" : { "username" : "hive/hiveserver2.address@REALM" } 
  }
}

在这里,我们将角色设置为我们要模拟的用户角色的超集。在我们的示例中,设置了 hive_user_role 角色。

允许 Hive 模拟 Hive 最终用户的角色。

要匹配的 Hive 服务器主体名称。

如果不希望通过 API 管理 Kerberos 角色映射,则可以在 角色映射文件 中管理它们。

运行您的 Hive 查询编辑

配置完所有用户帐户并完成在 Hadoop 和 Hive 中启用 Kerberos 身份验证的所有先前步骤后,创建 Hive 查询应该没有任何区别。

使用 Spark 的 Kerberos编辑

要求编辑

在 elasticsearch-hadoop for Spark 中使用 Kerberos 身份验证有以下要求

  1. 您的 Spark 作业必须部署在 YARN 上。在 elasticsearch-hadoop 中使用 Kerberos 身份验证不支持任何其他 Spark 集群部署(Mesos、Standalone)。
  2. 您的 Spark 版本必须在 2.1.0 或更高版本。Spark 在此版本中添加了插入第三方凭据提供程序以获取委派令牌的功能。

在 Spark 中对 Elasticsearch 使用 Kerberos 身份验证之前,必须为 Hadoop 启用 Kerberos 身份验证。在对 Elasticsearch 使用 Kerberos 身份验证之前,请确保您已完成 配置 Hadoop 集群 以及 配置 YARN 服务 的所有必要步骤。

EsServiceCredentialProvider编辑

在 Spark 将应用程序提交到 YARN 集群之前,它会加载许多凭据提供程序实现,用于确定在应用程序启动之前是否必须获取任何其他凭据。这些实现是使用 Java 的 ServiceLoader 架构加载的。因此,提交 Spark 应用程序时类路径上的任何 jar 都可以提供要加载和使用的实现。EsServiceCredentialProvider 就是这样一种实现,只要 elasticsearch-hadoop 位于作业的类路径上,就会加载它。

加载后,EsServiceCredentialProvider 会确定是否为 elasticsearch-hadoop 启用了 Kerberos 身份验证。如果确定为 elasticsearch-hadoop 启用了 Kerberos 身份验证,则凭据提供程序将自动从 Elasticsearch 获取委派令牌,并将它们添加到 YARN 应用程序提交上下文中的凭据中。此外,如果作业是 Spark Streaming 作业之类的长期进程,则当当前令牌接近其到期时间时,凭据提供程序用于更新或获取新的委派令牌。

加载和调用 Spark 的凭据提供程序的时间取决于提交 Spark 应用程序时的集群部署模式。在 client 部署模式下运行时,Spark 在本地 JVM 中运行用户的驱动程序代码,并根据需要启动 YARN 应用程序来监督处理。每当 YARN 应用程序首次上线时,就会加载和运行提供程序。在 cluster 部署模式下运行时,Spark 会立即启动 YARN 应用程序,并且用户的驱动程序代码是从 YARN 中生成的 Application Master 运行的。提供程序会*立即*加载和运行,在执行任何用户代码之前。

配置凭据提供程序编辑

Spark 凭据提供程序的所有实现都只使用来自少数几个地方的设置

  1. 本地 Hadoop 配置文件中的条目
  2. 本地 Spark 配置文件的条目
  3. 作业最初启动时从命令行指定的条目

不使用从用户代码配置的设置,因为必须为为特定 Spark 应用程序提交的所有作业运行一次提供程序。不能保证在加载提供程序之前运行用户代码。更复杂的是,只为凭据提供程序提供本地 Hadoop 配置,以确定它们是否应该加载委派令牌。

这些限制意味着为 Kerberos 身份验证配置 elasticsearch-hadoop 的设置需要位于特定位置

首先,必须在本地 Hadoop 配置文件中将 es.security.authentication 设置为*kerberos*。如果未在 Hadoop 配置中设置它,则凭据提供程序将假定要使用*simple*身份验证,并且不会获取委派令牌。

其次,必须在 本地 Hadoop 配置文件、本地 Spark 配置文件中或从命令行指定 elasticsearch-hadoop 的所有常规连接设置(如 es.nodeses.ssl.enabled 等)。如果这些设置在此处不可用,则凭据提供程序将无法联系 Elasticsearch 以获取其所需的委派令牌。

$> bin/spark-submit \
    --class org.myproject.MyClass \
    --master yarn \
    --deploy-mode cluster \
    --jars path/to/elasticsearch-hadoop.jar \
    --conf 'spark.es.nodes=es-node-1,es-node-2,es-node-3' 
    --conf 'spark.es.ssl.enabled=true'
    --conf 'spark.es.net.spnego.auth.elasticsearch.principal=HTTP/_HOST@REALM' 
    path/to/jar.jar

在提交时指定的一些连接设置的示例

确保包含 Elasticsearch 服务主体。

在 spark-submit 命令行中指定这么多配置很可能会错过重要设置。因此,建议在 集群范围的 Hadoop 配置 中设置它们。

为流式作业续订凭据编辑

如果您正在运行流式作业,最好使用 cluster 部署模式,以便 YARN 管理运行流式应用程序的驱动程序代码。

由于流式作业预期会持续运行而不会停止,因此您应该配置 Spark,以便凭据提供程序可以在原始令牌过期之前获取新令牌。

配置 Spark 以获取新令牌不同于配置 YARN 以续订和取消令牌。 YARN 只能将现有令牌续订至其最长生存期。 Elasticsearch 的令牌不可续订。相反,它们的生存期为 7 天。 7 天过后,令牌就会过期。为了使正在进行的流式作业能够继续运行而不会中断,必须获取全新的令牌并将其发送到工作任务。 Spark 具有在原始令牌生存期结束后自动获取和分发全新令牌的功能。

在 YARN 上提交 Spark 应用程序时,用户可以向 spark-submit 命令提供主体和密钥表文件。 Spark 将使用这些凭据登录,而不是依赖于当前用户的本地 Kerberos TGT 缓存。如果任何委派令牌即将过期,则在当前令牌完全过期之前,已加载的凭据提供程序将有机会使用给定的主体和密钥表获取新令牌。任何新令牌都会由 Spark 自动分发到 YARN 集群上的容器。

$> bin/spark-submit \
    --class org.myproject.MyClass \
    --master yarn \ 
    --deploy-mode cluster \ 
    --jars path/to/elasticsearch-hadoop.jar \
    --principal client@REALM 
    --keytab path/to/keytab.kt \ 
    path/to/jar.jar

Kerberos 需要 YARN 部署

使用集群部署模式以允许在 YARN Application Master 中运行驱动程序

指定运行作业的主体

将在凭据过期时用于重新进行身份验证的密钥表路径

禁用凭据提供程序编辑

当 elasticsearch-hadoop 位于类路径上时,Spark 始终会加载 EsServiceCredentialProvider。如果在本地 Hadoop 配置中为 elasticsearch-hadoop 启用了 Kerberos 身份验证,则无论该特定作业是否需要 Elasticsearch 的委派令牌,提供程序都将尝试加载它们。

建议您不要将 elasticsearch-hadoop 库添加到未配置为连接或交互 Elasticsearch 的作业中。这是避免不相关的作业因无法连接到 Elasticsearch 而启动失败的最简单方法。

如果您发现自己无法轻松地从不需要与 Elasticsearch 交互的作业的类路径中删除 elasticsearch-hadoop,则可以通过在启动时设置属性来显式禁用凭据提供程序。要设置的属性取决于您的 Spark 版本

  • 对于 Spark 2.3.0 及更高版本:将 spark.security.credentials.elasticsearch.enabled 属性设置为 false
  • 对于 Spark 2.1.0-2.3.0:将 spark.yarn.security.credentials.elasticsearch.enabled 属性设置为 false。 Spark 2.3.0+ 中仍然接受此属性,但已标记为已弃用。