亚马逊AWS官方博客

在 Amazon EMR 中使用 Apache Knox 实现边界安全

Original URL:https://aws.amazon.com/blogs/big-data/implement-perimeter-security-in-emr-using-apache-knox/

边界安全可帮助提升Apache Hadoop 集群的安全性,防止用户从集群外访问过程中带来的威胁。它与 Apache Hadoop 集群的 REST 和 HTTP 交互启用了单个的访问点的方式,简化了客户端与集群的交互。例如,在与启用 Kerberos 的集群上的服务进行交互之前,客户端应用程序必须先使用 Kinit 或 SPNEGO 获取 Kerberos tickets。在本文中,我们将逐步介绍如何设置 Apache Knox 以帮助 Amazon EMR 实现边界安全。

它具有以下优势:

  • 简化各种 Hadoop 服务和 UI 的身份验证
  • 通过充当代理来隐藏特定于服务的 URL/端口
  • 在边界启用 SSL终止
  • 轻松跨多个集群管理已发布的终端节点

概览

Apache Knox

Apache Knox 提供使用 REST API 终端节点网关以访问 Hadoop 集群。它可以通过与企业身份管理解决方案集成,并隐藏EMR集群部署的详细信息,简化客户端与 Hadoop 集群服务的交互。

在本文中,我们运行以下设置:

  • 创建一个 Virtual Private Cloud (VPC)
  • 为 Active Directory 域控制器准备一个Amazon EC2 Windows 实例。
  • 为 Kerberos 和跨领域信任创建 Amazon EMR 安全配置。
  • 在 EMR 主节点上设置 Knox 并启用 LDAP 身份验证

直观地来看,我们要创建以下资源:

图 1:通过 CloudFormation 交付的基础架构

先决条件和假设

在开始之前,必须满足以下先决条件:

重要提示:CloudFormation模板硬编码了用户名和密码,并且开了安全组。如果不进行修改,则不建议用于生产用途。

注意事项:

  • 为了简化网络,使用了单个VPC
  • 为了使用简单,CloudFormation 模板使用了硬编码的用户名和密码,并打开了安全组。

实施步骤

一键部署解决方案

如果您不想单独设置每个组件,可以使用单步 AWS CloudFormation 模板。单步模板是一个主模板,使用嵌套堆栈(附加模板)的方式一次性启动和交付解决方案需要的所有资源。

要使用此解决方案,请单击下面的“Launch Stack”按钮,您会跳转到控制台。请勿更改控制台自动带出来的区域(Region),因为此CloudFormation模板的设计仅适用于 US-EAST-1 区域。

使用此模板,需要填充几个参数,请参阅下表,标有 * 的参数,必须提供,其余参数具有默认值

对于此参数 使用
1 Domain Controller Name DC1
2 Active Directory domain awsknox.com
3 Domain NetBIOS name AWSKNOX(域的 NetBIOS 名称,最多 15 个字符)。
4 Domain admin user 域管理员的账户(awsadmin)
5 Domain admin password * 域管理员用户的密码。至少为八个字符,包含字母、数字和符号(例如 CheckSum123)
6 Key pair name * 访问域控制器的 EC2 密钥对的名称。
7 Instance type 域控制器 EC2 实例的类型。
8 LDAP Bind user name LDAP 绑定用户名。
默认值为:CN=awsadmin,CN=Users,DC=awsknox,DC=com
9 EMR Kerberos realm EMR Kerberos 领域名称。这通常是 VPC 的域名,以大写字母表示,例如:EC2.INTERNAL
10 Cross-realm trust password * 跨领域信任密码,例如:CheckSum123
11 Trusted Active Directory Domain 您想信任的 Active Directory 域。其名称与 Active Directory 相同,但使用大写字母。默认值为“AWSKNOX.COM”
12 Instance type 域控制器 EC2 实例的类型。默认值:m4.xlarge
13 Instance count EMR 集群的核心实例数。默认值:2
14 Allowed IP address 可以访问您的集群的客户端 IP 地址。默认情况下,只有 VPC CIDR (10.0.0.0/16) 可以访问集群。请务必添加客户端 IP 地址范围,以便使用 SSH 连接到集群。
15 EMR applications 要在集群上安装的应用程序的逗号分隔列表。默认情况下,选择“Hadoop”、“Spark”、“Ganglia”、“Hive”和“HBase”
16 LDAP search base LDAP 搜索库:唯一值为:“CN=Users,DC=awshadoop,DC=com”
17 LDAP search attribute 提供 LDAP 用户搜索属性。唯一值为:“sAMAccountName”
18 LDAP user object class 提供 LDAP 用户对象类的值。唯一值为:“person”
19 LDAP group search base 提供 LDAP 组搜索库值。唯一值为:“dc=awshadoop, dc=com”
20 LDAP group object class 提供 LDAP 组对象类。唯一值为“group”
21 LDAP member attribute 提供 LDAP 成员属性。唯一值为“member”
22 EMRLogDir * 存储 EMRLogs 的 Amazon S3 存储桶。以“s3://”作为前缀。
23 S3 Bucket 用于存储构件的 Amazon S3 存储桶。在本例中,所有构件都存储在“aws-bigdata-blog”公有 S3 存储桶中。请勿更改此值。

