Hadoop 安全

编辑

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

简单

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

Kerberos

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

主体和密钥表
编辑

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

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

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

$> 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 主体的 primary 部分中选择此用户名。例如,对于 elasticsearch@REALMelasticsearch/hostname@REALM 之类的主体,HDFS 为文件访问检查提取的用户名将为 elasticsearch

存储库插件不对 Elasticsearch 的主体名称做任何假设。Kerberos 主体的 main 部分不需要是 elasticsearch。如果您有更适合您或您组织的主体或服务名称,请随意使用它!