LDAP 身份验证

Presto 可以配置为为客户端(如 Presto CLI 或 JDBC 和 ODBC 驱动程序)启用前端 LDAP 身份验证(通过 HTTPS)。目前只支持涉及用户名和密码的简单 LDAP 身份验证机制。Presto 客户端将用户名和密码发送到协调器,协调器使用外部 LDAP 服务验证这些凭据。

要为 Presto 启用 LDAP 身份验证,需要对 Presto 协调器进行配置更改。工作器配置不需要任何更改;只有从客户端到协调器的通信会被验证。但是,如果您想使用 SSL/TLS 来保护 Presto 节点之间的通信,请配置 安全内部通信

Presto 服务器配置

环境配置

安全 LDAP

Presto 需要安全 LDAP (LDAPS),因此请确保您的 LDAP 服务器上启用了 TLS。

Presto 协调器上的 TLS 配置

您需要将 LDAP 服务器的 TLS 证书导入到 Presto 协调器的默认 Java 信任库中,以保护 TLS 连接。您可以使用以下示例 keytool 命令将证书 ldap_server.crt 导入到协调器上的信任库中。

$ keytool -import -keystore <JAVA_HOME>/jre/lib/security/cacerts -trustcacerts -alias ldap_server -file ldap_server.crt

除此之外,访问 Presto 协调器也应该通过 HTTPS 进行。您可以通过在协调器上创建一个 用于 TLS 的 Java 密钥库文件 来实现这一点。

Presto 协调器节点配置

在将 Presto 协调器配置为使用 LDAP 身份验证和 HTTPS 之前,您必须对环境进行以下更改。

您还需要修改 Presto 配置文件。LDAP 身份验证是在协调器上进行配置的,分为两个部分。第一部分是在协调器的 config.properties 文件中启用 HTTPS 支持和密码身份验证。第二部分是将 LDAP 配置为密码验证器插件。

服务器配置属性

以下是需要添加到协调器的 config.properties 文件中的必需属性示例

http-server.authentication.type=PASSWORD

http-server.https.enabled=true
http-server.https.port=8443

http-server.https.keystore.path=/etc/presto_keystore.jks
http-server.https.keystore.key=keystore_password

属性

描述

http-server.authentication.type

为 Presto 协调器启用密码身份验证。必须设置为 PASSWORD

http-server.https.enabled

为 Presto 协调器启用 HTTPS 访问。应设置为 true。默认值为 false

http-server.https.port

HTTPS 服务器端口。

http-server.https.keystore.path

将用于保护 TLS 的 Java 密钥库文件的路径。

http-server.https.keystore.key

密钥库的密码。这必须与您创建密钥库时指定的密码匹配。

http-server.authentication.allow-forwarded-https

启用将通过 HTTP 转发的 HTTPS 请求视为安全。要求在转发请求中将 X-Forwarded-Proto 标头设置为 https。默认值为 false

密码验证器配置

密码身份验证需要配置为使用 LDAP。在协调器上创建一个 etc/password-authenticator.properties 文件。示例

password-authenticator.name=ldap
ldap.url=ldaps://ldap-server:636
ldap.user-bind-pattern=<Refer below for usage>

属性

描述

ldap.url

LDAP 服务器的 URL。URL 方案必须为 ldaps://,因为 Presto 只允许安全 LDAP。

ldap.user-bind-pattern

此属性可用于指定用于密码身份验证的 LDAP 用户绑定字符串。此属性必须包含模式 ${USER},该模式将在密码身份验证期间被实际用户名替换。示例:${USER}@corp.example.com

根据 LDAP 服务器实现类型,属性 ldap.user-bind-pattern 可以按如下所述使用。

活动目录
ldap.user-bind-pattern=${USER}@<domain_name_of_the_server>

示例

ldap.user-bind-pattern=${USER}@corp.example.com
OpenLDAP
ldap.user-bind-pattern=uid=${USER},<distinguished_name_of_the_user>

示例

ldap.user-bind-pattern=uid=${USER},OU=America,DC=corp,DC=example,DC=com

基于 LDAP 组成员资格的授权

您可以通过设置可选的 ldap.group-auth-patternldap.user-base-dn 属性(除了基本的 LDAP 身份验证属性之外),进一步限制允许连接到 Presto 协调器的用户集,这些属性基于其组成员资格。

属性

描述

ldap.user-base-dn

尝试连接到服务器的用户的基本 LDAP 可区分名称。示例:OU=America,DC=corp,DC=example,DC=com

ldap.group-auth-pattern