单独部署每个组件

如果您使用了 CloudFormation单步解决方案 模板,则可以直接从访问集群部分开始。本部分介绍如何使用 AWS CloudFormation 模板在解决方案中单独执行每个步骤。

1.     创建和配置 Amazon VPC

在此步骤中,我们将设置 Amazon VPC、公有子网、互联网网关、路由表和安全组。

为了在 Amazon EMR Kerberos 领域和 Active Directory 域之间建立跨领域信任,您的 Amazon VPC 必须满足以下要求:

  • 用于 Amazon EMR 集群的子网(例如 10.0.1.0/24)。
  • 必须同时启用 DNS 解析和 DNS 主机名(设置为“是”)。
  • 对于 Amazon VPC 中的实例(在下一步中配置),Active Directory 域控制器必须是 DNS 服务器。

要直接通过控制台启动,请选择Launch Stack。

2.     启动并配置 Active Directory 域控制器

在此步骤中,您将使用 AWS CloudFormation 模板自动启动并配置新的 Active Directory 域控制器和跨领域信任。

接下来,启动 Windows EC2 实例,并安装和配置 Active Directory 域控制器。除了启动和配置 Active Directory 域控制器和跨领域信任之外,此 AWS CloudFormation 模板还将域控制器设置为 Amazon VPC 的 DNS 服务器(名称服务器)。

要直接通过控制台启动,请选择Launch Stack。

3.     使用 Apache Knox 启动和配置 EMR 集群

要启动 Kerberized Amazon EMR 集群,我们首先必须创建包含跨领域信任配置的安全配置。有关此内容的更多详细信息,请参阅博文 Use Kerberos Authentication to integerate Amazon EMR with Microsoft Active Directory

除了上述博文中描述的步骤之外,这还向 EMR 集群添加了一个额外步骤,为 Knox 创建 Kerberos 主体。

CloudFormation 脚本还会更新 core-site.xml、hive-site.xml、hcatalog-webchat-site.xml 和 oozie-site.xml 文件中的一些参数。您可以在“create_emr.py”脚本中看到它们。EMR 集群创建之后,它还将运行 shell 脚本作为 EMR 的一个步骤。该 shell 脚本会在 EMR Master上下载并安装 Knox 软件。它还会创建一个名为 emr-cluster-top 的 Knox 拓扑文件。

要直接通过控制台启动,请选择Launch Stack。

访问集群

对 Hadoop 服务的 API 访问

使用 Apache Knox 的主要原因之一是将 Hadoop 集群与用户的直接连接隔离开来。下面,我们将演示如何使用 REST API 调用与通过 Knox 终端节点的多项 Hadoop 服务(如 WebHDFS、WebHCat、Oozie、HBase、Hive 和 Yarn 应用程序)进行交互。可以在 EMR 集群上或 EMR 集群外发起 REST API 调用。在生产环境中,应将 EMR 集群的安全组设置为仅允许 Knox 端口号上的流量,以便阻止其他应用程序的访问。

在本博客中,我们通过使用基于 LDAP的 凭证,通过 SSH 连接到 EMR 集群上的主节点上来进行 EMR 集群上的 REST 调用:

ssh awsadmin@<EMR-Master-Machine-Public-DNS>

将 <EMR-Master-Machine-Public-DNS> 替换为 CloudFormation 输出的 EMR 集群主节点的值。从在上面步骤 3 中部署的堆栈中找到此 CloudFormation 的输出值。

系统会提示您输入“awsadmin”的LDAP 密码。请使用在 CloudFormation 堆栈创建期间选择的密码。

注意:要进行连接,您的客户端计算机的 IP 应处于 CloudFormation 参数中由“Allowed IP address指定的 CIDR 范围内。如果您无法连接到主节点,请检查 EMR 集群主实例的安全组是否具有允许来自客户端的流量的规则定义。如果没有,防火墙可能会阻止您的流量。

演示对 WebHDFS 服务 API 的访问权限:

在本节中,我们将通过 Knox 网关在 WebHDFS 上调用 LISTSTATUS 操作。在我们的设置中,Knox 在端口号 8449 上运行。以下命令将返回 HDFS 根目录的目录列表。

curl -ku awsadmin ‘https://localhost:8449/gateway/emr-cluster-top/webhdfs/v1/?op=LISTSTATUS’

