Kerberos

编辑

在 6.7 版本中添加。

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

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

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

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(如果应使用 Kerberos 身份验证通过 SPNEGO)。
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 身份验证。请确保您已完成 配置 Hadoop 集群配置 YARN 服务 的所有必需步骤,然后再为 Elasticsearch 使用 Kerberos 身份验证。

最后,确保启用了 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 支持用户模拟,但只能模拟来自某些 Realm 实现的用户。大多数 Kerberos 部署都包含其他身份管理组件,例如 LDAPActive Directory。在这些情况下,您可以在 Elasticsearch 中配置这些 Realm 以允许用户模拟。

如果您仅使用 Kerberos,或者您使用 Elasticsearch 不支持用户模拟的解决方案,则必须将您的 Kerberos 主体镜像到 Elasticsearch 中的 本地 Realm文件 Realm。将 Kerberos 主体镜像到这些 Realm 之一时,请将新用户的用户名设置为主体名称的主要部分,不包含任何 Realm 或主机信息。例如,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 的权限。

将用户镜像到本地 Realm

编辑

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

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

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 查询与之前相比应该没有任何区别。

带有 Spark 的 Kerberos

编辑

要求

编辑

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

  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 配置以确定他们是否应该加载委托令牌。

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

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

其次,elasticsearch-hadoop 的所有通用连接设置(如 es.nodeses.ssl.enabled 等)必须在 本地 Hadoop 配置文件、本地 Spark 配置文件或命令行中指定。如果此处无法使用这些设置,则凭据提供程序将无法联系 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 在类路径中时,EsServiceCredentialProvider 将始终由 Spark 加载。如果在本地 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 及更高版本中仍然被接受,但已标记为已弃用。