本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
教程:配置与 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 通过亚马逊 EMR 进行身份验证。
重要
Amazon EMR 不支持使用 AWS Directory Service for Microsoft Active Directory 的跨领域信任。
步骤 2:启动并安装 Active Directory 域控制器
步骤 4:在 Active Directory 域控制器上配置传入信任
步骤 5:使用 DHCP 选项集指定 Active Directory 域控制器作为 VPC DNS 服务器
步骤 7:创建 HDFS 用户并在集群上为 Active Directory 账户设置权限
步骤 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 和子网
-
创建带单个公有子网的 Amazon VPC。有关更多信息,请参阅《Amazon VPC 入门指南》中的步骤 1:创建 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 个字符的限制,并且将截断较长的名称,这可能会导致不可预测的错误。
-
删除分配给 VPC 的默认 DHCP 选项集。有关更多信息,请参阅更改 VPC 以使用 Noo DHCP 选项。稍后,添加一个指定 Active Directory 域控制器作为 DNS 服务器的新 DHCP 选项集。
-
确认已为 VPC 启用了 DNS 支持,也就是说,同时启用了 DNS 主机名和 DNS 解析。默认处于启用状态。有关更多信息,请参阅更新您的 VPC 的 DNS 支持。
-
确认您的 VPC 已附加 Internet 网关,这是默认设置。有关更多信息,请参阅创建并附加 Internet 网关。
注意
此示例中使用 Internet 网关是因为您将为 VPC 建立新的域控制器。您的应用程序可能不需要 Internet 网关。唯一的要求是,集群专用的 KDC 可以访问 Active Directory 域控制器。
-
创建自定义路由表,添加目标为 Internet 网关的路由,然后将其附加到您的子网。有关更多信息,请参阅创建自定义路由表。
-
在您启动域控制器的 EC2 实例时,它必须具有静态公有 IPv4 地址,您才能使用 RDP 连接到它。执行此操作的最简单方法是将您的子网配置为自动分配公有 IPv4 地址。这不是创建子网时的默认设置。有关更多信息,请参阅修改子网的公有 IPv4 寻址属性。也可以选择在启动实例时分配地址。有关更多信息,请参阅在实例启动期间分配公有 IPv4 地址。
-
完成后,记下您的 VPC 和子网 ID。稍后,您在启动 Active Directory 域控制器和集群时会使用它们。
步骤 2:启动并安装 Active Directory 域控制器
-
基于 Microsoft Windows Server 2016 Base AMI 启动 EC2 实例。我们推荐 m4.xlarge 或更好的实例类型。有关更多信息,请参阅《适用于 Windows 实例的 Amazon EC2 用户指南》中的启动 AWS Marketplace 实例。
-
记下与 EC2 实例关联的安全组的组 ID。您将在 步骤 6:启动使用 Kerberos 的 EMR 集群中需要它。我们使用
sg-012xrlmdomain345
。或者,您可以为 EMR 集群指定不同的安全组,并指定允许安全组之间流量的此实例。有关更多信息,请参阅《适用于 Linux 实例Amazon EC2 用户指南》 中的适用于 Linux 实例的 Amazon EC2 安全组。 -
使用 RDP 连接到 EC2 实例。有关更多信息,请参阅《适用于 Windows 实例的 Amazon EC2 用户指南》中的连接您的 Windows 实例。
-
启动 Server Manager (服务器管理器) 以在服务器上安装并配置 Active Directory 域服务角色。将服务器提升为域控制器并分配域名 (我们在此处使用的示例是
)。请记下该域名,因为稍后您创建 EMR 安全配置和集群时会需要它。如果您并不熟悉如何设置 Active Directory,可以按照如何在 Windows Server 2016 中设置 Active Directory(AD)ad.domain.com
中的说明操作。 在您完成后,实例会重新启动。
步骤 3:将账户添加到 EMR 集群的域中
RDP 到 Active Directory 域控制器,在 Active Directory 用户和计算机中为每个群集用户创建帐户。有关更多信息,请参阅在 Active Directory 用户和计算机中创建用户帐户
此外,还要创建一个具有足够权限的帐户,以便将计算机加入域。在您创建集群时指定此账户。Amazon EMR 使用它将集群实例加入域。在步骤 6:启动使用 Kerberos 的 EMR 集群 中指定此账户及其密码。要将计算机加入权限委托给帐户,我们建议您创建一个具有加入权限的群组,然后将该用户分配到该群组。有关说明,请参阅《AWS Directory Service 管理指南》中的委派目录加入权限。
步骤 4:在 Active Directory 域控制器上配置传入信任
下面的示例命令在 Active Directory 中创建信任,这是使用集群专用的 KDC 的单向、传入、不可传递的领域信任。我们对集群的领域使用的示例为
。更换EC2.INTERNAL
KDC-FQDN
随着公有 DNS列出了托管 KDC 的 Amazon EMR 主节点的名称。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 trustEC2.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 中)或
(对于其它区域)。对于域名服务器,您必须将 Active Directory 域控制器的 IP 地址(必须可以从群集访问)指定为第一个条目,然后是AmazonProvidedDNS(例如,region
.compute.internalxx.xx.xx.xx.xx
,AmazonProvidedDNS)。有关更多信息,请参阅更改 DHCP 选项集。
步骤 6:启动使用 Kerberos 的 EMR 集群
-
在 Amazon EMR 中创建安全配置,指定您在之前的步骤中创建的 Active Directory 域控制器。下面显示了一个示例命令。将域
替换为您在步骤 2:启动并安装 Active Directory 域控制器 中指定的域的名称。ad.domain.com
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
" } } } } }' -
使用下面的属性创建集群:
-
使用
--security-configuration
选项指定您创建的安全配置。我们使用MyKerberosConfig
在示例中。 -
使用
--ec2-attributes option
的SubnetId
属性来指定您在 步骤 1:设置 VPC 和子网 中创建的子网。在本例中我们使用step1-subnet
。 -
使用
AdditionalMasterSecurityGroups
和AdditionalSlaveSecurityGroups
的--ec2-attributes
选项来指定与 AD 域控制器关联的安全组来自于步骤 2:启动并安装 Active Directory 域控制器与群集主节点以及核心和任务节点相关联。在本例中我们使用sg-012xrlmdomain345
。
使用
--kerberos-attributes
指定以下特定于集群的 Kerberos 属性:-
您在设置 Active Directory 域控制器时指定的集群的领域。
-
您在
passwordt
中指定为 步骤 4:在 Active Directory 域控制器上配置传入信任 的跨领域信任委托人密码。 -
KdcAdminPassword
,可用于管理集群专用的 KDC。 -
您在步骤 3:将账户添加到 EMR 集群的域中中创建的具有计算机加入权限的 Active Directory 账户的用户登录名和密码。
以下示例启动使用 Kerberos 的集群。
aws emr create-cluster --name "
MyKerberosCluster
" \ --release-label emr-5.10.0 \ --instance-typem5.xlarge
\ --instance-count3
\ --ec2-attributes InstanceProfile=EMR_EC2_DefaultRole
,KeyName=MyEC2KeyPair
,\ SubnetId=step1-subnet
, AdditionalMasterSecurityGroups=sg-012xrlmdomain345
, AdditionalSlaveSecurityGroups=sg-012xrlmdomain345
\ --service-role EMR_DefaultRole \ --security-configurationMyKerberosConfig
\ --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:创建 HDFS 用户并在集群上为 Active Directory 账户设置权限
在与 Active Directory 建立信任关系时,Amazon EMR 会在集群上为每个活动目录账户创建 Linux 用户。例如,用户登录名LiJuan
活动目录中有一个 Linux 账户为lijuan
。Active Directory 用户名可以包含大写字母,但 Linux 不区分 Active Directory 大小写。
要允许您的用户登录集群运行 Hadoop 作业,您必须为他们的 Linux 账户添加 HDFS 用户目录,并授予每个用户对其目录的所有权。为此,我们建议您运行以集群步骤的形式保存到 Amazon S3 的脚本。或者,您可以从主节点上的命令行运行以下脚本中的命令。使用您在创建集群时指定的 EC2 密钥对,以 Hadoop 用户的身份通过 SSH 连接到主节点。有关更多信息,请参阅使用 EC2 密钥对获取 SSH 证书。
运行以下命令来将步骤添加到运行脚本 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
),通过指定一个或多个用户名来查看其它用户的组映射。有关更多信息,请参阅 Apache HDFS 命令指南lijuan