Hadoop 文档

General

Common

HDFS

MapReduce

MapReduce REST APIs

YARN

YARN REST APIs

YARN Service

Submarine

Hadoop Compatible File Systems

Auth

Tools

Reference

Configuration

总览

CredentialProvider API是一个SPI框架,用于插入可扩展的凭据提供程序。凭据提供程序用于将敏感令牌,机密和密码的使用与它们的存储和管理详细信息区分开。选择各种存储机制来保护这些凭据的能力使我们能够使此类敏感资产远离明文,不被窥视,并有可能由第三方解决方案进行管理。

本文档旨在描述CredentialProvider API的设计,开箱即用的实现,在何处使用它们以及如何采用它们。

用法

使用概述

让我们快速概述使用凭据提供程序框架来保护hadoop中的密码或其他敏感令牌。

为什么使用它?

对于某些敏感的令牌(例如密码)在群集内的存储和管理方式,某些部署非常敏感。例如,可能存在适当的安全性最佳实践和策略,例如,这些要求永远不要以明文形式存储。可能要求企业部署使用首选的解决方案来管理凭据,我们需要一种方法来为其集成插件。

一般用法模式

如今,Hadoop项目和生态系统中有许多地方可以利用凭证提供程序API,并且这个数目还在继续增长。通常,使用模式由相同的需求和流程组成。

  1. 在提供者特定的商店中供应凭证。可以通过hadoop凭证命令或可能通过提供商特定的管理工具来完成此设置。
  2. 配置凭据提供程序路径属性。提供者路径属性hadoop.security.credential.provider.path是一个逗号分隔的一个或多个凭据提供者URI的列表,在尝试解析凭据别名时会遍历该列表。
    • 可以在core-site.xml或与core-site.xml合并的特定于组件的配置文件中配置此属性。
    • 对于命令行界面(例如DistCp的界面),可以将该属性与hadoop系统属性(“ -D property = value ”)一起添加并动态添加到配置中。
  3. 利用新的Configuration.getPassword方法解析其凭据的功能或组件将自动获得对凭据提供程序API的支持。
    • 通过使用与现有明文密码所使用的相同的属性名称,此机制允许迁移到凭据提供程序,同时为明文提供向后兼容性。
    • 在回退到config中的明文密码之前,会询问整个凭据提供程序路径。
  4. 不使用Hadoop的org.apache.hadoop.conf.Configuration类进行配置或对凭据提供程序有其他内部使用的功能或组件,可以选择使用CredentialProvider API本身。在Configuration.getPassword及其单元测试中可以找到其用法的示例。
供应凭证

示例:ssl.server.keystore.password

hadoop凭证创建ssl.server.keystore.password-值123 \
  -provider localjceks://file/home/lmccay/aws.jceks

别名与用于从Configuration.get()方法获取凭据的配置属性相同。

配置提供者路径

现在,我们需要确保Configuration.getPassword方法在运行时知道此供应的凭据存储。如果没有凭据提供程序路径配置,则Configuration.getPassword()将跳过凭据提供程序API查询。因此,在core-site.xml或您的组件的等效物中配置以下内容非常重要。

<属性>
  <name> hadoop.security.credential.provider.path </ name>
  <value> localjceks://file/home/lmccay/aws.jceks </ value>
  <description>用于询问受保护凭据的路径。</ description>
</ property>

有关提供程序路径的其他几点注意事项:

  1. 该方案用于指示提供者的类型,在上述情况下,localjceks提供者不依赖Hadoop FileSystem API。并且有时需要避免递归依赖。由jceks表示的另一个提供程序确实使用Hadoop FileSystem API,并且可以支持HDFS或其他兼容文件系统中设置的密钥库。第三种提供程序类型是用户类型。该提供程序可以管理存储在证书文件中的证书。
  2. 路径配置接受提供商或凭证存储的逗号分隔路径。该Configuration.getPassword直到它解决了别名或耗尽了列表方式将查询每个提供的,为了。根据运行时对凭据的需求,我们可能需要配置一系列供应商进行检查。

