通过在 Amazon EMR 上原生集成 LDAP 简化身份验证 大数据博客

2026-01-27 14:58:56

在 Amazon EMR 上简化与本地 LDAP 集成的身份验证

作者 Stefano Sandona 和 Adnan Hemani日期 2024年2月20日分类 高级、Amazon EMR、最佳实践、技术指南永久链接 简化身份验证与本地 LDAP 集成的 Amazon EMR

关键要点

Amazon EMR 现在支持本地 LDAP 身份验证,使集成 OpenLDAP 和 Active Directory 更加简便。新特性支持自动配置,允许外部工具使用 LDAP 用户名和密码进行连接,并提供更加精细的数据访问控制。本文详细介绍了如何配置和测试 EMR LDAP 身份验证,包括身份验证流程与所需配置的检索。

目前许多公司都将企业身份信息存储在像 Active Directory (AD) 或 OpenLDAP 的身份提供者 (IdP) 中。此前,Amazon EMR 客户可以通过配置 AD 域与 EMR 集群的 Kerberos 领域之间的单向领域信任,来将其集群与 Active Directory 集成。有关更多详情,您可以参考 使用 Active Directory 域配置跨域信任的教程。

这种设置是让企业用户和组可以在 EMR 集群中使用的重要手段,并可以定义访问控制策略以管控数据访问例如,通过 Amazon EMR 原生 Apache Ranger 集成。

尽管这个选项仍然可用,但 Amazon EMR 已推出 本地 LDAP 身份验证支持,这是一项新的安全特性,使与 OpenLDAP 和 Active Directory 的集成更加简化。

本特性支持以下几项功能:

支持应用程序如 HiveServer2、Trino、Presto 和 Livy安全的自动配置,使用 Kerberos 协议并将 LDAP 作为外部身份验证。提供对通过 SSH 访问 EMR 集群的用户的精细访问控制FGAC。若与原生 Amazon EMR Apache Ranger 集成结合使用,则可在 Hive Metastore 数据库和表上实现精细授权政策。

本文将深入探讨 Amazon EMR LDAP 身份验证,展示身份验证流程的工作原理,如何检索和测试所需的 LDAP 配置,以及如何确认 EMR 集群是否正确集成 LDAP。

通过本文的信息:

管理 EMR 集群的团队可以增强与 LDAP IdP 管理员的协调,要求提供必要的信息并进行适当的预配置测试。EMR 集群的终端用户可以了解,与之前基于 Kerberos 的身份验证相比,如何轻松地从外部工具连接到启用 LDAP 的 EMR 集群。

Amazon EMR 的 LDAP 集成是如何工作的

在谈到 EMR 框架的身份验证时,我们可以区分两个层级:

外部身份验证 用户和外部组件用于与已安装框架交互。内部身份验证 框架内部用于验证内部组件的通信。

通过这个新特性,内部框架身份验证仍然通过 Kerberos 管理,但对于使用用户名和密码进行身份验证的最终用户或外部服务是透明的。

支持的 EMR 已安装框架实现了一种基于 LDAP 的身份验证方法,它会根据提供的用户名和密码凭据,对用户进行身份验证。在成功的情况下,允许使用该框架。

以下图表总结了身份验证的工作流程:

工作流程包括以下步骤:

用户通过一个支持的端点例如 HiveServer2、Trino/Presto 协调器或 Hue WebUI连接并提供其企业凭据用户名和密码。被联系的框架使用自定义身份验证器,利用在集群实例中运行的 EMR Secret Agent 服务执行身份验证。EMR Secret Agent 服务根据 LDAP 端点验证提供的凭据。如果成功,将会发生以下情况:为集群 MIT 密钥分发中心KDC中指定用户创建 Kerberos 主体。在主节点的用户主目录中创建 Kerberos 主体 keytab。

身份验证完成后,用户可以开始使用该框架。

免费加速器使用一小时

在所有集群实例中,SSSD 服务被配置为从 LDAP 端点检索用户和组,并将其作为系统用户提供。

通过 SSH 连接的身份验证流程稍有不同,其工作流程总结如下:

工作流程包括以下步骤:

