CredentialProvider API是一个SPI框架,用于插入可扩展的凭据提供程序。凭据提供程序用于将敏感令牌,机密和密码的使用与它们的存储和管理详细信息区分开。选择各种存储机制来保护这些凭据的能力使我们能够使此类敏感资产远离明文,不被窥视,并有可能由第三方解决方案进行管理。
本文档旨在描述CredentialProvider API的设计,开箱即用的实现,在何处使用它们以及如何采用它们。
让我们快速概述使用凭据提供程序框架来保护hadoop中的密码或其他敏感令牌。
对于某些敏感的令牌(例如密码)在群集内的存储和管理方式,某些部署非常敏感。例如,可能存在适当的安全性最佳实践和策略,例如,这些要求永远不要以明文形式存储。可能要求企业部署使用首选的解决方案来管理凭据,我们需要一种方法来为其集成插件。
如今,Hadoop项目和生态系统中有许多地方可以利用凭证提供程序API,并且这个数目还在继续增长。通常,使用模式由相同的需求和流程组成。
示例: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>
有关提供程序路径的其他几点注意事项:
总之,首先,将凭据提供给提供者,然后配置提供者以供功能部件或组件使用,并且通常只能通过使用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凭证<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的商店。
将凭据存储在文件系统中时,将应用以下规则:
存储在本地localjceks://文件中的凭证将在配置中的读取过程中加载。要在YARN应用程序中使用,这意味着它们在主机的本地文件系统中的整个群集中必须可见。
可以将使用jceks://提供程序存储的凭据存储在群集文件系统中,并在整个群集中可见,但是不能在需要特定凭据访问的文件系统中看到。
要使用jceks URI 包装文件系统URI,请执行以下步骤:
例子
对于本地文件系统,诸如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 |
请注意,为避免无限递归,诸如abfs,s3a,adls和wasb之类的文件系统显式排除了存储在其自己文件系统方案中的路径上的密钥库,即使它们存储在使用一组与所查找凭据不同的凭据的容器中也是如此。
例如,您不能使用存储在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-fallback从true更改为false来禁用此操作:
<属性> <name> hadoop.security.credential.clear-text-fallback </ name> <value> false </ value> <说明> 是或否,表示是否退回到存储凭证 密码为明文形式。默认值是true。此属性仅适用 当无法从凭证提供者处找到密码时。 </ description> </ property>
设置后,必须通过凭据提供程序来提供通过getPassword() API 查找的所有配置选项。