总之,首先,将凭据提供给提供者,然后配置提供者以供功能部件或组件使用,并且通常只能通过使用Configuration.getPassword方法来获取它。

支持的功能
功能\组件 描述 链接
LDAPGroupsMapping LDAPGroupsMapping用于在LDAP中查找给定用户的组。CredentialProvider API用于保护LDAP绑定密码和SSL所需的密码。 LDAP组映射
SSL密码 FileBasedKeyStoresFactory利用凭据提供程序API来解析与SSL相关的密码。 去做
HDFS DFSUtil使用Configuration.getPassword()使用凭据提供程序API和/或回退到存储在ssl-server.xml中的明文值。基于Zookeeper的联盟状态存储和故障转移控制器使用Configuration.getPassword来获取Zookeeper身份验证信息,并提供回退功能以清除文本身份验证信息。 去做
WebAppUtils通过Configuration上名为getPassword的新方法来使用凭据提供程序API。这提供了一种替代方法,可以在保持向后兼容性的同时在ssl-server.xml文件中以明文形式存储密码。基于Zookeeper的资源管理器状态存储使用Configuration.getPassword获取Zookeeper身份验证信息,并提供回退功能以清除文本身份验证信息。 去做
知识管理系统 使用利用Configuration.getPassword读取与SSL相关的凭据的HttpServer2.loadSSLConfiguration。可以通过凭据提供程序和/或从配置中的明文(如果允许)解析它们。 知识管理系统
HttpFS 使用利用Configuration.getPassword读取与SSL相关的凭据的HttpServer2.loadSSLConfiguration。可以通过凭据提供程序和/或从配置中的明文(如果允许)解析它们。 HttpFS服务器设置
AWS
S3A
使用Configuration.getPassword获取S3凭据。可以通过凭据提供程序API或从配置中解析它们,以实现向后兼容。 AWS S3 / S3A的用法
Azure
WASB
使用Configuration.getPassword获取WASB凭据。可以通过凭据提供程序API或从配置中解析它们,以实现向后兼容。 Azure WASB的使用
Azure
ADLS
使用Configuration.getPassword获取ADLS凭据。可以通过凭据提供程序API或从配置中解析它们,以实现向后兼容。 Azure ADLS的使用
Apache
Accumulo
跟踪程序使用trace.password属性对Accumulo进行身份验证并将跟踪保留在跟踪表中。凭据提供程序API用于从提供程序或配置中获取trace.password,以实现向后兼容。 去做
Apache
滑块
向Slider添加了一项功能,以提示用户输入所需的密码,并使用CredentialProvider存储它们,以便以后可由应用程序检索它们。 去做
阿帕奇
蜂巢
通过使用凭据提供程序API,添加了对metastore密码,与SSL相关的密码和JDO字符串密码的保护 去做
Apache
HBase
HBase RESTServer使用新的Configuration.getPassword方法,以便在允许时首先检查凭据提供程序API,然后回退为明文。 去做
阿帕奇·
奥兹(Apache Oozie)
使用凭据提供程序API保护SSL,电子邮件和JDBC密码。 去做
阿帕奇
游侠
使用凭据提供程序API保护数据库密码,信任密码和密钥库密码。 去做

凭证管理

Hadoop的凭据命令

用法:hadoop凭证<subcommand> [选项]

请参见《命令手册》中的命令选项详细信息

凭证命令可以用于向特定凭证存储提供者提供密码或机密。为了明确指示要使用哪个提供者存储,应使用-provider选项。

示例:hadoop凭据创建ssl.server.keystore.password -provider jceks://file/tmp/test.jceks

