在亚马逊上使用 Presto 的LDAP身份验证 EMR - Amazon EMR

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在亚马逊上使用 Presto 的LDAP身份验证 EMR

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

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

您需要LDAP服务器提供以下部分中的信息和项目来配置LDAP身份验证。

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

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

LDAP服务器证书

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

LDAP服务器的匿名绑定设置

如果在 PrestoDB 上禁用了匿名绑定,则需要具有绑定到服务器权限的帐户的用户 ID UID () 和密码,这样 PrestoDB 服务器才能LDAP建立连接。您可以使用presto-config配置分类中的internal-communication.authentication.ldap.userinternal-communication.authentication.ldap.password属性来指定和密码。UIDAmazon EMR 5.10.0 不支持这些设置,因此当您使用此发行版时,LDAP服务器必须支持匿名绑定。

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

获取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 步:创建具JSON有 Presto 属性的配置 LDAP 中的示例配置包含该账户,但 5.10.0 示例除外,该发行版不支持该账户。如果LDAP服务器使用匿名绑定,请移除internal-communication.authentication.ldap.userinternal-communication.authentication.ldap.password名称/值对。

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

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

注意

使用时 AWS CloudFormation,需要使用 Fn:: Sub 函数才能替换为实际${USER}的用户 ID () UID。有关更多信息,请参阅《AWS CloudFormation 用户指南》 中的 Fn::Sub 主题。

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

步骤 2:设置安全配置

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

第 3 步:创建具JSON有 Presto 属性的配置 LDAP

您可以使用presto-config配置分类来设置 Presto 的属性。LDAP的格式和内容略presto-config有不同,具体取决于亚马逊EMR发布版本和 Presto 安装(PrestoDB 或 Trino)。在本节后面提供了配置差异示例。有关更多信息,请参阅 配置应用程序

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

例 亚马逊 EMR 6.1.0 及更高版本推出 PrestoSQL(Trino)

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

亚马逊 6.4.0 及更高EMR版本使用新名称 Trino 而不是 Presto。SQL如果你使用 Trino,请更换 prestosql-config 在以下配置分类中,使用trino-configprestosql-password-authenticator使用trino-password-authenticator

[ { "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" } } ]
例 亚马逊 EMR 5.16.0 及更高版本

以下示例使用LDAP用户 ID 和密码以及中的LDAP主机名步骤 1:收集有关您的LDAP服务器的信息并将服务器证书复制到 Amazon S3向LDAP服务器进行身份验证以进行绑定。指定了两种用户绑定模式,这表明 admins OU 和LDAP服务器上的 O datascientists U 中的用户有资格以用户身份向 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" } }]
例 亚马逊 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" } }]
例 亚马逊 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://amzn-s3-demo-bucket/LoadLDAPCert.sh.

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

#!/bin/bash aws s3 cp s3://amzn-s3-demo-bucket/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 控制台,然后从侧面导航栏中选择 “切换到旧主机”。有关切换到旧控制台后预期情况的更多信息,请参阅 Using the old console

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

  3. 选择 Prest o 以及其他应用程序供亚马逊EMR安装,然后在 “软件配置” 下,选择EMR要使用的亚马逊版本。LDAP仅亚马逊 EMR 5.10.0 及更高版本支持身份验证。

  4. “编辑软件设置” 下,选择 “JSON从 S3 加载”,输入您在中创建的JSON配置文件在 Amazon S3 中的位置第 3 步:创建具JSON有 Presto 属性的配置 LDAP,然后选择下一步

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

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

  7. 输入引导操作的名称,输入您在中创建的脚本位置步骤 4:创建脚本以复制LDAP服务器证书并将其上传到 Amazon S3,例如 s3://amzn-s3-demo-bucket/L oadLDAPCert .sh,然后选择添加。

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

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

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

要创建带有LDAP身份验证的 Presto 集群,请使用 AWS CLI
  • 使用 aws emr create-cluster 命令。至少,指定 Presto 应用程序,以及在以前步骤中创建的 Presto 配置分类、引导脚本和安全配置。以下示例将配置文件作为文件引用,该JSON文件保存在您运行命令的同一目录中。另一方面,引导脚本必须保存在 Amazon S3 中。下面的示例使用了 s3://amzn-s3-demo-bucket/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://amzn-s3-demo-bucket/LoadLDAPCert.sh" \ --security-configuration MyPrestoLDAPSecCfg --configurations file://MyPrestoConfig.json