CLI Kerberos 认证

Presto 命令行界面 可以连接到启用了 Kerberos 认证的 Presto 协调器

环境配置

Kerberos 服务

您将需要一个 Kerberos KDC 运行在客户端可以通过网络访问的节点上。KDC 负责验证主体并颁发可用于 Kerberos 启用的服务的会话密钥。KDC 通常运行在端口 88 上,这是 IANA 为 Kerberos 分配的端口。

MIT Kerberos 配置

Kerberos 需要在客户端上进行配置。至少需要在 /etc/krb5.conf 文件的 [realms] 部分中包含一个 kdc 条目。您可能还想包含一个 admin_server 条目,并确保客户端可以访问端口 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 主体。您需要使用 kadmin 在 Kerberos 中创建这些用户。

此外,每个用户都需要一个 密钥表文件。在创建主体后,可以使用 kadmin 创建密钥表文件。

kadmin
> addprinc -randkey [email protected]
> ktadd -k /home/someuser/someuser.keytab [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 协调器。Presto 协调器使用 Java 密钥库 文件进行 TLS 配置。此文件可以复制到客户端机器上并用于其配置。

Presto CLI 执行

除了连接到不需要 Kerberos 认证的 Presto 协调器时所需的选项外,使用 Kerberos 支持启用调用 CLI 还需要一些额外的命令行选项。调用 CLI 的最简单方法是使用包装器脚本。

#!/bin/bash

./presto \
  --server https://presto-coordinator.example.com:7778 \
  --krb5-config-path /etc/krb5.conf \
  --krb5-principal [email protected] \
  --krb5-keytab-path /home/someuser/someuser.keytab \
  --krb5-remote-service-name presto \
  --keystore-path /tmp/presto.jks \
  --keystore-password password \
  --catalog <catalog> \
  --schema <schema>

选项

描述

--server

Presto 协调器的地址和端口。端口必须设置为 Presto 协调器监听 HTTPS 连接的端口。

--krb5-config-path

Kerberos 配置文件。

--krb5-principal

身份验证到协调器时要使用的主体。

--krb5-keytab-path

密钥表的路径,该密钥表可用于验证由 --krb5-principal 指定的主体

--krb5-remote-service-name

Presto 协调器 Kerberos 服务名称。

--keystore-path

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

--keystore-password

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

故障排除

用于排查 Presto 协调器 的许多相同步骤也适用于排查 CLI。

其他 Kerberos 调试信息

通过在启动 CLI 进程时传递 -Dsun.security.krb5.debug=true 作为 JVM 参数,可以为 Presto CLI 进程启用其他 Kerberos 调试信息。这样做需要通过 java 调用 CLI JAR,而不是直接运行自执行 JAR。自执行 JAR 文件无法将选项传递给 JVM。

#!/bin/bash

java \
  -Dsun.security.krb5.debug=true \
  -jar presto-cli-*-executable.jar \
  --server https://presto-coordinator.example.com:7778 \
  --krb5-config-path /etc/krb5.conf \
  --krb5-principal [email protected] \
  --krb5-keytab-path /home/someuser/someuser.keytab \
  --krb5-remote-service-name presto \
  --keystore-path /tmp/presto.jks \
  --keystore-password password \
  --catalog <catalog> \
  --schema <schema>

在为 Presto 协调器设置 Kerberos 认证的文档中列出的 其他资源 在解释 Kerberos 调试消息时可能会有所帮助。