为了指示特定的提供程序类型和位置,用户必须在core-site.xml中提供hadoop.security.credential.provider.path配置元素,或在每个凭证管理命令上使用命令行选项-provider。该提供程序路径是一个用逗号分隔的URL列表,它指示应查询的提供程序列表的类型和位置。例如,以下路径:user:///,jceks://file/tmp/test.jceks,jceks://hdfs@nn1.example.com/my/path/test.jceks表示当前用户的凭据应该通过用户提供程序咨询该文件,位于/tmp/test.jceks的本地文件是Java Keystore Provider,并且位于HDFS内的文件位于nn1.example.com/my/path/test.jceks还是Java Keystore Provider的商店。

提供者类型

  1. 由提供者URI user:///表示的UserProvider用于从用户的凭据文件中检索凭据。该文件用于存储执行作业和应用程序所需的各种令牌,机密和密码。
  2. JavaKeyStoreProvider,这是由提供者URI表示JCEKS:// SCHEME /路径到密钥库,用于检索在一个文件系统从Java密钥存储文件凭证<SCHEME>底层使用Hadoop的文件系统API允许证书是存储在本地文件系统上或群集存储中。
  3. LocalJavaKeyStoreProvider,这是由提供者URI表示localjceks://文件/路径到密钥库,用于从所必须存储在本地文件系统Java密钥的访问凭证。凭据将需要使用此凭据,从而导致递归依赖于访问HDFS。每当需要您的凭据才能访问HDFS时,我们就不必依赖从HDFS中获取凭据。

将凭据存储在文件系统中时,将应用以下规则:

  • 存储在本地localjceks://文件中的凭证将在配置中的读取过程中加载。要在YARN应用程序中使用,这意味着它们在主机的本地文件系统中的整个群集中必须可见。

  • 可以将使用jceks://提供程序存储的凭据存储在群集文件系统中,并在整个群集中可见,但是不能在需要特定凭据访问的文件系统中看到。

要使用jceks URI 包装文件系统URI,请执行以下步骤:

  1. 取得文件系统URI,例如hdfs:// namenode:9001 / users / alice / secrets.jceks
  2. jceks://放在URL的前面:jceks:// hdfs:// namenode:9001 / users / alice / secrets.jceks
  3. @符号替换第二个://字符串:jceks:// hdfs @ namenode:9001 / users / alice / secrets.jceks

例子

对于本地文件系统,诸如file:///tmp/secrets.jceks之类的路径将变为:jceks://file/tmp/secrets.jceks

路径URI jceks URI
hdfs://namenode.example.org:9001 / user / alice / secret.jceks jceks://hdfs@namenode.example.org:9001 / user / alice / secret.jceks
文件:///tmp/secrets.jceks jceks://文件/tmp/secret.jceks
s3a://container1/secrets/secret.jceks jceks://s3a@container1/secrets/secret.jceks
wasb://account@container/secret.jceks jceks://wasb@account@container/secret.jceks
abfs://account@container/secret.jceks jceks://abfs@account@container/secret.jceks
https:// user:pass@service/secret.jceks?token = aia jceks:// https:// user:pass@service/secret.jceks?token = aia

请注意,为避免无限递归,诸如abfss3aadlswasb之类的文件系统显式排除了存储在其自己文件系统方案中的路径上的密钥库,即使它们存储在使用一组与所查找凭据不同的凭据的容器中也是如此。

例如,您不能使用存储在s3a://shared/secrets/secret.jceks中的凭据来读取容器s3a:// private /的凭据。

密钥库密码

Java中的密钥库通常受密码保护。保护基于密钥库的凭据提供程序的主要方法是操作系统级文件权限以及目标文件系统可能存在的任何其他基于策略的访问保护。尽管密码不是主要的保护来源,但了解所需的机制以及管理这些密码的可用选项非常重要。了解所有需要访问用于保护密钥库的密码以便在运行时使用它们的各方也非常重要。