用户通过 SSH 连接到 EMR 主实例,提供企业凭据用户名和密码。SSHD 服务使用 SSSD 服务验证提供的凭据。SSSD 服务根据 LDAP 端点验证提供的凭据。如果成功,用户将被引导到相关的主目录。此时,用户可以使用不同的 CLI如 beeline、trinocli、prestocli、curl访问 Hive、Trino/Presto 或 Livy。使用 Spark CLI如 sparksubmit、pyspark、sparkshell时,用户需要调用 ldapkinit 脚本并提供请求的用户名和密码。身份验证通过在集群实例中运行的 EMR Secret Agent 服务进行。EMR Secret Agent 服务根据 LDAP 端点验证提供的凭据。如果成功,将会发生以下情况:为集群 MIT KDC 中的特定用户创建 Kerberos 主体。在主节点的用户主目录中创建 Kerberos 主体 keytab。获取并存储 Kerberos 票证到用户 Kerberos 票证缓存中。

在 ldapkinit 脚本完成后,用户可以开始使用 Spark CLI。

在接下来的部分中,我们将展示如何检索所需的 LDAP 设置值,以及探索如何启动一个带有 EMR LDAP 身份验证的集群并进行测试。

找到合适的 LDAP 参数

要为 Amazon EMR 配置 LDAP 身份验证,第一步是获取用于设置集群的 LDAP 属性。您需要以下信息:

LDAP 属性描述LDAP 服务器 DNS 名用于指向 LDAP 端的 DNS 名称PEM 格式证书用于通过安全 LDAPLDAPS与 LDAP 端进行交互的证书LDAP 用户搜索基用于从 LDAP 树中搜索用户的路径或分支,此基础路径内的用户将被检索LDAP 群组搜索基用于从 LDAP 树中搜索群组的路径或分支,此基础路径内的群组将被检索LDAP 服务器绑定用户凭据用于触发 LDAP 查询并检索用户信息如用户名和群组成员资格的服务用户的用户名和密码

对于 Active Directory,AD 管理员可以直接从 Active Directory 用户和计算机 工具中检索此信息。当您在此工具中选择一个用户时,可以看到相关属性例如,distinguishedName。以下截图展示了一个示例。

从截图中,我们可以看到用户 John 的 distinguishedName 为 CN=johnOU=usersOU=italyOU=emrDC=awsemrDC=com,这意味着 John 属于以下搜索基,按从狭义到广义的顺序排列:

OU=usersOU=italyOU=emrDC=awsemrDC=comOU=italyOU=emrDC=awsemrDC=comOU=emrDC=awsemrDC=comDC=awsemrDC=com

根据公司 LDAP 目录中的条目数量,使用较宽的搜索基可能导致检索时间较长并超时。配置搜索基尽可能狭窄是一种良好的实践,以确保包含所有需要的用户。在上面的示例中,OU=usersOU=italyOU=emrDC=awsemrDC=com 可能是一个合适的搜索基前提是所有想要访问 EMR 集群的用户都属于该组织单位。

另一种检索用户属性的方法是使用 ldapsearch 工具。此方法可用于 Active Directory 和 OpenLDAP,对于测试与 LDAP 端点的连接非常有用。

以下是一个针对 Active Directory 的示例OpenLDAP 类似。

LDAP 端点应通过 TCP 在端口 636 上可被 Amazon Elastic Compute Cloud (Amazon EC2) EMR 集群实例访问。建议从与 EMR 集群位于同一子网的 Amazon Linux 2 EC2 实例上运行测试,并确保同时与 EMR 集群实例有关联的安全组。

启动 EC2 实例后,安装 nc 工具并测试 DNS 解析及连接。假设 DC1awsemrcom 是 LDAP 端点的 DNS 名称,请运行以下命令:

bashsudo yum install ncnc vz DC1awsemrcom 636

如果 DNS 解析未能正常工作,您应该会收到如下错误:

