教程:配置与 Active Directory 域的跨领域信任 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

教程:配置与 Active Directory 域的跨领域信任

在您设置跨领域信任时,允许来自不同 Kerberos 领域的委托人 (通常为用户) 对 EMR 集群上的应用程序组件进行身份验证。集群专用的密钥分发中心(KDC)与另一个 KDC 建立信任关系时所使用的是这两个 KDC 中都存在的跨领域委托人。委托人名称和密码精确匹配。

跨领域信任要求 KDC 可以通过网络相互访问并解析对方的域名。下面提供了与作为 EC2 实例运行的 Microsoft AD 域控制器建立跨领域信任关系的步骤,以及提供所需连接和域名解析的示例网络设置。任何允许 KDC 之间所需网络流量的网络设置均可以接受。

(可选)在使用一个集群上的 KDC 建立与 Active Directory 的跨领域信任之后,您可以使用不同安全配置创建另一个集群,引用第一个集群上的 KDC 作为外部 KDC。有关示例安全配置和集群设置,请参阅外部集群 KDC 与 Active Directory 跨领域信任

有关 Kerberos 和 KDC 的 Amazon EMR 支持的更多信息以及指向 MIT Kerberos 文档的链接,请参阅使用 Kerberos 通过 Amazon EMR 进行身份验证

重要

Amazon EMR 不支持使用 Amazon Directory Service for Microsoft Active Directory 的跨领域信任。

步骤 1:设置 VPC 和子网

步骤 2:启动并安装 Active Directory 域控制器

步骤 3:将用户账户添加到 EMR 集群的域中

步骤 4:在 Active Directory 域控制器上配置传入信任

步骤 5:使用 DHCP 选项集指定 Active Directory 域控制器作为 VPC DNS 服务器

步骤 6:启动使用 Kerberos 的 EMR 集群

步骤 7:在集群上为 Active Directory 账户创建 HDFS 用户并设置权限

步骤 1:设置 VPC 和子网

以下步骤演示如何创建 VPC 和子网,以便集群专用的 KDC 可以访问 Active Directory 域控制器并解析其域名。在这些步骤中,通过引用 Active Directory 域控制器作为 DHCP 选项集中的域名服务器来提供域名解析。有关更多信息,请参阅步骤 5:使用 DHCP 选项集指定 Active Directory 域控制器作为 VPC DNS 服务器

KDC 和 Active Directory 域控制器必须能够解析对方的域名。这样,Amazon EMR 才能将计算机加入域并自动在集群实例上配置相应 Linux 账户和 SSH 参数。

如果 Amazon EMR 无法解析域名,您可以使用 Active Directory 域控制器的 IP 地址来引用信任。但是,您必须手动添加 Linux 账户、将相应主体添加到集群专用的 KDC 并配置 SSH。

设置 VPC 和子网
  1. 创建带单个公有子网的 Amazon VPC。有关更多信息,请参阅《Amazon VPC 入门指南》中的步骤 1:创建 VPC

    重要

    当您使用 Microsoft Active Directory 域控制器时,请为 EMR 集群选择 CIDR 块,以便所有 IPv4 地址的长度少于 9 个字符 (例如,10.0.0.0/16)。这是因为在计算机加入 Active Directory 目录时使用了集群计算机的 DNS 名称。Amazon 基于 IPv4 地址分配 DNS 主机名,较长的 IP 地址可能导致 DNS 名称超过 15 个字符。在注册已加入的计算机名称时,Active Directory 具有 15 个字符的限制,并且将截断较长的名称,这可能会导致不可预测的错误。

  2. 删除分配给 VPC 的默认 DHCP 选项集。有关更多信息,请参阅更改 VPC 以使用 Noo DHCP 选项。稍后,添加一个指定 Active Directory 域控制器作为 DNS 服务器的新 DHCP 选项集。

  3. 确认已为 VPC 启用了 DNS 支持,也就是说,同时启用了 DNS 主机名和 DNS 解析。默认处于启用状态。有关更多信息,请参阅更新您的 VPC 的 DNS 支持

  4. 确认您的 VPC 已附加 Internet 网关,这是默认设置。有关更多信息,请参阅创建并附加 Internet 网关

    注意

    此示例中使用 Internet 网关是因为您将为 VPC 建立新的域控制器。您的应用程序可能不需要 Internet 网关。唯一的要求是,集群专用的 KDC 可以访问 Active Directory 域控制器。

  5. 创建自定义路由表,添加目标为 Internet 网关的路由,然后将其附加到您的子网。有关更多信息,请参阅创建自定义路由表

  6. 在您启动域控制器的 EC2 实例时,它必须具有静态公有 IPv4 地址,您才能使用 RDP 连接到它。执行此操作的最简单方法是将您的子网配置为自动分配公有 IPv4 地址。这不是创建子网时的默认设置。有关更多信息,请参阅修改子网的公有 IPv4 寻址属性。也可以选择在启动实例时分配地址。有关更多信息,请参阅在实例启动期间分配公有 IPv4 地址

  7. 完成后,记下您的 VPC 和子网 ID。稍后,您在启动 Active Directory 域控制器和集群时会使用它们。

