Amazon EMR
Amazon EMR 版本指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

在 Amazon EMR 上的 Presto 中使用 LDAP 身份验证

可以按照本节中的步骤配置 LDAP。请参阅每个步骤以了解示例以及指向更多信息的链接。

步骤 1:收集有关 LDAP 服务器的信息并将服务器证书复制到 Amazon S3

您需要在下一节中使用这些信息和内容,以便从 LDAP 服务器中配置 LDAP 身份验证。

LDAP 服务器的 IP 地址或主机名

Amazon EMR 主节点上的 Presto 协调器必须能够访问具有指定的 IP 地址或主机名的 LDAP 服务器。默认情况下,Presto 使用 LDAPS 通过端口 636 与 LDAP 服务器通信。如果您的 LDAP 实施需要使用自定义端口,您可以使用 ldap.url 属性(Amazon EMR 5.16.0 或更高版本)或者 authentication.ldap.url(早期版本)指定该端口。将自定义端口替换为 636,如presto-config中的 步骤 3:使用 LDAP 的 Presto 属性创建配置 JSON 配置分类示例所示。确保任何防火墙和安全组允许端口 636(或自定义端口)以及端口 8446(或自定义端口)上的入站和出站流量,端口 8446 用于内部集群通信。

LDAP 服务器证书

您必须将证书文件上传到 Amazon S3 中的安全位置。有关更多信息,请参阅 Amazon Simple Storage Service 控制台用户指南中的如何将文件和文件夹上传至 S3 存储桶。您可以创建一个引导操作,以便在集群启动时将该证书从 Amazon S3 复制到集群中的每个节点。在 步骤 4:创建脚本以复制 LDAP 服务器证书并将其上传到 Amazon S3.示例证书为 s3://MyBucket/ldap_server.crt

LDAP 服务器的匿名绑定设置

如果禁用了匿名绑定,您需要使用有权绑定到 LDAP 服务器的账户的用户 ID (UID) 和密码,以便 Presto 服务器可以建立连接。您可以使用 internal-communication.authentication.ldap.user 配置分类中的 internal-communication.authentication.ldap.passwordpresto-config 属性指定 UID 和密码。Amazon EMR 5.10.0 不支持这些设置,因此,在使用该发行版时,必须在 LDAP 服务器上支持匿名绑定。

获取 LDAP 服务器上的匿名绑定状态

  • 从 Linux 客户端中使用 ldapwhoami 命令,如以下示例所示:

    ldapwhoami -x -H ldaps://LDAPServerHostNameOrIPAddress

    如果不允许匿名绑定,该命令将返回以下内容:

    ldap_bind: Inappropriate authentication (48) additional info: anonymous bind disallowed

验证账户是否具有使用简单身份验证的 LDAP 服务器的权限

  • 从 Linux 客户端中使用 ldapwhoami 命令,如以下示例所示。该示例使用虚构用户 presto,该用户存储在具有 ip-xxx-xxx-xxx-xxx.ec2.internal 虚拟主机名的 EC2 实例上运行的开放 LDAP 服务器中。该用户与组织单位 (OU) admins 关联,密码为 123456

    ldapwhoami -x -w "123456" -D uid=presto,ou=admins,dc=ec2,dc=internal -H ldaps://ip-xxx-xxx-xxx-xxx.ec2.internal

    如果该账户有效并具有相应的权限,该命令将返回:

    dn:uid=presto,ou=admins,dc=ec2,dc=internal

为了清楚起见,步骤 3:使用 LDAP 的 Presto 属性创建配置 JSON 中的示例配置包含该账户,但 5.10.0 示例除外,该发行版不支持该账户。如果 LDAP 服务器使用匿名绑定,请删除 internal-communication.authentication.ldap.userinternal-communication.authentication.ldap.password 名称/值对。

Presto 用户的 LDAP 可分辨名称 (DN)

