Tutorial: Configure a Cross-Realm Trust with an Active Directory Domain - Amazon EMR
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

Tutorial: Configure a Cross-Realm Trust with an Active Directory Domain

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

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

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

有关AmazonEMR支持Kerberos和KDC的更多信息,以及MITKerberos文件的链接,请参阅 Use Kerberos Authentication.

重要

Amazon EMR 不支持使用 AWS Directory Service for Microsoft Active Directory(企业版) 的跨领域信任。

Step 1: Set Up the VPC and Subnet

Step 2: Launch and Install the Active Directory Domain Controller

Step 3: Add User Accounts to the Domain for the EMR Cluster

Step 4: Configure an Incoming Trust on the Active Directory Domain Controller

Step 5: Use a DHCP Option Set to Specify the Active Directory Domain Controller as a VPC DNS Server

Step 6: Launch a Kerberized EMR Cluster

Step 7: Create HDFS Users and Set Permissions on the Cluster for Active Directory User Accounts

Step 1: Set Up the VPC and Subnet

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

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

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

设置 VPC 和子网

  1. 创建带单个公有子网的 Amazon VPC。有关详细信息,请参阅 步骤1: 创建VPCAmazon VPC 入门指南.

    重要

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

  2. 删除分配给 VPC 的默认 DHCP 选项集。有关更多信息,请参阅更改 VPC 以使用 NO 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 域控制器和集群时会使用它们。

Step 2: Launch and Install the Active Directory Domain Controller

  1. 基于 Microsoft Windows Server 2016 Base AMI 启动 EC2 实例。我们推荐 m4.xlarge 或更好的实例类型。有关更多信息,请参阅 https://docs.amazonaws.cn/AWSEC2/latest/WindowsGuide/launch-marketplace-console.htmlAmazon EC2 用户指南(适用于 Windows 实例) 中的启动 AWS Marketplace 实例。

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

  3. 使用 RDP 连接到 EC2 实例。有关更多信息,请参阅 https://docs.amazonaws.cn/AWSEC2/latest/WindowsGuide/connecting_to_windows_instance.htmlAmazon EC2 用户指南(适用于 Windows 实例) 中的连接到您的 Windows 实例。

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

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

Step 3: Add User Accounts to the Domain for the EMR Cluster

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

另外,创建具有将计算机加入域的足够权限的用户账户。在您创建集群时指定此账户。Amazon EMR 使用它将集群实例加入域。在Step 6: Launch a Kerberized EMR Cluster 中指定此账户及其密码。要将计算机加入权限委派给用户账户,我们建议您创建具有加入权限的组,然后将用户分配到该组。有关说明,请参阅 https://docs.amazonaws.cn/directoryservice/latest/admin-guide/directory_join_privileges.htmlAWS Directory Service Administration Guide 中的委派目录加入权限。

Step 4: Configure an Incoming Trust on the Active Directory Domain Controller

下面的示例命令在 Active Directory 中创建信任,这是使用集群专用的 KDC 的单向、传入、不可传递的领域信任。我们用于群集领域的示例是 EC2.INTERNAL。更换 KDC-FQDN公共DNS 列出的名称 Amazon EMR 托管KDC的主节点。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

Step 5: Use a DHCP Option Set to Specify the Active Directory Domain Controller as a VPC DNS Server

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

Step 6: Launch a Kerberized EMR Cluster

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

    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. 使用下面的属性创建集群:

    • Use the --security-configuration option to specify the security configuration that you created. We use MyKerberosConfig in the example.

    • Use the SubnetId property of the --ec2-attributes option to specify the subnet that you created in Step 1: Set Up the VPC and Subnet. We use step1-subnet in the example.

    • Use the AdditionalMasterSecurityGroups and AdditionalSlaveSecurityGroups of the --ec2-attributes option to specify that the security group associated with the AD Domain Controller from Step 2: Launch and Install the Active Directory Domain Controller is associated with the cluster master node as well as core and task nodes. We use sg-012xrlmdomain345 in the example.

    使用 --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

Step 7: Create HDFS Users and Set Permissions on the Cluster for Active Directory User Accounts

在设置与 Active Directory 的信任关系时,Amazon EMR 将在集群上为每个 Active Directory 用户账户创建 Linux 用户。例如,用户登录名称 LiJuan 在ActiveDirectory中,Linux用户帐户为 lijuan。ActiveDirectory用户名可以包含大写字母,但Linux不会使用ActiveDirectory外壳。

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

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

aws emr add-steps --cluster-id ClusterID \ --steps Type=CUSTOM_JAR,Name=CustomJAR,ActionOnFailure=CONTINUE,\ Jar=s3://MyRegion.elasticmapreduce/libs/script-runner/script-runner.jar,Args=["s3://MyBucketPath/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

Active Directory Groups Mapped to Hadoop Groups

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