此属性用于指定 LDAP 组成员资格授权的 LDAP 查询。此查询将针对 LDAP 服务器执行,如果成功,则用户将被授权。此属性必须包含模式 ${USER},该模式将在组授权搜索查询中被实际用户名替换。请参阅下面的示例。

根据 LDAP 服务器实现类型,属性 ldap.group-auth-pattern 可以按如下所述使用。

活动目录
ldap.group-auth-pattern=(&(objectClass=<objectclass_of_user>)(sAMAccountName=${USER})(memberof=<dn_of_the_authorized_group>))

示例

ldap.group-auth-pattern=(&(objectClass=person)(sAMAccountName=${USER})(memberof=CN=AuthorizedGroup,OU=Asia,DC=corp,DC=example,DC=com))
OpenLDAP
ldap.group-auth-pattern=(&(objectClass=<objectclass_of_user>)(uid=${USER})(memberof=<dn_of_the_authorized_group>))

示例

ldap.group-auth-pattern=(&(objectClass=inetOrgPerson)(uid=${USER})(memberof=CN=AuthorizedGroup,OU=Asia,DC=corp,DC=example,DC=com))

对于 OpenLDAP,要使此查询起作用,请确保您启用了 memberOf 覆盖层

您也可以将此属性用于您希望基于复杂的组授权搜索查询来授权用户的场景。例如,如果您想授权属于多个组中的任何一个组的用户(在 OpenLDAP 中),则可以将此属性设置为如下所示

ldap.group-auth-pattern=(&(|(memberOf=CN=normal_group,DC=corp,DC=com)(memberOf=CN=another_group,DC=com))(objectClass=inetOrgPerson)(uid=${USER}))

Presto CLI

环境配置

TLS 配置

在使用 LDAP 身份验证时,访问 Presto 协调器应该通过 HTTPS 进行。Presto CLI 可以使用 Java 密钥库 文件或 Java 信任库 来进行 TLS 配置。

如果您使用的是密钥库文件,则可以将其复制到客户端机器上并用于其 TLS 配置。如果您使用的是信任库,则可以使用默认的 Java 信任库或在 CLI 上创建自定义信任库。我们不建议在生产环境中使用自签名证书。

Presto CLI 执行

除了连接到不需要 LDAP 身份验证的 Presto 协调器时所需的选项外,使用启用了 LDAP 支持的 CLI 调用还需要一些额外的命令行选项。您可以使用 --keystore-*--truststore-* 属性来保护 TLS 连接。调用 CLI 的最简单方法是使用包装器脚本。

#!/bin/bash

./presto \
--server https://presto-coordinator.example.com:8443 \
--keystore-path /tmp/presto.jks \
--keystore-password password \
--truststore-path /tmp/presto_truststore.jks \
--truststore-password password \
--catalog <catalog> \
--schema <schema> \
--user <LDAP user> \
--password

选项

描述

--server

Presto 协调器的地址和端口。端口必须设置为 Presto 协调器监听 HTTPS 连接的端口。Presto CLI 不支持在使用 LDAP 身份验证时使用 http 方案的 URL。

--keystore-path

将用于保护 TLS 的 Java 密钥库文件的路径。

--keystore-password

密钥库的密码。这必须与您创建密钥库时指定的密码匹配。

--truststore-path

用于保护 TLS 的 Java 信任库文件的路径。

--truststore-password

信任库的密码。这必须与创建信任库时指定的密码匹配。

--user

LDAP 用户名。对于 Active Directory,这应该是您的 sAMAccountName,对于 OpenLDAP,这应该是用户的 uid。这是将用于替换 config.properties 中指定的属性中的 ${USER} 占位符模式的用户名。

--password

提示输入 user 的密码。

故障排除

Java 密钥库文件验证

使用 Java 密钥库文件验证 验证密钥库文件的密码并查看其内容。

Presto CLI 的 SSL 调试

如果您在运行 Presto CLI 时遇到任何与 SSL 相关的错误,可以使用 -Djavax.net.debug=ssl 参数以调试模式运行 CLI。您应该使用 Presto CLI 可执行 jar 文件来启用此功能。例如

java -Djavax.net.debug=ssl \
-jar \
presto-cli-<version>-executable.jar \
--server https://coordinator:8443 \
<other_cli_arguments>

常见的 SSL 错误

java.security.cert.CertificateException: No subject alternative names present

当 Presto 协调器的证书无效且不包含您在 CLI 的 --server 参数中提供的 IP 时,会看到此错误。您需要使用添加的适当 SAN 重新生成协调器的 SSL 证书。

https:// 在 URL 中使用 IP 地址而不是协调器证书中包含的域,并且证书不包含将匹配的 IP 地址作为备用属性的 SAN 参数时,需要向此证书添加 SAN。