为 Presto 指定 LDAP 配置时,您可以指定包含 ${USER} 以及组织单位 (OU) 和额外域组件 (DC) 的绑定模式。在密码身份验证期间,Presto 将 ${USER} 替换为每个用户的实际用户 ID (UID),以便与该绑定模式指定的可分辨名称 (DN) 相匹配。您需要使用合格用户所属的 OU 及其 DC。例如,要允许 admins 域上的 corp.example.com OU 中的用户在 Presto 中进行身份验证,您可以将 ${USER},ou=admins,dc=corp,dc=example,dc=com 指定为用户绑定模式。

在使用 Amazon EMR 5.10.0 时,您只能指定一种此类模式。在使用 Amazon EMR 5.11.0 或更高版本时,您可以指定多种模式并以冒号 (:) 分隔。尝试在 Presto 中进行身份验证的用户先与第一种模式进行比较,然后与第二种模式进行比较,依此类推。有关示例,请参阅步骤 3:使用 LDAP 的 Presto 属性创建配置 JSON

步骤 2:设置安全配置

创建一个安全配置并启用传输中加密。有关更多信息,请参阅 Amazon EMR 管理指南中的创建安全配置。在设置传输中加密时提供的加密项目用于加密 Presto 节点之间的内部通信。有关更多信息,请参阅为传输中的数据加密提供证书。LDAP 服务器证书用于对到 Presto 服务器的客户端连接进行身份验证。

步骤 3:使用 LDAP 的 Presto 属性创建配置 JSON

您可以使用 presto-config 配置分类为 LDAP 设置 Presto 属性。presto-config 格式和内容因使用的 Amazon EMR 版本而略有不同。在本节后面提供了配置示例差异。有关更多信息,请参阅 配置应用程序

以下步骤假定您将 JSON 保存到 MyPrestoConfig.json 文件中。如果使用控制台,请将该文件上传到 Amazon S3 中的安全位置,以便在创建集群时引用该文件。如果使用 AWS CLI,您可以在本地引用该文件。

例 Amazon EMR 5.16.0 和更高版本

以下示例使用步骤 1:收集有关 LDAP 服务器的信息并将服务器证书复制到 Amazon S3中的 LDAP 用户 ID 和密码以及 LDAP 主机名,以便在 LDAP 服务器中验证身份以进行绑定。指定了两种用户绑定模式,它指示 LDAP 服务器上的 admins OU 和 datascientists OU 中的用户可以在 Presto 服务器上作为用户进行身份验证。绑定模式由冒号 (:) 分隔。

[{ "Classification": "presto-config", "Properties": { "http-server.authentication.type": "PASSWORD" } }, { "Classification": "presto-password-authenticator", "Properties": { "password-authenticator.name": "ldap", "ldap.url": "ldaps://ip-xxx-xxx-xxx-xxx.ec2.internal:636", "ldap.user-bind-pattern": "uid=${USER},ou=admins,dc=ec2,dc=internal:uid=${USER},ou=datascientists,dc=ec2,dc=internal", "internal-communication.authentication.ldap.user": "presto", "internal-communication.authentication.ldap.password": "123456" } }]

例 Amazon EMR 5.11.0 至 5.15.0

对于这些发行版,presto-config 配置分类的格式略有不同。以下示例指定与上一示例相同的参数。

[{ "Classification": "presto-config", "Properties": { "http-server.authentication.type": "LDAP", "authentication.ldap.url": "ldaps://ip-xxx-xxx-xxx-xxx.ec2.internal:636", "authentication.ldap.user-bind-pattern": "uid=${USER},ou=admins,dc=ec2,dc=internal:uid=${USER},ou=datascientists,dc=ec2,dc=internal", "internal-communication.authentication.ldap.user": "presto", "internal-communication.authentication.ldap.password": "123456" } }]

例 Amazon EMR 5.10.0

Amazon EMR 5.10.0 仅支持匿名绑定,因此,将省略这些条目。此外,只能指定一种绑定模式。

[{ "Classification": "presto-config", "Properties": { "http-server.authentication.type": "LDAP", "authentication.ldap.url": "ldaps://ip-xxx-xxx-xxx-xxx.ec2.internal:636", "ldap.user-bind-pattern": "uid=${USER},ou=prestousers,dc=ec2,dc=internal" } }]