步骤 2:启动并安装 Active Directory 域控制器

  1. 基于 Microsoft Windows Server 2016 Base AMI 启动 EC2 实例。我们推荐 m4.xlarge 或更好的实例类型。有关更多信息,请参阅《适用于 Windows 实例的 Amazon EC2 用户指南》中的启动 Amazon Web Services Marketplace 实例

  2. 记下与 EC2 实例关联的安全组的组 ID。您将在 步骤 6:启动使用 Kerberos 的 EMR 集群中需要它。我们使用 sg-012xrlmdomain345。或者,您可以为 EMR 集群指定不同的安全组,并指定允许安全组之间流量的此实例。有关更多信息,请参阅《适用于 Linux 实例Amazon EC2 用户指南》 中的适用于 Linux 实例的 Amazon EC2 安全组

  3. 使用 RDP 连接到 EC2 实例。有关更多信息,请参阅《适用于 Windows 实例的 Amazon EC2 用户指南》中的连接您的 Windows 实例

  4. 启动 Server Manager (服务器管理器) 以在服务器上安装并配置 Active Directory 域服务角色。将服务器提升为域控制器并分配域名 (我们在此处使用的示例是 ad.domain.com)。请记下该域名,因为稍后您创建 EMR 安全配置和集群时会需要它。如果您并不熟悉如何设置 Active Directory,可以按照如何在 Windows Server 2016 中设置 Active Directory(AD)中的说明操作。

    在您完成后,实例会重新启动。

步骤 3:将用户账户添加到 EMR 集群的域中

使用 RDP 连接到 Active Directory 域控制器以在 Active Directory 用户和计算机中为每个集群用户创建账户。有关更多信息,请参阅 Microsoft Learn 网站上的在 Active Directory 用户和计算机中创建用户帐户。请记下每个用户的 User logon name (用户登录名)。稍后,在您配置集群时会需要这些信息。

另外,创建具有将计算机加入域的足够权限的账户。在您创建集群时指定此账户。Amazon EMR 使用它将集群实例加入域。在步骤 6:启动使用 Kerberos 的 EMR 集群 中指定此账户及其密码。要将计算机加入权限委派给账户,我们建议您创建具有加入权限的组,然后将用户分配到该组。有关说明,请参阅《Amazon Directory Service 管理指南》中的委派目录加入权限

步骤 4:在 Active Directory 域控制器上配置传入信任

下面的示例命令在 Active Directory 中创建信任,这是使用集群专用的 KDC 的单向、传入、不可传递的领域信任。我们对集群的领域使用的示例为 EC2.INTERNAL。将 KDC-FQDN 替换为托管 KDC 的 Amazon EMR 主节点上列出的 公有 DNS 名称。passwordt 参数指定 cross-realm principal password (跨领域委托人密码),您在创建集群时指定了它以及集群 realm (领域)。领域名称派生自 us-east-1 中集群的默认域名。Domain 是您正在创建信任的 Active Directory 域,按照惯例,它是小写的。此示例使用 ad.domain.com

使用管理员权限打开 Windows 命令提示符并键入以下命令,在 Active Directory 域控制器上创建信任关系:

C:\Users\Administrator> ksetup /addkdc EC2.INTERNAL KDC-FQDN C:\Users\Administrator> netdom trust EC2.INTERNAL /Domain:ad.domain.com /add /realm /passwordt:MyVeryStrongPassword C:\Users\Administrator> ksetup /SetEncTypeAttr EC2.INTERNAL AES256-CTS-HMAC-SHA1-96

步骤 5:使用 DHCP 选项集指定 Active Directory 域控制器作为 VPC DNS 服务器

现在已配置 Active Directory 域控制器,您必须配置 VPC 以使用它作为您的 VPC 内的域名服务器来解析名称。为此,请附加 DHCP 选项集。指定 Domain name (域名) 作为您的集群的域名,例如,ec2.internal(如果您的集群位于 us-east-1 中)或 region.compute.internal(对于其它区域)。对于 Domain name servers,您必须将 Active Directory 域控制器的 IP 地址 (必须可从集群访问) 指定为第一个条目,后跟 AmazonProvidedDNS (例如,xx.xx.xx.xx,AmazonProvidedDNS)。有关更多信息,请参阅更改 DHCP 选项集

