为通过 Kerberos 进行身份验证的 HDFS 用户和 SSH 连接配置集群 - Amazon EMR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

为通过 Kerberos 进行身份验证的 HDFS 用户和 SSH 连接配置集群

Amazon EMR 为集群上运行的应用程序创建已通过 Kerberos 身份验证的客户端,例如,hadoop 用户、spark 用户等。您还可以添加已通过使用 Kerberos 的集群过程的身份验证的用户。然后,已通过身份验证的用户可以使用其 Kerberos 凭证连接到集群并使用应用程序。对于用户向集群进行身份验证,需要以下配置:

  • 集群上必须有与 KDC 中 Kerberos 主体匹配的 Linux 账户。Amazon EMR 在与 Active Directory 集成的架构中自动完成此操作。

  • 您必须在主节点上为每位用户创建 HDFS 用户目录,并向目录提供用户权限。

  • 您必须配置 SSH 服务,以在主节点上启用 GSSAPI。此外,用户必须具有启用了 GSSAPI 的 SSH 客户端。

将 Linux 用户和 Kerberos 主体添加到主节点

如果您不使用 Active Directory,则必须在集群主节点上创建 Linux 账户,并将这些 Linux 用户的主体添加到 KDC。这包括主节点的 KDC 中的主体。除了用户主体之外,运行在主节点上的 KDC 需要本地主机的主体。

当架构包含 Active Directory 集成时,如果适用,将自动创建本地 KDC 上的 Linux 用户和委托人。您可以跳过此步骤。有关更多信息,请参阅跨领域信任外部 KDC – 不同集群上的集群 KDC 具有 Active Directory 跨领域信任

重要

当主节点终止时,由于主节点使用临时存储,KDC 和主体数据库都会丢失。如果您为 SSH 连接创建用户,我们建议您使用配置为高可用性的外部 KDC 来建立跨领域信任。或者,如果您使用 Linux 账户为 SSH 连接创建用户,请使用引导操作和脚本自动执行账户创建过程,以便在创建新集群时重复该过程。

在创建之后或者创建集群时提交步骤到集群,这是添加用户和 KDC 委托人的最简单方法。或者,您可以作为默认 hadoop 用户,使用 EC2 密钥对连接到主节点来运行命令。有关更多信息,请参阅使用 SSH 连接到主节点

下面的示例引用集群 ID,将 bash 脚本 configureCluster.sh 提交到已有的集群。该脚本会保存到 Amazon S3 中。

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/configureCluster.sh"]

以下示例演示了 configureCluster.sh 脚本的内容。该脚本还处理创建 HDFS 用户目录和为 SSH 启用 GSSAPI 的过程,这些内容在下面的部分中介绍。

#!/bin/bash #Add a principal to the KDC for the primary node, using the primary node's returned host name sudo kadmin.local -q "ktadd -k /etc/krb5.keytab host/`hostname -f`" #Declare an associative array of user names and passwords to add declare -A arr arr=([lijuan]=pwd1 [marymajor]=pwd2 [richardroe]=pwd3) for i in ${!arr[@]}; do #Assign plain language variables for clarity name=${i} password=${arr[${i}]} # Create a principal for each user in the primary node and require a new password on first logon sudo kadmin.local -q "addprinc -pw $password +needchange $name" #Add hdfs directory for each user hdfs dfs -mkdir /user/$name #Change owner of each user's hdfs directory to that user hdfs dfs -chown $name:$name /user/$name done # Enable GSSAPI authentication for SSH and restart SSH service sudo sed -i 's/^.*GSSAPIAuthentication.*$/GSSAPIAuthentication yes/' /etc/ssh/sshd_config sudo sed -i 's/^.*GSSAPICleanupCredentials.*$/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config sudo systemctl restart sshd

添加用户 HDFS 目录

要允许您的用户登录到集群来运行 Hadoop 任务,您必须为其 Linux 账户添加 HDFS 用户目录,并为每个用户授予对其目录的所有权。

在创建之后或者创建集群时提交步骤到集群,这是创建 HDFS 目录的最简单方法。或者,您可以作为默认 hadoop 用户,使用 EC2 密钥对连接到主节点来运行命令。有关更多信息,请参阅使用 SSH 连接到主节点

下面的示例引用集群 ID,将 bash 脚本 AddHDFSUsers.sh 提交到已有的集群。该脚本会保存到 Amazon S3 中。

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

为 SSH 启用 GSSAPI

对于通过 Kerberos 进行身份验证的用户,要使用 SSH 连接到主节点,SSH 服务必须启用了 GSSAPI 身份验证。要启用 GSSAPI,请从主节点命令行运行以下命令或者使用步骤来将其作为脚本运行。重新配置 SSH 之后,您必须重新启动服务。

sudo sed -i 's/^.*GSSAPIAuthentication.*$/GSSAPIAuthentication yes/' /etc/ssh/sshd_config sudo sed -i 's/^.*GSSAPICleanupCredentials.*$/GSSAPICleanupCredentials yes/' /etc/ssh/sshd_config sudo systemctl restart sshd