步骤 4:创建脚本以复制 LDAP 服务器证书并将其上传到 Amazon S3

创建一个脚本以将证书文件复制到集群中的每个节点,然后将其添加到密钥存储中。请使用文本编辑器创建脚本,保存该脚本,然后将其上传到 Amazon S3 中。在步骤 5:创建集群中,脚本文件是作为 s3://MyBucket/LoadLDAPCert.sh 引用的。

以下示例脚本使用默认密钥存储密码 changeit。我们建议您在创建集群后连接到主节点,并使用 keytool 命令更改密钥存储密码。

#!/bin/bash aws s3 cp s3://MyBucket/ldap_server.crt . sudo keytool -import -keystore /usr/lib/jvm/jre-1.8.0-openjdk.x86_64/lib/security/cacerts -trustcacerts -alias ldap_server -file ./ldap_server.crt -storepass changeit -noprompt

步骤 5:创建集群

在创建集群时,您可以指定 Presto 以及希望 Amazon EMR 安装的其他应用程序。以下示例还引用 JSON 中的配置分类属性,但也可以指定内联的配置分类。

使用 EMR 管理控制台创建具有 LDAP 身份验证的 Presto 集群

  1. 通过以下网址打开 Amazon EMR 控制台:https://console.amazonaws.cn/elasticmapreduce/

  2. Choose Create cluster, Go to advanced options.

  3. 选择 Presto 以及 Amazon EMR 安装的其他应用程序,然后在 Software Configuration (软件配置) 中选择 Amazon EMR 使用的 Release (版本)。仅 Amazon EMR 5.10.0 和更高版本支持 LDAP 身份验证。

  4. Edit software settings (编辑软件设置) 下,选择 Load JSON from S3 (从 S3 加载 JSON),输入 Amazon S3 上在步骤 3:使用 LDAP 的 Presto 属性创建配置 JSON中创建的 JSON 配置文件的位置,然后选择 Next (下一步)

  5. 配置集群硬件和网络,然后选择Next (下一步)

  6. 选择Bootstrap Actions (引导操作)。对于Add bootstrap action (添加引导操作),请选择Custom action (自定义操作),然后选择Configure and add (配置并添加)

  7. 输入引导操作的Name (名称),输入在步骤 4:创建脚本以复制 LDAP 服务器证书并将其上传到 Amazon S3其中创建的Script location (脚本位置)(如 s3://MyBucket/LoadLDAPCert.sh),然后选择Add (添加)

  8. General Options (常规选项)Tags (标签)Additional Options (其他选项)中,选择适合您的应用程序的设置,然后选择Next (下一步)

  9. 选择Authentication and encryption (身份验证和加密),然后选择您在步骤 2:设置安全配置中创建的Security configuration (安全配置)

  10. 选择适合您的应用程序的其他安全选项,然后选择Create cluster (创建集群)

使用 AWS CLI 创建具有 LDAP 身份验证的 Presto 集群

  • 使用 aws emr create-cluster 命令。至少,指定 Presto 应用程序,以及在以前步骤中创建的 Presto 配置分类、引导脚本和安全配置。以下示例将配置文件作为在运行该命令的同一目录中保存的 JSON 文件引用。另一方面,引导脚本必须保存在 Amazon S3 中。下面的示例使用了 s3://MyBucket/LoadLDAPCert.sh

    注意

    包含了 Linux 行继续符 (\) 以提高可读性。可以在 Linux 命令中删除或使用它们。对于 Windows,请删除它们或将其替换为脱字号 (^)。

    aws emr create-cluster --applications Name=presto --release-label emr-5.16.0 \ --use-default-roles --ec2-attributes KeyName=MyKeyPair,SubnetId=subnet-1234ab5 \ --instance-count 3 --instance-type m5.xlarge --region us-west-2 --name "MyPrestoWithLDAPAuth” \ --bootstrap-actions Name="Distribute LDAP server cert",Path="s3://MyBucket/LoadLDAPCert.sh" \ --security-configuration MyPrestoLDAPSecCfg --configurations file://MyPrestoConfig.json