步骤 6:启动使用 Kerberos 的 EMR 集群

  1. 在 Amazon EMR 中创建安全配置,指定您在之前的步骤中创建的 Active Directory 域控制器。下面显示了一个示例命令。将域 ad.domain.com 替换为您在步骤 2:启动并安装 Active Directory 域控制器 中指定的域的名称。

    aws emr create-security-configuration --name MyKerberosConfig \ --security-configuration '{ "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. 使用下面的属性创建集群:

    • 使用 --security-configuration 选项指定您创建的安全配置。在本例中我们使用 MyKerberosConfig

    • 使用 --ec2-attributes optionSubnetId 属性来指定您在 步骤 1:设置 VPC 和子网 中创建的子网。在本例中我们使用 step1-subnet

    • 使用 AdditionalMasterSecurityGroups 选项的 AdditionalSlaveSecurityGroups--ec2-attributes,指定与步骤 2:启动并安装 Active Directory 域控制器中的 AD 域控制器关联的安全组与集群主节点以及核心节点和任务节点相关联。在本例中我们使用 sg-012xrlmdomain345

    使用 --kerberos-attributes 指定以下特定于集群的 Kerberos 属性:

    以下示例启动使用 Kerberos 的集群。

    aws emr create-cluster --name "MyKerberosCluster" \ --release-label emr-5.10.0 \ --instance-type m5.xlarge \ --instance-count 3 \ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole,KeyName=MyEC2KeyPair,\ SubnetId=step1-subnet, AdditionalMasterSecurityGroups=sg-012xrlmdomain345, AdditionalSlaveSecurityGroups=sg-012xrlmdomain345\ --service-role EMR_DefaultRole \ --security-configuration MyKerberosConfig \ --applications Name=Hadoop Name=Hive Name=Oozie Name=Hue Name=HCatalog Name=Spark \ --kerberos-attributes Realm=EC2.INTERNAL,\ KdcAdminPassword=MyClusterKDCAdminPwd,\ ADDomainJoinUser=ADUserLogonName,ADDomainJoinPassword=ADUserPassword,\ CrossRealmTrustPrincipalPassword=MatchADTrustPwd

步骤 7:在集群上为 Active Directory 账户创建 HDFS 用户并设置权限

在设置与 Active Directory 的信任关系时,Amazon EMR 将在集群上为每个 Active Directory 账户创建 Linux 用户。例如,Active Directory 中的用户登录名 LiJuan 具有 Linux 账户 lijuan。Active Directory 用户名可以包含大写字母,但 Linux 不区分 Active Directory 大小写。

要允许您的用户登录到集群来运行 Hadoop 任务,您必须为其 Linux 账户添加 HDFS 用户目录,并为每个用户授予对其目录的所有权。为此,我们建议您运行以集群步骤的形式保存到 Amazon S3 的脚本。或者,您也可以从主节点上的命令行运行以下脚本中的命令。使用您在创建集群时指定的 EC2 密钥对以 Hadoop 用户身份通过 SSH 连接到主节点。有关更多信息,请参阅对 SSH 凭证使用 EC2 密钥对

运行以下命令来将步骤添加到运行脚本 AddHDFSUsers.sh 的集群中。

aws emr add-steps --cluster-id <j-2AL4XXXXXX5T9> \ --steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\ Jar=s3://region.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://DOC-EXAMPLE-BUCKET/AddHDFSUsers.sh"]

文件 AddHDFSUsers.sh 的内容如下所示。

#!/bin/bash # AddHDFSUsers.sh script # Initialize an array of user names from AD or Linux users and KDC principals created manually on the cluster ADUSERS=("lijuan" "marymajor" "richardroe" "myusername") # For each user listed, create an HDFS user directory # and change ownership to the user for username in ${ADUSERS[@]}; do hdfs dfs -mkdir /user/$username hdfs dfs -chown $username:$username /user/$username done

映射到 Hadoop 组的 Active Directory 组

Amazon EMR 使用 System Security Services Daemon(SSD)将 Active Directory 组映射到 Hadoop 组。要确认组映射,在您按通过 SSH 连接使用 Kerberos 的集群中所述登录到主节点后,可以使用 hdfs groups 命令确认您的 Active Directory 账户所属的 Active Directory 组是否已映射到集群上相应 Hadoop 用户的 Hadoop 组。您还可以使用命令 (例如 hdfs groups lijuan),通过指定一个或多个用户名来查看其它用户的组映射。有关更多信息,请参阅 Apache HDFS 命令指南中的