在 Amazon EMR 上的 Presto 中使用 LDAP 身份验证 - 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 中的安全位置。有关更多信息,请参阅 https://docs.amazonaws.cn/AmazonS3/latest/user-guide/upload-objects.html 中的Amazon Simple Storage Service 控制台用户指南如何将文件和文件夹上传至 S3 存储桶。您可以创建一个引导操作,以便在集群启动时将该证书从 Amazon S3 复制到集群中的每个节点。在 中步骤 4:创建脚本以复制 LDAP 服务器证书并将其上传到 Amazon S3。示例证书为 s3://MyBucket/ldap_server.crt.

LDAP 服务器的匿名绑定设置

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

请注意PrestoSQL 不需要匿名绑定配置。

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

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

    ldapwhoami -x -H ldaps://LDAPServerHostNameOrIPAddress

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

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

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

  • 从 Linux 客户端使用 ldapwhoami 命令,如以下示例所示。该示例使用虚构的用户。presto,存储在 EC2 实例上运行的 Open LDAP 服务器上,并具有虚构的主机名 ip-xxx-xxx-xxx-xxx.ec2.internal。 用户与组织单位 (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) 和其他域组件 (DCs) 组成的绑定模式。Presto 在密码身份验证期间将 ${USER} 替换为每个用户的实际用户 ID (UID),以匹配此绑定模式指定的可分辨名称 (DN)。您需要合格用户所属的 OUs及其 DCs。例如,要允许 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:设置安全配置

创建启用了传输中加密的安全配置。有关更多信息,请参阅 https://docs.amazonaws.cn/emr/latest/ManagementGuide/emr-create-security-configuration.html 中的Amazon EMR 管理指南创建安全配置。您在设置传输中加密时提供的加密构件用于加密 Presto 节点之间的内部通信。有关更多信息,请参阅为传输中的数据加密提供证书。LDAP 服务器证书用于对到 Presto 服务器的客户端连接进行身份验证。

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

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

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

例 Amazon EMR 使用 PrestoSQL 的 6.1.0 及更高版本

以下示例使用来自 的 LDAP 主机名对 LDAP 服务器步骤 1:收集有关 LDAP 服务器的信息并将服务器证书复制到 Amazon S3进行身份验证以进行绑定。指定了两种用户绑定模式,这表示 LDAP 服务器上的 OU admins 和 OU datascientists 中的用户有资格以用户身份对 PrestoSQL 服务器进行身份验证。绑定模式由冒号 (:) 分隔。

[ { "Classification":"prestosql-config", "Properties":{ "http-server.authentication.type":"PASSWORD" } }, { "Classification":"prestosql-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" } } ]

例 Amazon EMR 5.16.0 和更高版本

以下示例使用来自 的 LDAP 用户 ID 和密码以及 LDAP 主机名对 LDAP 服务器步骤 1:收集有关 LDAP 服务器的信息并将服务器证书复制到 Amazon S3进行身份验证以进行绑定。指定了两种用户绑定模式,这表示 LDAP 服务器上的 OU admins 和 OU datascientists 中的用户有资格以用户身份对 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

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

以下示例脚本使用默认 keystore 密码。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 中的配置分类属性,但也可以指定内联的配置分类。

使用Amazon EMR控制台通过 LDAP 身份验证创建 Presto 集群

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

  2. 依次选择 Create cluster (创建集群)Go to advanced options (转到高级选项)

  3. 选择 Presto 以及 Amazon EMR 要安装的其他应用程序,然后在 Software Configuration (软件配置) 下,选择 Release of Amazon EMR to use (要使用的版本)。仅 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. 配置集群硬件和网络,然后选择下一步

  6. 选择 Bootstrap Actions (引导操作)。对于添加引导操作,请选择自定义操作,然后选择配置并添加

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

  8. 常规选项标签其他选项下面,选择适合您的应用程序的设置,然后选择下一步

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

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

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