您可以同时使用“localhost”或 EMR 主节点的私有 DNS。

系统会提示您输入之前在CloudFormation模板里面定义的域管理员密码。

演示访问 Resource Manager 服务 API:

Resource Manager REST API 提供有关 Hadoop 集群状态、在集群上运行的应用程序等的信息。我们可以使用以下命令来获取集群信息。

curl -ikv -u awsadmin -X GET ‘https://localhost:8449/gateway/emr-cluster-top/resourcemanager/v1/cluster’

系统会提示您输入之前在CloudFormation模板里面定义的域管理员密码。

演示通过 Apache Knox 使用 Beeline 连接到 Hive:

我们可以使用 Beeline(JDBC 客户端工具)连接到 HiveServer2。我们将演示通过 Knox 连接到 Beeline。

使用以下命令连接到 Hive shell

$hive

使用以下语法从 Beeline 连接到 Hive

!connect jdbc:hive2://<EMR-Master-Machine-Public-DNS>:8449/;transportMode=http;httpPath=gateway/emr-cluster-top/hive;ssl=true;sslTrustStore=/home/knox/knox/data/security/keystores/gateway.jks;trustStorePassword=CheckSum123

注意:您必须使用 EMR 主节点的公有 DNS 名称更新 <EMR-Master-Machine-Public-DNS>。

演示通过 Apache Knox 使用 Apache Livy 提交 Spark 作业

您可以使用以下命令将 Spark 作业提交到 EMR 集群。在此示例中,我们运行 spark-examples.jar 中可用的 SparkPi 程序。

curl -i -k -u awsadmin -X POST --data '{"file": "s3://aws-bigdata-blog/artifacts/aws-blog-emr-knox/spark-examples.jar", "className": "org.apache.spark.examples.SparkPi", "args": ["100"]}' -H "Content-Type: application/json" https://localhost:8449/gateway/emr-cluster-top/livy/v1/batches

您可以同时使用“localhost”或 EMR 主节点的私有 DNS。

安全访问 Hadoop Web UI

除了提供对 Hadoop 集群的 API 访问外,Knox 还为 Hadoop UI 提供代理服务。以下是可用 UI 的表格:

应用程序名称 应用程序 URL
1 Resource Manager https://<EMRClusterURL>:8449/gateway/emr-cluster-top/yarn/
2 Ganglia https://<EMRClusterURL>:8449/gateway/emr-cluster-top/ganglia/
3 Apache HBase https://<EMRClusterURL>:8449/gateway/emr-cluster-top/hbase/webui/master-status
4 WebHDFS https://<EMRClusterURL>:8449/gateway/emr-cluster-top/hdfs/
5 Spark History https://<EMRClusterURL>:8449/gateway/emr-cluster-top/sparkhistory/

在首次访问上述任何 UI 时,您都会看到登录凭证的下拉列表。输入登录用户 awsadmin 以及您之前在CloudFormation模板里面定义的域管理员密码。

现在,您可以像直接连接到集群时那样浏览 UI。以下是 Yarn的:

Yarn UI 中的scheduler information信息:

Ganglia:

Spark History UI:

以及 HBase UI。必须提供“master-status”页面的完整 URL

问题排查

如果与 Apache Knox 交互时出现错误,以下是一些问题排查步骤。

我无法连接到 UI。我没有收到任何错误代码。

  • Apache Knox 可能未运行。请登录到集群的主节点并运行“ps -ef | grep knox”来检查其运行情况。应该有一个正在运行的进程。
ps -ef | grep knox
Knox 114022 1 0 Aug24 ? 00:04:21 /usr/lib/jvm/java/bin/java -Djava.library.path=/home/knox/knox/ext/native -jar /home/knox/knox/bin/gateway.jar

如果进程未在运行,请以 Knox 用户身份 (sudo su – knox) 运行“/home/knox/knox/bin/gateway.sh start”来启动该进程。

  • 您的浏览器可能没有到集群的连接。即使您可以通过 SSH 连接到集群,防火墙规则或安全组规则也可能会阻止运行 Knox 的端口号上的流量。您可以通过构建 SSH 隧道并启用端口转发来通过 SSH 路由流量。

