协调器 Kerberos 身份验证

可以配置 Presto 协调器以通过 HTTPS 为客户端启用 Kerberos 身份验证,例如 Presto CLI 或 JDBC 和 ODBC 驱动程序。

要为 Presto 启用 Kerberos 身份验证,需要在 Presto 协调器上进行配置更改。工作节点不需要更改;工作节点将继续通过未经身份验证的 HTTP 连接到协调器。但是,如果您想使用 SSL/TLS 来保护 Presto 节点之间的通信,请配置 安全内部通信

环境配置

Kerberos 服务

您将需要一个 Kerberos KDC 运行在 Presto 协调器可以通过网络访问的节点上。KDC 负责对主体进行身份验证并颁发可在 Kerberos 启用服务中使用的会话密钥。KDC 通常在端口 88 上运行,这是 Kerberos 的 IANA 分配端口。

MIT Kerberos 配置

需要在 Presto 协调器上配置 Kerberos。至少需要在 /etc/krb5.conf 文件的 [realms] 部分中有一个 kdc 条目。您可能还想包含一个 admin_server 条目并确保 Presto 协调器可以访问端口 749 上的 Kerberos 管理服务器。

[realms]
  PRESTO.EXAMPLE.COM = {
    kdc = kdc.example.com
    admin_server = kdc.example.com
  }

[domain_realm]
  .presto.example.com = PRESTO.EXAMPLE.COM
  presto.example.com = PRESTO.EXAMPLE.COM

完整的 文档 用于 krb5.conf 由 MIT Kerberos 项目托管。如果您使用的是 Kerberos 协议的不同实现,则需要将配置适应您的环境。

Kerberos 身份和密钥表文件

Presto 协调器需要一个 Kerberos 主体,连接到 Presto 协调器的用户也是如此。您需要使用 kadmin 在 Kerberos 中创建这些用户。

此外,Presto 协调器需要一个 密钥表文件。创建主体后,您可以使用 kadmin 创建密钥表文件

kadmin
> addprinc -randkey [email protected]
> addprinc -randkey presto/[email protected]
> ktadd -k /etc/presto/presto.keytab [email protected]
> ktadd -k /etc/presto/presto.keytab presto/[email protected]

注意

运行 ktadd 会随机化主体的密钥。如果您刚刚创建了主体,这无关紧要。如果主体已经存在,并且如果现有用户或服务依赖于能够使用密码或密钥表进行身份验证,请使用 -norandkey 选项来 ktadd

Java 密码扩展策略文件

Java 运行时环境附带策略文件,这些文件限制了可使用的加密密钥的强度。Kerberos 默认使用比包含的策略文件支持的强度更大的密钥。有两个可能的解决方案

  • 更新 JCE 策略文件。

  • 配置 Kerberos 以使用强度较低的密钥。

在这两个选项中,建议更新 JCE 策略文件。JCE 策略文件可以从 Oracle 下载。请注意,JCE 策略文件根据您运行的 Java 的主要版本而有所不同。例如,Java 6 策略文件不适用于 Java 8。

Java 8 策略文件可在 此处 获取。ZIP 存档中的 README 文件包含有关安装策略文件的说明。如果您在系统 JRE 中安装策略文件,则需要管理员权限来安装这些文件。

用于 TLS 的 Java 密钥库文件

使用 Kerberos 身份验证时,应通过 HTTPS 访问 Presto 协调器。您可以在协调器上创建 用于 TLS 的 Java 密钥库文件 来实现这一点。

系统访问控制插件

启用了 Kerberos 的 Presto 协调器可能需要一个 系统访问控制 插件来实现所需的安全性级别。

Presto 协调器节点配置

您必须在配置 Presto 协调器以使用 Kerberos 身份验证和 HTTPS 之前对环境进行上述更改。在进行以下环境更改后,您可以对 Presto 配置文件进行更改。

config.properties

Kerberos 身份验证是在协调器节点的 config.properties 文件中配置的。需要添加的条目列在下面。

http-server.authentication.type=KERBEROS

http.server.authentication.krb5.service-name=presto
http.server.authentication.krb5.service-hostname=presto.example.com
http.server.authentication.krb5.keytab=/etc/presto/presto.keytab
http.authentication.krb5.config=/etc/krb5.conf

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

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

属性

描述

http-server.authentication.type

Presto 协调器的身份验证类型。必须设置为 KERBEROS

http.server.authentication.krb5.service-name

Presto 协调器的 Kerberos 服务名称。必须与 Kerberos 主体匹配。

http.server.authentication.krb5.principal-hostname

Presto 协调器的 Kerberos 主机名。必须与 Kerberos 主体匹配。此参数是可选的。如果包含,Presto 将在 Kerberos 主体的宿主部分中使用此值,而不是机器的主机名。

http.server.authentication.krb5.keytab

可用于对 Kerberos 主体进行身份验证的密钥表的位置。

http.authentication.krb5.config

Kerberos 配置文件的位置。

http-server.https.enabled

启用 Presto 协调器的 HTTPS 访问。应设置为 true

http-server.https.port

HTTPS 服务器端口。

http-server.https.keystore.path

将用于保护 TLS 的 Java 密钥库文件的位置。

http-server.https.keystore.key

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

注意

启用 HTTPS 后,请监控 Presto 协调器上的 CPU 使用率。如果您允许 Java 从较大的列表中进行选择,它会更喜欢 CPU 密集型密码套件。如果在启用 HTTPS 后 CPU 使用率过高,您可以配置 Java 以使用特定密码套件,方法是将 http-server.https.included-cipher 属性设置为仅允许使用便宜的密码。默认情况下,非前向保密 (FS) 密码将被禁用。因此,如果您要选择非 FS 密码,则需要将 http-server.https.excluded-cipher 属性设置为一个空列表,以覆盖默认的排除项。

http-server.https.included-cipher=TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256
http-server.https.excluded-cipher=

Java 文档列出了 支持的密码套件

access-controls.properties

至少,access-control.properties 文件必须包含一个 access-control.name 属性。所有其他配置对于正在配置的实现是特定的。有关详细信息,请参见 系统访问控制

故障排除

使 Kerberos 身份验证正常工作可能很困难。您可以独立验证 Presto 之外的某些配置,以帮助缩小在尝试解决问题时的关注范围。

Kerberos 验证

确保您可以从 Presto 协调器使用 telnet 连接到 KDC。

$ telnet kdc.example.com 88

验证密钥表文件可以使用 kinitklist 成功获取票证。

$ kinit -kt /etc/presto/presto.keytab [email protected]
$ klist

Java 密钥库文件验证

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

其他 Kerberos 调试信息

您可以通过将以下行添加到 Presto jvm.config 文件中,为 Presto 协调器进程启用其他 Kerberos 调试信息。

-Dsun.security.krb5.debug=true
-Dlog.enable-console=true

-Dsun.security.krb5.debug=true 启用来自 JRE Kerberos 库的 Kerberos 调试输出。调试输出转到 stdout,Presto 将其重定向到日志系统。 -Dlog.enable-console=true 启用输出到 stdout,以便其显示在日志中。

Kerberos 调试输出发送到日志中的信息的数量和有用性因身份验证失败的位置而异。异常消息和堆栈跟踪也可以提供有关问题性质的有用线索。

其他资源

常见的 Kerberos 错误消息(A-M)

常见的 Kerberos 错误消息(N-Z)

MIT Kerberos 文档:故障排除