Hadoop 安全性

编辑

HDFS 仓库插件与 Hadoop 的身份验证模型无缝集成。该插件支持以下身份验证方法

simple

也意味着“无安全性”,默认启用。使用运行 Elasticsearch 的底层操作系统帐户的信息来通知 Hadoop 当前用户的名称。Hadoop 不会尝试验证此信息。

kerberos

通过使用 Kerberos 主体和密钥表向 Hadoop 进行身份验证。与使用 Kerberos 保护的 HDFS 集群交互需要一些额外的步骤来启用(有关更多信息,请参阅主体和密钥表创建安全的仓库

主体和密钥表
编辑

在尝试连接到受保护的 HDFS 集群之前,请配置 Elasticsearch 节点将用于向 Kerberos 进行身份验证的 Kerberos 主体和密钥表。为了获得最大安全性并避免触发 Kerberos 重放保护,您应该为每个节点创建一个服务主体,遵循 elasticsearch/hostname@REALM 模式。

在某些情况下,如果同一主体同时从多个客户端进行身份验证,则服务可能会拒绝这些主体的身份验证,因为假设它们可能是重放攻击。如果您在生产环境中使用多个节点运行该插件,则应该为每个节点使用唯一的服务主体。

在每个 Elasticsearch 节点上,使用名称 krb5.keytab 将相应的密钥表文件放在节点配置位置下的 repository-hdfs 目录中。

$> cd elasticsearch/config
$> ls
elasticsearch.yml  jvm.options        log4j2.properties  repository-hdfs/   scripts/
$> cd repository-hdfs
$> ls
krb5.keytab

请确保您拥有正确的密钥表!如果您为每个节点使用一个服务主体(例如 elasticsearch/hostname@REALM),则每个节点都需要其自己的唯一密钥表文件,用于分配给该主机的委托人!

创建安全的仓库
编辑

密钥表文件就位并且集群启动后,创建安全的 HDFS 仓库很简单。只需在 security.principal 选项下的仓库设置中添加您将进行身份验证的委托人名称即可。

PUT _snapshot/my_hdfs_repository
{
  "type": "hdfs",
  "settings": {
    "uri": "hdfs://namenode:8020/",
    "path": "/user/elasticsearch/repositories/my_hdfs_repository",
    "security.principal": "elasticsearch@REALM"
  }
}

如果您为每个节点使用不同的服务主体,则可以在您的委托人名称中使用 _HOST 模式。Elasticsearch 将在运行时自动将该模式替换为节点的主机名

PUT _snapshot/my_hdfs_repository
{
  "type": "hdfs",
  "settings": {
    "uri": "hdfs://namenode:8020/",
    "path": "/user/elasticsearch/repositories/my_hdfs_repository",
    "security.principal": "elasticsearch/_HOST@REALM"
  }
}
授权
编辑

一旦 Elasticsearch 连接并验证到 HDFS,HDFS 将推断一个用户名,用于授权客户端的文件访问。默认情况下,它从用于向服务进行身份验证的 Kerberos 主体的基本部分中选择此用户名。例如,在 elasticsearch@REALMelasticsearch/hostname@REALM 等委托人的情况下,HDFS 为文件访问检查提取的用户名将是 elasticsearch

仓库插件不假设 Elasticsearch 的主体名称是什么。Kerberos 主体的主要片段不需要是 elasticsearch。如果您有更适合您或您组织的委托人或服务名称,请随意使用它!