bashNcat Version 750 ( https//nmaporg/ncat )Ncat Could not resolve hostname DC1awsemrcom Name or service not known QUITTING

如果端点不可访问,您将收到如下错误:

bashNcat Version 750 ( https//nmaporg/ncat )Ncat Connection timed out

通过在 Amazon EMR 上原生集成 LDAP 简化身份验证 大数据博客

在这两种情况下,都需要网络和 DNS 团队介入以进行故障排除并解决问题。

如果一切正常,输出结果应该如下所示:

bashNcat Version 750 ( https//nmaporg/ncat )Ncat Connected to 1001235636Ncat 0 bytes sent 0 bytes received in 001 seconds

如果一切正常,请进行测试并按如下方式安装 openldap 客户端:

bashsudo yum install openldapclients

然后运行 ldapsearch 命令从 LDAP 端点检索用户和群组的信息。以下是示例的 ldapsearch 命令:

bash

定制这六个变量

LDAPSCERTIFICATE=/path/to/ldapscertpemLDAPSENDPOINT=DC1awsemrcomBINDUSER=CN=binduserCN=UsersDC=awsemrDC=comBINDUSERPASSWORD=binduserpasswordSEARCHBASE=DC=awsemrDC=comUSERTOSEARCH=johnFILTER=(sAMAccountName={USERTOSEARCH})INFOTOSEARCH=

搜索用户

LDAPTLSCACERT={LDAPSCERTIFICATE} ldapsearch LLL x H ldaps//{LDAPSENDPOINT} v D {BINDUSER} w {BINDUSERPASSWORD} b {SEARCHBASE} {FILTER} {INFOTOSEARCH}

我们使用的各个参数包含:

x 启用简单身份验证。D 指明进行搜索的用户。w 指明用户密码。H 指明 LDAP 服务器的 URL。b 作为基础搜索。LDAPTLSCACERT 指明 LDAPS 端点 SSL PEM 公共证书或 LDAPS 根证书授权 SSL PEM 公共证书。可以由 AD 或 OpenLDAP 管理员处获得。

以下是上述命令的示例输出:

bashfilter (sAMAccountName=john)requesting dn CN=johnOU=usersOU=italyOU=emrDC=awsemrDC=comobjectClass topobjectClass personobjectClass organizationalPersonobjectClass usercn johngivenName johndistinguishedName CN=johnOU=usersOU=italyOU=emrDC=awsemrDC=commemberOf CN=dataengineersOU=groupsOU=italyOU=emrDC=awsemrDC=com

如我们从样本输出中所见,用户 john 的 distinguishedName 为 CN=johnOU=usersOU=italyOU=emrDC=awsemrDC=com,并且用户所属的 dataengineers 群组memberOf 值被定义为 CN=dataengineersOU=groupsOU=italyOU=emrDC=awsemrDC=com。

我们可以使用更狭窄的搜索基运行我们的 ldapsearch 查询来检索用户和群组信息:

bash

定制这九个变量

LDAPSCERTIFICATE=/path/to/ldapscertpemLDAPSENDPOINT=DC1awsemrcomBINDUSER=CN=binduserCN=UsersDC=awsemrDC=comBINDUSERPASSWORD=binduserpasswordSEARCHBASE=DC=awsemrDC=comUSERSEARCHBASE=OU=usersOU=italyOU=emrDC=awsemrDC=comGROUPSSEARCHBASE=OU=groupsOU=italyOU=emrDC=awsemrDC=comUSERTOSEARCH=johnGROUPTOSEARCH=dataengineers

搜索用户

LDAPTLSCACERT={LDAPSCERTIFICATE} ldapsearch LLL x H ldaps//{LDAPSENDPOINT} v D {BINDUSER} w {BINDUSERPASSWORD} b {USERSEARCHBASE} (sAMAccountName={USERTOSEARCH})

搜索群组

LDAPTLSCACERT={LDAPSCERTIFICATE} ldapsearch LLL x H ldaps//{LDAPSENDPOINT} v D {BINDUSER} w {BINDUSERPASSWORD} b {GROUPSSEARCHBASE} (sAMAccountName={GROUPTOSEARCH})

您还可以在搜索时应用其他过滤器。如需有关如何创建 LDAP 过滤器的更多信息,请参考 LDAP 过滤器。

通过运行 ldapsearch 命令,您可以测试 LDAP 连接性和 LDAP 属性,并决定所需的设置。

测试解决方案

在您确认与 LDAP 端点的连接畅通且 LDAP 配置正确后,请继续设置环境以启动 EMR LDAP 启用集群。

创建 AWS 秘密管理器的秘密

在创建 EMR 安全配置之前,您需要创建两个 AWS Secret Manager 秘密。您将使用这些凭据与 LDAP 端进行交互,以检索用户详细信息,例如用户名和群组成员资格。

在 Secrets Manager 控制台中,在导航窗格中选择 Secrets。选择 Store a new secret。对于 Secret type,选择 Other type of secret。创建一个新的秘密,指定 binduser 的 distinguished name 作为键,将 binduser 密码作为值。

创建第二个秘密,明文指定 LDAPS 端点 SSL 公共证书或 LDAPS 根证书授权公共证书。该证书经过信任,允许 EMR 集群与 LDAPS 端点之间进行安全的通信。

创建 EMR 安全配置

完成

最新文章