Amazon EMR
管理指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

配置 Kerberos

按照以下步骤在 Amazon EMR 上设置 Kerberos。

步骤 1:创建启用 Kerberos 的安全配置和可选的跨领域信任配置

您可以使用 Amazon EMR 控制台、AWS CLI 或 EMR API 创建指定 Kerberos 属性的安全配置。安全配置也可以包含其他安全选项,如加密。有关更多信息,请参阅 创建安全配置

当您创建使用 Kerberos 的集群时,您可以指定安全配置以及特定于集群的 Kerberos 属性。您不能指定一组属性而不指定另一组,否则会发生错误。

以下 Kerberos 参数是使用安全配置设置的:

参数 说明

启用 Kerberos

指定对使用此安全配置的群集启用 Kerberos。如果群集使用此安全配置,则群集还必须指定 Kerberos 设置,否则会发生错误。

票证使用期限

指定由群集专用的 KDC 颁发的 Kerberos 票证有效的期间。出于安全考虑,限制票证生命周期。群集应用程序和服务在过期后自动续订票证。使用 Kerberos 凭证通过 SSH 连接到群集的用户在票证过期后需要从主节点命令行运行 kinit 来续订。

跨领域信任

如果您提供了跨领域信任配置,则来自另一个领域的委托人 (通常是用户) 将对使用此配置的群集进行身份验证。还需要其他 Kerberos 领域中的其他配置。有关更多信息,请参阅 配置跨领域信任

领域

指定信任关系中其他领域的 Kerberos 领域名称。可以使用任何字符串,但按照惯例,这通常与域相同,但全部为大写字母。

指定信任关系中其他领域的域名。

管理服务器

指定信任关系的其他领域中的管理服务器的完全限定域名 (FQDN)。管理服务器和 KDC 服务器通常运行在具有相同 FQDN 的同一台计算机上,但通过不同的端口进行通信。如果未指定端口,则使用端口 749,这是 Kerberos 默认值。另外,您还可以指定端口 (例如,domain.example.com:749)。

KDC 服务器

指定信任关系的其他领域中的 KDC 服务器的完全限定域名 (FQDN)。KDC 服务器和管理服务器通常运行在具有相同 FQDN 的同一台计算机上,但通过不同的端口进行通信。如果未指定端口,则使用端口 88,这是 Kerberos 默认值。另外,您还可以指定端口 (例如,domain.example.com:88)。

以下示例演示了具有相同 Kerberos 属性的安全配置。第一个示例说明使用 Amazon EMR 控制台创建的安全配置。第二个示例使用 JSON 文件 (从 AWS CLI 使用 create-security-configuration 命令引用) 创建相同的安全配置。

在此示例中,KDC 和跨领域信任中的管理服务托管在相同的服务器 ad.domain.com 上。使用默认 Kerberos 端口 749 (用于 KDC) 和 88 (用于管理服务器)。如果您的应用程序使用自定义端口,请使用 ad.domain.com:portnumber 形式。

例 使用控制台的示例安全配置与 Kerberos 设置

使用 AWS CLI 的示例安全配置与 Kerberos 设置

下面的 create-security-configuration 命令基于 JSON 文件 MyKerberosSecurityConfig.json (本地保存在运行命令的目录中) 创建一个名为 KerberosSecurityConfig 的安全配置。

aws emr create-security-configuration --name "KerberosSecurityConfiguration" --security-configuration file://MyKerberosSecurityConfig.json

MyKerberosSecurityConfig.json 使用 AuthenticationConfiguration 对象 (如下所示) 指定 Kerberos 设置,此设置对应于上述控制台设置。稍后将在以下示例 create-cluster 命令中引用该安全配置。

{ "AuthenticationConfiguration": { "KerberosConfiguration": { "Provider": "ClusterDedicatedKdc", "ClusterDedicatedKdcConfiguration": { "TicketLifetimeInHours": 24, "CrossRealmTrustConfiguration": { "Realm": "AD.DOMAIN.COM", "Domain": "ad.domain.com", "AdminServer": "ad.domain.com", "KdcServer": "ad.domain.com" } } } } }

步骤 2:配置集群的 Kerberos 属性

在创建集群时,指定特定集群的 Kerberos 属性以及 Kerberos 安全配置。您必须同时指定集群 Kerberos 设置和 Kerberos 安全配置,否则会发生错误。您可以使用 Amazon EMR 控制台、AWS CLI 或 Amazon EMR API。

以下 Kerberos 属性是使用集群配置指定的:

属性 说明

领域

集群的 Kerberos 领域名称。Kerberos 约定是将此项设置为与域名相同,但使用大写字母。例如,对于域 ec2.internal,使用 EC2.INTERNAL 作为领域名称。

KDC 管理员密码

集群中为 kadminkadmin.local 使用的密码。这些是 Kerberos V5 管理系统的命令行接口,该系统保存了集群的 Kerberos 委托人、密码策略和 keytab。

跨领域信任委托人密码 (可选)

在建立跨领域信任时是必需的。跨领域委托人密码,这必须跨领域相同。使用强密码。

AD 域加入用户 (可选)

在与 Active Directory 域建立跨领域信任时是必需的。这是 Active Directory 账户的用户登录名,该账户具有将计算机加入域的足够权限。Amazon EMR 使用此身份将集群加入域。有关更多信息,请参阅 步骤 3:将用户账户添加到 EMR 集群的域中

AD 域加入密码 (可选)

具有足够权限,可将集群加入 Active Directory 域的 Active Directory 用户的密码。有关更多信息,请参阅 步骤 3:将用户账户添加到 EMR 集群的域中

以下示例演示在 Amazon EMR 控制台中指定的和使用 AWS CLI 中的 create-cluster 命令指定的相同配置。

例 示例控制台配置

注意

包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

示例 create-cluster 命令

aws emr create-cluster --name "MyKerberosCluster" \ --release-label emr-5.10.0 \ --instance-type m4.large \ --instance-count 3 \ --use-default-roles \ --ec2-attributes KeyName=MyEC2KeyPair \ --security-configuration KerberosSecurityConfig \ --applications Name=Hadoop Name=Hive Name=Oozie Name=Hue Name=HCatalog Name=Spark \ --kerberos-attributes Realm=EC2.INTERNAL,KdcAdminPassword=MyVeryStrongPassword,\ CrossRealmTrustPrincipalPassword=MyVeryStrongMatchingPassword,\ ADDomainJoinUser=ADUser,ADDomainJoinPassword=MyADUserPassword

步骤 3:添加已通过 Kerberos 身份验证的用户

Amazon EMR 为集群上运行的应用程序创建已通过 Kerberos 身份验证的客户端,例如,Hadoop 用户、Spark 用户等。您还可以添加已通过使用 Kerberos 的集群过程的身份验证的用户。已通过身份验证的用户可以使用其 Kerberos 凭证连接到集群。

您可以通过以下任一方式来添加用户:

  • 配置跨领域信任以对来自不同 Kerberos 领域 (如 Active Directory 目录) 的用户进行身份验证。有关更多信息,请参阅 配置跨领域信任

  • 添加本地集群中的 Linux 账户并为这些账户将委托人添加到集群专用的 KDC 中。有关更多信息,请参阅 配置集群专用的 KDC

    重要

    在主节点终止时,KDC 连同委托人的数据库将会丢失,因为主节点使用短暂存储。如果您为 SSH 连接创建用户,我们建议您建立一个跨领域信任,并为高可用性配置一个外部 KDC。或者,如果您使用 Linux 用户账户为 SSH 连接创建用户,则使用引导操作和脚本自动执行账户创建过程,以便在创建新的群集时可以重复这些步骤。