Kerberos

编辑

在 6.7 中添加。

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

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

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

Apache Hadoop 的 Elasticsearch 利用 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 服务通常提供在作业提交期间获取委托令牌的机制。然后将这些令牌分发给工作进程,工作进程使用这些令牌代表运行该作业的用户进行身份验证。Apache Hadoop 的 Elasticsearch 获取 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

编辑

Apache Hadoop 的 Elasticsearch 只需要一些设置来配置 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 集群上启动时,它们会将其所有应用程序凭据发送给 Resource Manager 进程,以便将它们分发到容器。Resource Manager 能够续订这些凭据中即将过期的任何令牌,并在作业完成后取消令牌。来自 Elasticsearch 的令牌的默认有效期为 7 天,并且不可续订。最佳做法是配置 YARN,使其能够在运行结束时取消这些令牌,以降低未经授权使用的风险,并减少 Elasticsearch 必须执行的维护它们的簿记量。

为了配置 YARN 以允许它在运行结束时取消 Elasticsearch 令牌,您必须将 elasticsearch-hadoop jar 添加到 Resource Manager 的 classpath 中。您可以通过将 jar 放置在 Resource Manager 的本地文件系统上,并在 YARN_USER_CLASSPATH 环境变量中设置 jar 的路径来完成此操作。添加 jar 后,需要重新启动 Resource Manager。

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

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

以下是一些常见的安全属性,您将需要这些属性才能让 Resource Manager 联系 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 的作业委托令牌

将作业提交到集群

您可以在 Job 对象的配置期间随时获取作业委托令牌,只要设置了您的 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 身份验证。请确保您已完成配置 Hadoop 集群以及配置 YARN 服务所需的所有步骤,然后再将 Kerberos 身份验证用于 Elasticsearch。

最后,请确保已启用 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 用户的角色

编辑

在您配置 Elasticsearch 时,为您的 Kerberos 主体和用于模拟的本地用户创建角色映射后,您必须创建一个 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 查询与之前相比应该没有任何差异。

Kerberos 与 Spark

编辑

要求

编辑

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

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

在 Spark 中使用 Kerberos 身份验证连接 Elasticsearch 之前,必须先为 Hadoop 启用 Kerberos 身份验证。请确保您已完成配置 Hadoop 集群以及配置 YARN 服务所需的所有步骤,然后再将 Kerberos 身份验证用于 Elasticsearch。

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 命令提供 principal 和 keytab 文件。Spark 将使用这些凭证登录,而不是依赖于当前用户的本地 Kerberos TGT 缓存。如果任何委托令牌即将过期,加载的凭证提供程序将有机会在使用给定的 principal 和 keytab 时获取新的令牌,然后当前令牌完全过期。任何新令牌都会由 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 部署

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

指定运行作业的 principal

当凭证过期时,将用于重新认证的 keytab 的路径

禁用凭证提供程序

编辑

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

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

如果你发现自己处于无法轻易从不需要与 Elasticsearch 交互的作业的 classpath 中删除 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+ 中仍然被接受,但被标记为已弃用。