选件
选项 描述 笔记
默认密码 这是一个密码密码“ none”。 这是一个开源项目中的硬编码密码,因此具有明显的缺点。但是,机械部分将显示它更简单,因此与其他更复杂的选项几乎一样安全。
环境变量 HADOOP_CREDSTORE_PASSWORD 此选项使用环境变量来传达查询在hadoop.security.credential.provider.path配置属性中配置的所有密钥库时应使用的密码。路径中所有基于密钥库的提供程序都需要使用相同的密码进行保护。
密码文件 hadoop.security.credstore.java-keystore-provider.password文件 该选项使用一个在“ hadoop.security.credstore.java-keystore-provider.password-file”配置属性中配置了位置的“边文件” 来传达在查询在其中配置的所有密钥库时应使用的密码。在hadoop.security.credential.provider.path配置属性。
机械学

考虑到所有受保护凭据(mapreduce作业/应用程序)的运行时使用者都需要访问用于保护密钥库提供者的密码,这一点非常重要。可以通过多种方式来传达此密码,上面的“选项”部分对此进行了说明。

密钥库密码 描述 需要同步 清除文字 文件权限
默认密码 硬密码是默认密码。本质上,当对所有基于密钥库的凭据存储使用默认密码时,我们将利用文件权限来保护凭据存储,并且密钥库密码只是持久保存密钥库的形式。 没有 否(已记录)
环境变量 对于需要在基于密钥库的凭据提供程序访问凭据的任何进程的提供程序路径中配置的所有密钥库,必须将HADOOP_CREDSTORE_PASSWORD环境变量设置为自定义密码。对于以逗号分隔的提供程序的整个路径,只有一个env变量。很难知道每个密钥库所需的密码,建议对所有基于密钥库的凭据提供程序使用相同的密码,以避免出现此问题。设置环境变量可能需要从脚本或其他明文存储机制中进行设置。可从各种unix命令获得用于运行进程的环境变量。 没有
密码档案 hadoop.security.credstore.java-keystore-provider.password文件配置属性必须设置为“侧文件”的位置,该文​​件包含可能在提供程序路径中配置的所有密钥库的自定义密码。任何需要从基于密钥库的凭据提供程序访问凭据的进程都需要将此配置属性设置为适当的文件位置。对于以逗号分隔的提供程序的整个路径,只有一个密码文件。很难知道每个密钥库所需的密码,因此建议对所有基于密钥库的凭据提供程序使用相同的密码,以避免出现此问题。密码文件是需要管理的其他文件,将密码以明文形式存储,并且需要设置文件许可权,以便只有需要访问它们的人才能拥有它。

使用默认密码意味着无需与运行时使用者进行其他通信/同步。默认密码是已知的,但文件权限是密钥库的主要保护。

当文件权限受阻时,与“辅助文件”不同,没有标准的工具可以公开受保护的凭据-即使使用已知的密码。Keytool要求的密码为六个字符或更多,并且不知道如何从密钥库中检索一般机密。它也仅限于PKI密钥对。编辑者不会透露存储在密钥库中的秘密,cat更多或任何其他标准工具也不会透露。这就是为什么密钥库提供程序比凭据的“辅助文件”存储更好的原因。

也就是说,使用API​​来编写代码来访问存储在基于密钥库的凭据提供程序中的凭据是很简单的。同样,当使用默认密码时,密码仅是保留密钥库的形式。该唯一的保护是文件权限和OS级别的访问策略。

用户可以决定使用密码“边文件”来自己存储密钥库的密码,这是受支持的。知道这种正确性水平所需的机制确实很重要。

禁用回退到纯文本

Credentials.getPassword()操作回落到配置XML文件中使用的条目,如果没有凭据提供,或者如果密钥无法被发现。

可以通过将配置选项hadoop.security.credential.clear-text-fallbacktrue更改为false来禁用此操作:

<属性>
  <name> hadoop.security.credential.clear-text-fallback </ name>
  <value> false </ value>
  <说明>
    是或否,表示是否退回到存储凭证
    密码为明文形式。默认值是true。此属性仅适用
    当无法从凭证提供者处找到密码时。
  </ description>
</ property>

设置后,必须通过凭据提供程序来提供通过getPassword() API 查找的所有配置选项