我在访问 UI 时收到 HTTP 400、404 或 503 代码:

  • 请确保您输入的 URL 正确无误。如果输入的路径不正确,则 Knox 将显示 HTTP 404。
  • Apache Knox 中的路由规则存在问题,它不知道如何路由请求。默认情况下,Knox 的日志处于 INFO 级别,可在 /home/knox/knox/logs/ 处获得。如果要更改日志记录级别,请在 /home/knox/knox/conf/gateway-log4j.properties:log4j.logger.org.apache.knox.gateway=INFO 中更改以下行
    #log4j.logger.org.apache.knox.gateway=DEBUGto#log4j.logger.org.apache.knox.gateway=INFO
    log4j.logger.org.apache.knox.gateway=DEBUG 日志将提供更多信息,例如 Knox 如何重写 URL。这有助于了解 Knox 是否正确转换了 URL。您可以使用下面的“ldap”、“knoxcli”和“curl”命令来验证设置是否正确。以“knox”用户身份运行这些命令。
  • 要验证搜索库、搜索属性和搜索类,请运行以下 ldap 命令
    ldapsearch -h <Active-Directory-Domain-Private-IP-Address> -p 389 -x -D 'CN=awsadmin,CN=Users,DC=awsknox,DC=com' -w 'CheckSum123' -b 'CN=Users,DC=awsknox,DC=com' -z 5 '(objectClass=person)' sAMAccountName
  • 使用 Active Directory EC2 实例的私有 IP 地址替换“<Active-Directory-Domain-Private-IP-Address>”。您可以从第二个 CloudFormation 模板的输出中获取此 IP 地址。
  • 要验证服务器主机、端口、用户名和密码的值,请运行以下 ldap 命令。
    ldapwhoami -h <Active-Directory-Domain-Private-IP-Address> -p 389 -x -D 'CN=awsadmin,CN=Users,DC=awsknox,DC=com' -w 'CheckSum123'
  • 使用 Active Directory EC2 实例的私有 IP 地址替换“<Active-Directory-Domain-Private-IP-Address>”。您可以从第二个 CloudFormation 模板的输出中获取此 IP 地址。
  • 它应该显示以下输出:

  • 要验证 System LDAP 绑定是否成功,请运行以下命令:
    /home/knox/knox/bin/knoxcli.sh user-auth-test --cluster emr-cluster-top --u awsadmin --p 'CheckSum123'
  • 这里的“emr-cluster-top”是拓扑文件,它定义了可用的应用程序以及为了服务该应用程序 Knox 应该连接到的终端节点。
  • 命令输出应返回以下输出:

“System LDAP Bind successful!”

  • 要验证 LDAP 身份验证是否成功,请运行以下命令。
    /home/knox/knox/bin/knoxcli.sh user-auth-test --cluster emr-cluster-top --u awsadmin --p 'CheckSum123'
  • 这里的“emr-cluster-top”是我们创建的拓扑文件名。
  • 命令的输出应返回以下输出:

“LDAP authentication successful!”

  • 验证是否可以使用该服务直接访问 WebHDFS
  • 首先,我们必须获得一个有效的 Kerberos TGT,为此,我们必须使用如下所示的 kinit 命令:
    kinit -kt /mnt/var/lib/bigtop_keytabs/knox.keytab knox/<EMR-Master-Machine-Private-DNS>@EC2.INTERNAL
    curl --negotiate -u : http://<EMR-Master-Machine-Private-DNS>:50070/webhdfs/v1/?op=GETHOMEDIRECTORY
  • 例如:EMR-Master-Machine-Private-DNS 以以下格式显示:ip-xx-xx-xx-xx.ec2.internal
  • 它应返回一个包含用户主目录的“Path”变量的 JSON 对象。

清理环境

通过删除 CloudFormation 堆栈以清除为此设置创建的所有资源。如果您使用了嵌套堆栈,则 CloudFormation 会在一项操作中删除所有资源。如果您单独部署模板,请按照与创建相反的顺序删除它们,最后删除 VPC 堆栈。

小结

在本文中,我们介绍了使用 Apache KnoxEMR 集群设置、配置和验证边界安全的过程。这有助于简化对各种 Hadoop 服务的身份验证。在下一篇博文中,我们将向您展示如何集成 Apache Knox 和 Apache Ranger 以启用授权和审计。

敬请随时关注!

 


相关内容

 


 

本篇作者

Varun Rao

Varun Rao 是企业解决方案架构师。他专注于数据策略和安全,与企业客户配合工作,帮助他们完成云转型之旅。在业余时间,他乐于和他 4 岁的孩子玩在一起

 

Mert Hocanin

Mert Hocanin 是 AWS 的大数据架构师,研究领域涵盖多种产品,包括 EMR、Athena 和 Managed Blockchain。在 AWS 任职之前,他曾作为高级软件开发工程师在 Amazon.com 的零售业务部门工作,他建立了一个数据湖,用于处理来自整个公司的大量数据以实现报告目的。在不构建和设计数据湖时,Mert 热衷于旅行和美食

 

Srikanth Kodali

Srikanth Kodali 是Amazon Web Services 的一位高级 IOT 数据分析架构师。他与 AWS 客户配合工作,为构建物联网数据和分析解决方案提供指导和技术协助,帮助客户在使用 AWS 时提高其解决方案的价值。