为客户端配置 Kerberos 以访问启用 Kerberos 的 Kyuubi
说明
当 Kyuubi 由 Kerberos 保护时,身份验证过程会变得稍微复杂一些。

上图展示了一个简化的 Kerberos 身份验证过程:
- Kerberos 客户端向 KDC 发送用户主体和密钥。密钥可以是密码或 keytab 文件。
- KDC 返回一张
票据授予票据(TGT)。 - Kerberos 客户端将 TGT 存储到票据缓存中。
- JDBC 客户端(例如 beeline 和 BI 工具)从票据缓存中读取 TGT。
- JDBC 客户端将 TGT 和服务器主体发送给 KDC。
- KDC 返回一张
客户端到服务器票据。 - JDBC 客户端将
客户端到服务器票据发送给 Kyuubi 服务器以证明其身份。
在本页面的后续部分,我们将描述通过该身份验证所需的步骤。
安装 Kerberos 客户端
通常,Kerberos 客户端已默认安装。你可以使用 klist 工具进行验证。
Linux 命令及输出:
$ klist -V
Kerberos 5 version 1.15.1MacOS 命令与输出:
$ klist --version
klist (Heimdal 1.5.1apple1)
Copyright 1995-2011 Kungliga Tekniska Högskolan
Send bug-reports to heimdal-bugs@h5l.orgWindows 命令及输出:
> klist -V
Kerberos for Windows如果客户端尚未安装,请根据操作系统平台提前安装。
我们建议你安装 MIT Kerberos 发行版,因为本指南中的所有命令都基于它。
配置 Kerberos 客户端
Kerberos 客户端需要一个配置文件来调整 Kerberos 票据缓存的创建。以下是不同操作系统上该配置文件的默认位置:
| 操作系统 | 路径 |
|---|---|
| Linux | /etc/krb5.conf |
| MacOS | /etc/krb5.conf |
| Windows | %ProgramData%\MIT\Kerberos5\krb5.ini |
你可以使用 KRB5_CONFIG 环境变量来覆盖默认位置。
配置文件应配置为指向与 Kyuubi 所指向的相同的 KDC。
获取 Kerberos TGT
执行 kinit 命令从 KDC 获取 TGT。
假设用户主体为 kyuubi_user@KYUUBI.APACHE.ORG,用户 keytab 文件名为 kyuubi_user.keytab,则命令应为:
$ kinit -kt kyuubi_user.keytab kyuubi_user@KYUUBI.APACHE.ORG
(Command is identical on different OS platform)你也可以使用主体和密码执行 kinit 命令来获取 TGT:
$ kinit kyuubi_user@KYUUBI.APACHE.ORG
Password for kyuubi_user@KYUUBI.APACHE.ORG: password
(Command is identical on different OS platform)如果命令执行成功,TGT 将被存储到票据缓存中。
使用 klist 命令打印票据缓存中的 TGT 信息:
$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: kyuubi_user@KYUUBI.APACHE.ORG
Valid starting Expires Service principal
2021-12-13T18:44:58 2021-12-14T04:44:58 krbtgt/KYUUBI.APACHE.ORG@KYUUBI.APACHE.ORG
renew until 2021-12-14T18:44:57
(Command is identical on different OS platform. Ticket cache location may be different.)票据缓存在不同操作系统平台上可能有不同的存储类型。
例如:
| 操作系统 | 默认票据缓存类型和位置 |
|---|---|
| Linux | FILE:/tmp/krb5cc_%{uid} |
| MacOS | KCM:%{uid}:%{gid} |
| Windows | API:krb5cc |
你可以在 klist 输出的 Ticket cache 部分中找到你的票据缓存类型和位置。
注意:
- 请确保你的票据缓存类型为
FILE,因为 JVM 只能读取以文件形式存储的票据缓存。 - 如果你在同一台主机上运行 Kyuubi 并使用相同的 OS 用户执行
kinit,请不要将 TGT 存储到默认票据缓存中。默认票据缓存已被 Kyuubi 服务端使用。
无论是因为默认票据缓存不是文件,还是因为它已被 Kyuubi 服务端占用,你都应该将票据缓存存储到另一个文件位置。可以通过在 kinit 命令中使用 -c 参数指定文件位置来实现。
例如:
$ kinit -c /tmp/krb5cc_beeline -kt kyuubi_user.keytab kyuubi_user@KYUUBI.APACHE.ORG
(Command is identical on different OS platform)要检查票据缓存,请在 klist 命令中使用 -c 参数指定文件位置。
例如,
$ klist -c /tmp/krb5cc_beeline
(Command is identical on different OS platform)将 Kerberos 客户端配置文件加入 JVM 搜索路径
运行 JDBC 客户端的 JVM 同样需要读取 Kerberos 客户端配置文件。不过,JVM 使用的默认位置与 Kerberos 客户端不同,并且不读取 KRB5_CONFIG 环境变量。
| 操作系统 | JVM 搜索路径 |
|---|---|
| Linux | 系统级:/etc/krb5.conf |
| MacOS | 用户级:$HOME/Library/Preferences/edu.mit.Kerberos系统级: /etc/krb5.conf |
| Windows | 用户级:%USERPROFILE%\krb5.ini系统级: %windir%\krb5.ini |
你可以使用 JVM 系统属性 java.security.krb5.conf 来覆盖默认位置。
将 Kerberos 票据缓存加入 JVM 搜索路径
JVM 按以下顺序确定票据缓存的位置:
KRB5CCNAME环境变量指定的路径。该路径必须以UNIX开头…… 不对,必须以FILE:开头。- 类 Unix 操作系统(例如 Linux、MacOS)上的
/tmp/krb5cc_%{uid} - 若
${user.name}不为空,则为${user.home}/krb5cc_${user.name} - 若
${user.name}为空,则为${user.home}/krb5cc
注意:
${user.home}和${user.name}是 JVM 系统属性。- 若
${user.home}为空,则应以${user.dir}替代${user.home}。
请确保你的票据缓存以文件形式存储,并将其放置在上述位置之一。
确保 classpath 中存在 core-site.xml
与 Hadoop 客户端一样,应在 core-site.xml 中将 hadoop.security.authentication 设置为 KERBEROS,以便 Hive JDBC 驱动使用 Kerberos 认证。core-site.xml 应放置在 beeline 的 classpath 或 BI 工具的 classpath 中。
Beeline
以下是不同 beeline 发行版中 core-site.xml 应存在的常见位置:
| 客户端 | 位置 | 说明 |
|---|---|---|
| Hive beeline | $HADOOP_HOME/etc/hadoop | Hive 会解析 $HADOOP_HOME,并使用 $HADOOP_HOME/bin/hadoop 命令来启动 beeline。$HADOOP_HOME/etc/hadoop 在 hadoop 命令的 classpath 中。 |
| Spark beeline | $HADOOP_CONF_DIR | 在 $SPARK_HOME/conf/spark-env.sh 中,$HADOOP_CONF_DIR 通常被设置为包含 hadoop 客户端配置文件的目录。 |
| Kyuubi beeline | $HADOOP_CONF_DIR | 在 $KYUUBI_HOME/conf/kyuubi-env.sh 中,$HADOOP_CONF_DIR 通常被设置为包含 hadoop 客户端配置文件的目录。 |
如果在上述位置未找到 core-site.xml,请创建一个包含以下内容的文件:
<configuration>
<property>
<name>hadoop.security.authentication</name>
<value>kerberos</value>
</property>
</configuration>BI 工具
对于 BI 工具,添加 core-site.xml 的方式各不相同。
以 DBeaver 为例,我们可以通过它的 Global libraries(全局库)首选项将文件添加到 DBeaver 的 classpath 中。
由于 Global libraries 只接受 jar 文件,你需要将 core-site.xml 打包进一个 jar 文件中。
$ jar -c -f core-site.jar core-site.xml
(Command is identical on different OS platform)通过 JDBC URL 连接
最后一步是使用正确的 JDBC URL 连接到 Kyuubi。
JDBC URL 的格式应为:
jdbc:hive2://<kyuubi_server_address>:<kyuubi_server_port>/<db>;principal=<kyuubi_server_principal>或
jdbc:hive2://<kyuubi_server_address>:<kyuubi_server_port>/<db>;kyuubiServerPrincipal=<kyuubi_server_principal>注意:
principal继承自 Hive JDBC Driver,含义有些模糊,我们可以使用kyuubiServerPrincipal作为它的别名。kyuubi_server_principal是kyuubi-defaults.conf中设置的kyuubi.kinit.principal的值。- 作为命令行参数时,JDBC URL 应加引号,以避免被 “;” 拆分为两条命令。
- 对于 DBeaver,应将
<db>;principal=<kyuubi_server_principal>或<db>;kyuubiServerPrincipal=<kyuubi_server_principal>设置为Database/Schema参数。
评论
登录后参与评论
KnowForge