为啥我们在启用 Kerberos 的 EMR 集群上使用直线连接到 Hive 时使用 Hive 服务主体?

Posted

技术标签:

【中文标题】为啥我们在启用 Kerberos 的 EMR 集群上使用直线连接到 Hive 时使用 Hive 服务主体?【英文标题】:Why do we use the Hive service principal when using beeline to connect to Hive on a Kerberos enabled EMR cluster?为什么我们在启用 Kerberos 的 EMR 集群上使用直线连接到 Hive 时使用 Hive 服务主体? 【发布时间】:2019-02-09 03:45:25 【问题描述】:

我正在尝试在 EMR 集群(启用 Kerberos)上使用直线连接到 Hive,我想知道为什么我要运行 kinit(使用我的用户帐户)然后执行以下操作:

beeline -u "jdbc:hive2://localhost:10000/default;principal=hive/_HOST@REALM"

让我困惑的部分是上面的主要部分。当我使用上一个命令中的 kinit 对我的用户帐户进行身份验证时,为什么我们使用“principal=hive/_HOST@REALM”(从我读到的是 Hive 服务主体)?

我会针对 Hive 服务主体或我的用户帐户运行查询吗?是否所有用户在使用beeline 时都使用Hive 服务主体?这背后有什么原因吗?

更多上下文链接:Connecting to Hive via Beeline using Kerberos keytab

【问题讨论】:

【参考方案1】:

该 JDBC URL 上的 principal= 选项实际上是指 服务主体 (SPN),即您需要连接的内容。这无疑是模棱两可和令人困惑的。

kinit 对您的用户主体 (UPN) 进行身份验证,创建一个转储到票证缓存中的“票证授予票证”(TGT)。 稍后 JDBC 客户端(或 HTTP 客户端,或 Hive Metastore Java 客户端,或 HDFS Java 客户端,等等) 将使用 TGT 为适当的服务类型请求 服务票证在适当的主机上;出于某种原因,Java 从不将该服务票证放入缓存中(与使用 C 库的 curl 或 Python 不同,如 kinit)。

SPN 通常在 Hadoop 客户端库使用的名为 ***-site.xml 的 Hadoop 配置文件中定义。但是... JDBC 驱动程序应该是独立的,而不是依赖于外部库或配置文件,并从 URL 获取其所有连接参数。这就是为什么您必须在您的 URL 上明确填充 SPN。呵呵。

【讨论】:

这是否意味着我将使用 Hive SPN 进行连接,但我的查询将针对我已通过身份验证的用户帐户运行? 否(如果我正确理解您所说的“使用”是什么意思)。您作为 UPN 连接到 SPN。是或否,您的查询将在您的 UPN 在 Hive 服务帐户下运行,但使用您的 privs - 取决于 HiveServer2 使用的安全模型 (例如,在 CDH 中,Sentry 强制执行第二种方法)

以上是关于为啥我们在启用 Kerberos 的 EMR 集群上使用直线连接到 Hive 时使用 Hive 服务主体?的主要内容,如果未能解决你的问题,请参考以下文章

0027-如何在CDH集群启用Kerberos

0027-如何在CDH集群启用Kerberos

带有 cloudformation 的 AWS EMR 集群:如何启用调试

HDP 2.5:Zeppelin 不会在启用 Kerberos 的集群中运行 Notebook

集群启用Kerberos后对Zookeeper的Znode操作异常分析

无法在启用 kerberos 的 3 节点集群上启动 NIFI