亚马逊AWS官方博客
使用 Kerberos 身份验证将 Amazon EMR 与 Microsoft Active Directory 集成
本文将指导您完成整个流程,使用 AWS CloudFormation 建立跨领域信任,并将身份验证从 Active Directory 网络扩展到启用了 Kerberos 的 Amazon EMR 集群。建立跨领域信任后,Active Directory 用户可以使用自己的 Active Directory 凭证访问 Amazon EMR 集群,并以自己的身份运行作业。
演练概览
在此示例中,您将构建一个解决方案,使 Active Directory 用户能够无缝访问 Amazon EMR 集群并运行大数据作业。下面是设置此解决方案之前的准备工作:
- AWS 账户
- Amazon EC2 密钥对
- 根据需要提升账户限额(注意:通常不必提升限额。如果您在构建解决方案时遇到限额错误,请参阅 AWS 服务限制文档。)
为了让您更容易上手,我创建了 AWS CloudFormation 模板,可自动为您配置和部署解决方案。设置解决方案涉及以下步骤和资源:
- 创建和配置 Amazon Virtual Private Cloud (Amazon VPC)。
- 启动 Amazon EC2 Windows 实例(Active Directory 域控制器)。
- 为 Kerberos 和跨领域信任创建 Amazon EMR 安全配置。
- 启动启用了 Kerberos 且具有跨领域信任配置的 Amazon EMR 集群。
您可以使用 AWS CloudFormation 模板单独完成每个步骤,也可以通过一个步骤部署整个解决方案。
注意:如果您想手动创建和配置此解决方案的组件,而不使用 AWS CloudFormation,请参阅 Amazon EMR 跨领域文档。
重要提示:本文中使用的 AWS CloudFormation 模板仅可在 us-east-1(弗吉尼亚北部)区域使用。如果不进行修改,则不适用于生产用途。
一步式解决方案部署
如果您不想单独设置每个组件,可以使用单步 AWS CloudFormation 模板。单步模板是一个主模板,使用嵌套堆栈(附加模板)一次性启动和配置解决方案的所有资源。
要将单步模板部署到您的账户中,请选择启动堆栈:
然后,您将转到 AWS CloudFormation 控制台中的创建堆栈向导。默认情况下,此模板在美国东部(弗吉尼亚北部)区域启动。请勿更改为其他区域,因为此模板仅适用于 us-east-1(弗吉尼亚北部)。
在选择模板页面,保留 AWS CloudFormation 模板的默认 URL,然后选择下一步。
在指定详细信息页面,查看模板的参数。为需要输入值的参数提供值(有关更多信息,请参阅下面的参数表)。
该模板提供以下参数。
参数 | 默认值 | 描述 |
域控制器名称 | DC1 | Active Directory 服务器的 NetBIOS(主机名)名称。此名称不得超过 15 个字符。 |
Active Directory 域 | example.com | 林的 root 域的完全限定域名 (FQDN),如 example.com。 |
域 NetBIOS 名称 | EXAMPLE | Windows 早期版本用户的域的 NetBIOS 名称。此名称不得超过 15 个字符。 |
域管理员用户 | CrossRealmAdmin | 添加为域管理员的账户的用户名称。此账户不同于默认的管理员账户。 |
域管理员密码 | 需要输入 | 域管理员用户的密码。必须至少包含 8 个字符,包括字母、数字和符号。 |
密钥对名称 | 需要输入 | 现有密钥对的名称,可让您在实例启动后安全地连接到实例。 |
实例类型 | m4.xlarge | 域控制器和 Amazon EMR 集群的实例类型。 |
允许的 IP 地址 | 10.0.0.0/16 | 可以访问您的集群的 IP 地址。以 CIDR 表示法指定 IP 地址范围(例如,203.0.113.5/32)。默认情况下,只有 VPC CIDR (10.0.0.0/16) 可以访问集群。请务必添加客户端 IP 地址范围,以便使用 SSH 连接到集群。 |
EMR Kerberos 领域 | EC2.INTERNAL | 集群的 Kerberos 领域名称。默认情况下,领域名称是从集群的大写字母 VPC 域名演化而来的(例如,EC2.INTERNAL 是 us-east-1 区域中的默认 VPC 域名)。 |
受信任的 AD 域 | EXAMPLE.COM | 您想信任的 Active Directory (AD) 域。该域与“Active Directory 域”相同。 但是,它必须全部使用大写字母(例如 EXAMPLE.COM)。 |
跨领域信任密码 | 需要输入 | 您想用于跨领域信任的密码。 |
实例计数 | 2 | 集群的实例(核心节点)数量。 |
EMR 应用程序 | Hadoop、Spark、Ganglia、Hive | 要在集群上安装的应用程序的逗号分隔列表。 |
指定模板详细信息后,请选择下一步。在选项页面上,再次选择下一步。在审核页面上,选中我确认,AWS CloudFormation 可能创建具有自定义名称的 IAM 资源复选框,然后选择创建。
完成部署大约需要 45 分钟。堆栈启动完成后,它将返回包含有关已创建资源的信息的输出结果。记下输出结果,并跳转至管理和测试解决方案部分。您可以在 AWS 管理控制台中查看堆栈输出,也可以使用以下 AWS CLI 命令:
单独部署每个组件
本部分介绍如何使用 AWS CloudFormation 模板在解决方案中单独执行每个步骤。
创建和配置 Amazon VPC
为了在 Amazon EMR Kerberos 领域和 Active Directory 域之间建立跨领域信任,您的 Amazon VPC 必须满足以下要求:
- 用于 Amazon EMR 集群的子网必须具有少于 9 位数的 CIDR 数据块(例如 10.0.1.0/24)。
- 必须同时启用 DNS 解析和 DNS 主机名(设置为“是”)。
- 对于 Amazon VPC 中的实例(在下一步中配置),Active Directory 域控制器必须是 DNS 服务器。
要使用 AWS CloudFormation 模板创建和配置具备之前列出的先决条件的 Amazon VPC,请选择启动堆栈:
注意:如果您想手动创建 VPC(而不使用 AWS CloudFormation),请参阅 Amazon EMR 文档中的设置 VPC 和子网。
启动此堆栈将创建以下 AWS 资源:
- 具有 CIDR 数据块 10.0.0.0/16 的 Amazon VPC(名称:CrossRealmVPC)
- 互联网网关(名称:CrossRealmGateway)
- 具有 CIDR 数据块 10.0.1.0/24 的公有子网(名称:CrossRealmSubnet)
- 允许从 VPC 子网入站访问的安全组(名称标签:CrossRealmSecurityGroup)
堆栈启动完成后,它应返回类似于以下内容的输出。
键 | 值示例 | 描述 |
SubnetID | subnet-xxxxxxxx | Active Directory 域控制器和 EMR 集群的子网。 |
SecurityGroup | sg-xxxxxxxx | Active Directory 域控制器的安全组。 |
VPCID | vpc-xxxxxxxx | Active Directory 域控制器和 EMR 集群将在此 VPC 上启动。 |
记下输出结果,以便在下一步中使用。您可以在 AWS 管理控制台中查看堆栈输出,也可以使用以下 AWS CLI 命令:
启动并配置 Active Directory 域控制器
在此步骤中,您将使用 AWS CloudFormation 模板自动启动并配置新的 Active Directory 域控制器和跨领域信任。
注意:有多种方法可以安装和配置 Active Directory 域控制器。如需详细了解如何在不使用 AWS CloudFormation 的情况下手动启动和安装域控制器,请参阅 Amazon EMR 文档中的第 2 步:启动和安装 AD 域控制器。
除了启动和配置 Active Directory 域控制器和跨领域信任之外,此 AWS CloudFormation 模板还会将域控制器设置为 Amazon VPC 的 DNS 服务器(名称服务器)。换言之,该模板会为部署目标 VPC 创建新的 DHCP option-set,并将域控制器的私有 IP 地址设置为该新 DHCP 选项集的名称服务器。
重要提示:不得在具有 Amazon EC2 实例等现有资源的生产 VPC 上使用此模板。当您启动此堆栈时,请务必使用您在创建和配置 Amazon VPC 步骤中创建的新环境和资源(Amazon VPC、子网和安全组)。
要启动此堆栈,请选择启动堆栈:
下表包含有关此模板中可用参数的信息。查看模板的参数并为需要输入值的参数提供值。
参数 | 默认值 | 描述 |
VPC ID | 需要输入 | 在此 VPC 上启动域控制器,例如使用在创建和配置 Amazon VPC 步骤中创建的 VPC。 |
子网 ID | 需要输入 | 用于域控制器的子网,例如使用在创建和配置 Amazon VPC 步骤中创建的子网。 |
安全组 ID | 需要输入 | 域控制器的安全组 (SG),例如使用在创建和配置 Amazon VPC 步骤中创建的 SG。 |
域控制器名称 | DC1 | Active Directory 服务器的 NetBIOS 名称(不超过 15 个字符)。 |
Active Directory 域 | example.com | 林的 root 域的完全限定域名 (FQDN),如 example.com。 |
域 NetBIOS 名称 | EXAMPLE | Windows 早期版本用户的域的 NetBIOS 名称。此名称不得超过 15 个字符。 |
域管理员用户 | CrossRealmAdmin | 添加为域管理员的账户的用户名称。此账户不同于默认的管理员账户。 |
域管理员密码 | 需要输入 | 域管理员用户的密码。必须至少包含 8 个字符,包括字母、数字和符号。 |
密钥对名称 | 需要输入 | 用于启用对域控制器实例的访问权限的现有 EC2 密钥对的名称。 |
实例类型 | m4.xlarge | 域控制器的实例类型。 |
EMR Kerberos 领域 | EC2.INTERNAL | 集群的 Kerberos 领域名称。默认情况下,领域名称是从集群的大写字母 VPC 域名演化而来的(例如,EC2.INTERNAL 是 us-east-1 区域中的默认 VPC 域名)。 |
跨领域信任密码 | 需要输入 | 您想用于跨领域信任的密码。 |
创建此堆栈需要 25–30 分钟。完成后,记下堆栈的输出结果,然后转到下一步:启动启用了 Kerberos 的 EMR 集群。
创建安全配置并启动启用了 Kerberos 的 Amazon EMR 集群
要启动 Kerberized Amazon EMR 集群,您首先必须创建包含跨领域信任配置的安全配置。然后,在启动集群时指定集群特定的 Kerberos 属性。
在此步骤中,您将使用 AWS CloudFormation 启动并配置具有跨领域信任的 Kerberized Amazon EMR 集群。如果您想手动启动和配置启用了 Kerberos 的集群,请参阅 Amazon EMR 文档中的第 6 步:启动 Kerberized EMR 集群。
注意:截至撰写本文时,AWS CloudFormation 尚不支持启动启用了 Kerberos 身份验证的 Amazon EMR 集群。为了解决这一限制,我创建了一个模板,该模板使用 AWS Lambda 支持的自定义资源来启动和配置启用了 Kerberos 的 Amazon EMR 集群。如果您使用此模板,则无需执行其他操作。请注意,模板会创建并调用 AWS Lambda 函数(自定义资源)来启动集群。
要使用 AWS CloudFormation 创建跨领域信任安全配置并启动 Kerberized Amazon EMR 集群,请选择启动堆栈:
下表列出并描述了用于部署 Kerberized Amazon EMR 集群和配置跨领域信任的模板参数。
参数 | 默认值 | 描述 |
Active Directory 域 | example.com | 您想与其建立跨领域信任的 Active Directory 域。 |
域管理员用户(联接用户) | CrossRealmAdmin | 有权将域/计算机加入 Active Directory 域(联接用户)的 Active Directory 域用户的用户名称。 |
域管理员密码 | 需要输入 | 联接用户的密码。 |
跨领域信任密码 | 需要输入 | 您的跨领域信任的密码。 |
EC2 密钥对名称 | 需要输入 | 现有密钥对的名称,可让您在集群启动后安全地连接到集群。 |
子网 ID | 需要输入 | 您想用于 Amazon EMR 集群的子网,例如选择在创建和配置 Amazon VPC 步骤中创建的子网。 |
安全组 ID | 需要输入 | 您想用于 Amazon EMR 集群的安全组,例如选择在创建和配置 Amazon VPC 步骤中创建的安全组。 |
实例类型 | m4.xlarge | 您想用于集群节点的实例类型。 |
实例计数 | 2 | 集群的实例(核心节点)数量。 |
允许的 IP 地址 | 10.0.0.0/16 | 可以访问您的集群的 IP 地址。以 CIDR 表示法指定 IP 地址范围(例如,203.0.113.5/32)。默认情况下,只有 VPC CIDR (10.0.0.0/16) 可以访问集群。请务必添加客户端 IP 地址范围,以便使用 SSH 连接到集群。 |
EMR 应用程序 | Hadoop、Spark、Ganglia、Hive | 您想在集群上安装的应用程序的逗号分隔列表。 |
EMR Kerberos 领域 | EC2.INTERNAL | 集群的 Kerberos 领域名称。默认情况下,领域名称是从集群的大写字母 VPC 域名演化而来的(例如,EC2.INTERNAL 是 us-east-1 区域中的默认 VPC 域名)。 |
受信任的 AD 域 | EXAMPLE.COM | 您想信任的 Active Directory 域。此域名与“AD 域名”相同。 但是,它必须全部使用大写字母(例如 EXAMPLE.COM)。 |
创建此堆栈需要 10–15 分钟。完成后,记下堆栈的输出,然后转到下一部分:管理和测试解决方案。
管理和测试解决方案
现在您已配置并构建了解决方案,可以使用 Active Directory 凭证连接到集群来测试解决方案了。
使用 Active Directory 凭证(单点登录)通过 SSH 连接到集群
启动 Kerberized Amazon EMR 集群后,如果您使用了 AWS CloudFormation 模板并将客户端 IP 地址范围添加到了允许的 IP 地址参数中,您应该能够使用 SSH 客户端和 Active Directory 用户凭证连接到集群。如果您使用 SSH 连接到集群时遇到问题,请检查集群的安全组,确保它允许从客户端的 IP 地址(源)进行入站 SSH 连接(TCP 端口 22)。
以下步骤假定您使用的是 OpenSSH 等客户端。如果您使用的是其他 SSH 应用程序(例如,PuTTY),请参阅应用程序特定的文档。
注意:由于集群是使用跨领域信任配置启动的,因此当您使用 SSH 以域用户的身份连接到它时,不需要使用私钥(.pem 文件)。
要使用 SSH 以 Active Directory 用户身份连接到 Amazon EMR 集群,请运行以下命令。使用您在设置域控制器时创建的域管理员用户替换 ad_user,并使用集群的 URL 替换 master_node_URL(请查看堆栈的输出结果以查找此信息):
如果您的 SSH 客户端配置为使用密钥作为首选身份验证方法,登录可能会失败。如果出现这种情况,您可以将以下选项添加到 SSH 命令,以强制 SSH 连接使用密码身份验证:
域用户使用 SSH 连接到集群后,如果这是用户连接的第一个集群,则会为该用户创建本地主目录。除了创建本地主目录之外,如果您在启动集群时使用了 create-hfs-home-ba.sh 引导操作(如果您使用 AWS CloudFormation 模板启动 Kerberized 集群,则默认情况下已完成),还会自动创建 HDFS 用户主目录。
注意:如果您手动启动了集群,并且未使用 create-hdfs-home-ba.sh 引导操作,则需要为您的用户手动创建 HDFS 用户主目录。
首次使用 SSH 连接到集群时(以域用户的身份),如果您的域用户的 HDFS 主目录已成功创建,您应该会看到以下消息:
在 Kerberized Amazon EMR 集群上运行作业
要在 Kerberized 集群上运行作业,必须先对提交作业的用户进行身份验证。如果您按照上一部分的说明使用 SSH 以 Active Directory 用户的身份连接到集群,则系统应该会自动对用户进行身份验证。
如果运行 klist 命令时返回“未找到凭证缓存”消息,则意味着用户未经过身份验证(用户没有 Kerberos 票证)。您可以随时运行以下命令重新对用户进行身份验证(请确保 Active Directory 域全部使用大写字母):
对用户进行身份验证后,他们可以像在非 Kerberized 集群上一样提交作业。
审计作业
Kerberos 可以提供的另一项优势是,您可以轻松判断哪个用户运行了特定作业。例如,(使用 SSH)连接到具有 Active Directory 用户的 Kerberized 集群,然后提交 SparkPi 示例应用程序:
运行 SparkPi 应用程序后,转至 Amazon EMR 控制台并选择您的集群。然后选择应用程序历史记录选项卡。您可以在此处查看有关应用程序的信息,包括提交作业的用户:
常见问题
尽管很难涵盖所有可能出现的 Kerberos 问题,但本部分将介绍一些可能发生的常见问题以及解决这些问题的方法。
问题 1:您可以成功连接集群并在集群上进行身份验证。但是,每当您尝试运行作业时就会失败,并显示如下所示的错误:
org.apache.hadoop.security.AccessControlException: Permission denied
解决方法:确保已为用户创建 HDFS 主目录,并且该目录具有相应的权限。
问题 2:您可以成功连接到集群,但无法运行任何 Hadoop 或 HDFS 命令。
解决方法:使用 klist 命令确认用户是否经过身份验证并具有有效的 Kerberos 票证。使用 kinit 命令重新验证用户身份。
问题 3:您无法使用 Active Directory 用户凭证连接(使用 SSH)到集群,但可以使用 kinit 手动验证用户。
解决方法:确保 Active Directory 域控制器是集群节点的 DNS 服务器(名称服务器)。
清理
完成并测试此解决方案后,请记得清理资源。如果您使用了 AWS CloudFormation 模板来创建资源,请使用 AWS CloudFormation 控制台或 AWS CLI/开发工具包删除堆栈。删除堆栈还将删除该堆栈创建的资源。
如果其中一个堆栈未删除,请确保该堆栈创建的资源没有依赖项。例如,如果您使用 AWS CloudFormation 部署了 Amazon VPC,然后使用不同的 AWS CloudFormation 堆栈将域控制器部署到该 VPC,则必须先删除域控制器堆栈,然后才能删除 VPC 堆栈。
小结
借助使用 Kerberos 对用户和服务进行身份验证的功能,您不仅能够保障大数据应用程序的安全,还能让您轻松将 Amazon EMR 集群与 Active Directory 环境集成。本文介绍了如何在 Amazon EMR 上使用 Kerberos 来创建单点登录解决方案,以便 Active Directory 域用户可以无缝访问 Amazon EMR 集群并运行大数据应用程序。我们还介绍了如何使用 AWS CloudFormation 自动部署此解决方案。
其他阅读资源
了解如何在 Amazon EMR 上运行 Jupyter Notebook 和 JupyterHub。
关于作者
Bruno Faria 是 AWS 的 EMR 解决方案架构师。 他与我们的客户合作,为他们在 Amazon EMR 上运行复杂应用程序提供架构方面的指导。在业余时间,他喜欢与家人共度时光和学习新的大数据解决方案。