授权 Apache Hive 访问
作为管理员,您需要了解运行 Hive 查询的 Hive 默认授权是不安全的,以及您需要做什么来保护您的数据。您需要了解您的安全选项:设置 Ranger 或基于存储的授权 (SBA),它基于模拟和 HDFS 访问控制列表 (ACL),或这些方法的组合。
将 Apache Hive 访问限制为已批准的用户。Cloudera 推荐 Ranger。授权是检查用户权限以执行选择操作的过程,例如创建、读取和写入数据,以及编辑表元数据。Apache Ranger 为所有 Cloudera 运行时服务提供集中授权。
您可以设置 Ranger 以使用 Hadoop SQL 策略保护托管的 ACID 表或外部表。您可以使用 Ranger 中的 HDFS 策略来保护文件系统上的外部表数据。
您可以设置 SBA 和 HDFS ACL 来保护外部表和外部表数据。基于存储的授权 (SBA) 不适用于授予用户访问 ACID 表的权限。
预装Ranger政策
在 Ranger 中,默认情况下可以使用预加载的 Hive 策略。这些策略涵盖的用户可以执行 Hive 操作。所有用户都需要使用默认数据库,执行列出数据库名称、查询信息模式等基本操作。为了提供此访问权限,为组 public(所有用户)启用了预加载default database tables columns和 information_schema database策略。建议为组公开启用这些策略。例如,如果default database tables columns禁用了阻止使用default数据库的 策略,则会出现以下错误:
代码语言:javascript复制hive> USE default;
Error: Error while compiling statement: FAILED: HiveAccessControlException
Permission denied: user [hive] does not have [USE] privilege on [default]
Apache Ranger 策略授权
Apache Ranger 为所有 Cloudera Runtime 服务(包括 Hive)的授权和审计提供集中策略管理。所有 Cloudera Runtime 服务都安装了一个 Ranger 插件,用于拦截对该服务的授权请求,如下图所示。
强烈建议通过 Ranger 而不是使用 SBA 授权 Hive。
基于存储的授权
基于存储的授权是基于 LDAP 的。顾名思义,基于存储的授权依赖于存储层提供的授权。存储层是HDFS,同时提供POSIX和ACL权限。Hive 是在 HDFS 上共享存储的众多 Cloudera Runtime 服务之一。该模型控制对元数据的访问并检查对 HDFS 文件系统相应目录的权限。表所在的 HDFS 目录的传统 POSIX 权限决定了对这些表的访问。此授权模型不支持列级安全性或授予用户访问 ACID 表的权限。
除了传统的 POSIX 权限模型之外,HDFS 还提供了 ACL 或访问控制列表,如HDFS 上的 ACL 中所述。ACL 由一组 ACL 条目组成,每个条目命名一个特定的用户或组,并授予或拒绝指定用户或组的读取、写入和执行权限。这些 ACL 也是基于 POSIX 规范的,并且它们与传统的 POSIX 权限模型兼容。
HDFS ACL 权限为管理员提供了对 HDFS 文件系统上的数据库、表和表分区的身份验证控制。例如,管理员可以创建一个对特定 HDFS 表具有一组授权的角色,然后将该角色授予一组用户。角色允许管理员轻松重复使用权限授予。Cloudera 建议依靠 POSIX 权限和少量 ACL 来增加异常和边缘情况的 POSIX 权限。
由于用于对此类文件进行权限检查的替代算法,具有 ACL 的文件会给 NameNode 带来额外的内存成本。
HDFS 权限
SBA 严重依赖 HDFS 访问控制列表 (ACL)。ACL 是 HDFS 中权限系统的扩展。CDP 私有云库默认开启 HDFS 中的 ACL,为您提供以下优势:
- 为多个组和用户提供特定权限时增加了灵活性
- 方便地将权限应用到目录树而不是单个文件
授权模型对比
除了 Apache Ranger,Hive 还支持外部表的基于存储的授权 (SBA)。SBA 不适用于授予用户访问 ACID 表的权限。Ranger 和 SBA 可以共存于CDP 私有云基地。下表比较了授权模型:
授权模式 | 安全的? | 细粒度授权(列级、行级) | 使用 GRANT/REVOKE 语句进行权限管理 | 集中管理图形用户界面 |
---|---|---|---|---|
Apache Ranger | 安全的 | 是的 | 是的 | 是的 |
基于存储 | 安全的 | HiveServer 中的 SQL 层没有授权。仅为 Metastore API 提供 Metastore 服务器授权。 | No. 基于HDFS权限的表权限 | 不 |
Hive默认 | 不安全。对哪些用户可以运行 GRANT 语句没有限制 | 是的 | 是的 | 不 |
当您运行 grant/revoke 命令并启用 Apache Ranger 时,会创建/删除 Ranger 策略。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_hive_authorization_models.html
事务表访问
作为管理员,您必须启用 Apache Ranger 服务来授权想要使用事务表的用户。这些类型的表是 Hive 3 及更高版本中默认的、符合 ACID 的表。
ACID 表默认位于/warehouse/tablespace/managed/hive 中。只有 Hive 服务可以拥有此目录中的文件并与之交互。Ranger 是 Cloudera 为 ACID 表推荐的唯一可用授权机制。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_transactional_table_access.html
外部表访问
作为管理员,您必须设置多个授权选项之一以允许用户访问外部表。
外部表默认驻留在CDP 私有云基础中HDFS 上的/warehouse/tablespace/external中)。要指定外部表的其他位置,您需要在表创建语句中包含该规范,如以下示例所示:
CREATE EXTERNAL TABLE my_external_table (a string, b string)
LOCATION '/users/andrena';
Hive 为hive用户分配默认权限 777 ,设置 umask 以限制子目录,并提供默认 ACL 以授予 Hive 对所有子目录的读写访问权限。CDP 私有云库中的外部表支持以下权限和授权模型:
- SBA
- SBA 和Ranger
- Ranger
您可以使用混合模式、SBA 和 Ranger,对外部表进行低级分析处理。
使用 SBA 权限模型
您必须添加访问 ACL 以允许组或用户在 SBA 管理的空间中创建数据库和表。如果您对基础数据具有文件级访问权限,则您有权查询表。您在 HiveServer 中配置模拟以代表最终用户运行操作。您不能使用 LLAP。
使用 SBA 和 Ranger 示例
假设您是一名管理员,他创建了一个 sales 数据库并授予 sales 组对sales目录的读写权限。这包括销售组读取和写入数据库的默认 ACL。sales 组中的用户 set doAs=true,并在 SBA 下被授权创建外部表。给定 ACL,Hive 和销售用户都可以访问所有文件和分区。
要限制某些用户访问所有文件和分区,您可以使用 Ranger。Hive 强制访问;但是,如果您为销售用户提供较少的通过 SBA 访问表的选项,例如将用户对表的 HDFS 访问权限设置为只读,Ranger 将无法控制该用户的访问权限。
使用 Ranger 授权模型
如果禁用 SBA 并仅使用 Ranger 授予不在 sales 组中的特定用户在 sales-report 数据库中创建外部表的权限,则该用户可以登录并创建数据库。使用默认 ACL,销售组用户也可以访问该表。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_external_table_access.html
启用或禁用模拟 (doas)
作为管理员,您必须了解CDP Private Cloud Base支持的权限模型。如果您不使用 Apache Ranger 来确保安全,则需要将用户添加到 HDFS 访问控制列表 (ACL) 以允许访问 Hive 仓库以在外部表上运行 DML 查询。您的 doas 配置基于您通常创建的表类型。
Hive 3 支持 HDFS 访问控制模型,而不是基于hive.warehouse.subdir.inherit.perms参数设置的传统 Hive 权限继承。在 Apache Hive 3 中,目录从默认 ACL继承权限。
为此行为配置服务,如下所述:
禁用模拟以使用 Ranger
当您启用 Ranger 时,您将禁用用户模拟 ( doAs=false)。这是 Hive 默认的,而 Ranger 是推荐的安全模型。此配置支持受管理的 ACID 表以及由 Ranger 保护的外部表。最终用户的模拟被禁用,这是 Hive 管理 ACID 表所需的状态。
在 Cloudera Manager 中,单击Tez 上的 Hive >配置并搜索 ( hive.server2.enable.doAs)。
取消选中 Hive(服务范围)以禁用模拟。
在没有模拟的情况下,HiveServer 仅授权hive用户访问 Hive 表。
启用模拟以使用 SBA
作为管理员,如果您不使用推荐的 Ranger 安全性,您只需启用 doAs模拟参数以使用 SBA:在 Cloudera Manager 中,单击Tez上的 Hive >配置,对于HiveServer2 Enable Impersonation,选中 Hive (Service-Wide)以启用模拟(doAs=true)。
此配置支持外部表。不支持 ACID和托管表。已启用模拟最终用户。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_sba_permissions_model.html
管理 YARN 队列用户
要管理安全 YARN 队列的用户,您需要知道如何为您选择的安全模型配置模拟。
要允许访问 YARN 队列,作为管理员,您可以根据您的安全配置 HiveServer 用户模拟:Ranger 或基于安全的授权 (SBA)。如果使用 Ranger,还需要配置hive.server2.tez.queue.access.check=true. 无论哪种情况,要管理 YARN 队列,您都需要以下行为:
- 用户通过 HiveServer (HS2) 向 YARN 队列提交查询
- Tez 应用程序为用户启动
- 为此用户检查对 YARN 队列的访问。
作为管理员,您可以将资源分配给不同的用户。
在 Ranger 下管理 YARN 队列
当您使用 Ranger 时,您将 HiveServer 配置为不使用模拟 ( doas=false)。HiveServer 仅授权hive用户而不是连接的最终用户访问 Hive 表和 YARN 队列,除非您还配置了以下参数:
hive.server2.tez.queue.access.check=true
在 SBA 下管理 YARN 队列
作为管理员,如果您不使用推荐的 Ranger 安全性,您只需启用 doAs模拟 ( doas=true) 参数即可使用 SBA。此操作还会导致 HiveServer 授权发出查询的连接用户在以用户身份运行 Tez 应用程序时访问 YARN 队列hive。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_yarn_access.html
配置基于存储的授权
您需要设置参数以启用基于存储的授权(SBA)。
当您使用 SBA 时,Hive 在客户端而不是服务器上执行授权检查。这允许恶意用户绕过这些检查。某些元数据操作不检查授权。请参阅 Apache JIRA HIVE-3009。用于管理权限的 DDL 语句对基于存储的授权没有影响,但不会返回错误消息 (HIVE-3010)。
- 您获得了管理员角色权限。
- 设置授权配置参数以使用 Cloudera Manager 安全阀功能启用基于存储的授权
<property>
<name>hive.security.authorization.enabled</name>
<value>false</value>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.
StorageBasedAuthorizationProvider</value>
</property>
<property>
<name>hive.server2.enable.doAs</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.pre.event.listeners</name>
<name>org.apache.hadoop.hive.ql.security.authorization.
AuthorizationPreEventListener</name>
</property>
<property>
<name>hive.security.metastore.authorization.manager</name>
<value>org.apache.hadoop.hive.ql.security.authorization.
StorageBasedAuthorizationProvider</value>
</property>
- 2. 确定您环境中的表和数据库所需的权限。
3. 在 Hive 中创建表或数据库,然后使用 HDFS 文件系统命令手动修改 POSIX 权限。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_configure_storage_based_authorization.html
基于存储的操作权限
如果您使用 SBA,您需要知道哪些 Hive 操作对您的 Hive 数据库和表具有读写访问权限。
表 1. Hive 操作所需的最低权限
操作 | 数据库读访问 | 数据库写入访问 | 表读访问 | 表写入访问 |
---|---|---|---|---|
LOAD | X | |||
EXPORT | X | |||
IMPORT | X | |||
CREATE TABLE | X | |||
CREATE TABLE AS SELECT | X | X(源表) | ||
DROP TABLE | X | |||
SELECT | X | |||
ALTER TABLE | X | |||
SHOW TABLES | X |
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_storage_based_authorization_permissions.html
使用 YARN 队列为 ETL 配置 HiveServer
您需要设置多个配置属性以允许将 Hive 工作负载放置在 Yarn 队列管理器上,这对于运行 ETL 作业很常见。您需要设置几个参数来有效地禁用容器的重用。每个新查询都会将新容器路由到适当的队列。
Hive 配置属性影响将用户和组映射到 YARN 队列。您将这些属性设置为与 YARN 放置规则一起使用。
为 YARN 队列设置 Hive 属性:
- 在 Cloudera Manager 中,单击集群> Hive >配置。
- 搜索hive-site.xml设置的Hive 服务高级配置片段(安全阀)。
- 在hive-site.xml设置的Hive 服务高级配置片段(安全阀)中,单击 。
- 在Name 中输入属性 hive.server2.tez.initialize.default.sessions并在 value 中输入false。
- 在Name 中输入属性 hive.server2.tez.queue.access.check并在 value 中输入 true。
- 在Name 中输入属性 hive.server2.tez.sessions.custom.queue.allowed并在 value 中输入true。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_yarn_queue.html
通过 Apache Knox 连接到 Apache Hive 端点
如果您的集群在CDP Private Cloud Base 中使用 Apache Knox 实现外围安全,您可以通过 Knox 连接到 Apache Hive 端点。您设置 HiveServer 传输模式并引用您的 Java 密钥库。
使用 Auto-TLS 自动创建内部证书颁发机构 (CA)。为 Knox Gateway 客户端设置 SSL,包括信任。
- 在 Cloudera Manager 中,单击Clusters > Hive on Tez > Configuration,然后将 Cloudera Manager 中的 Hive on Tez 服务传输模式更改为http。
仅当传输模式为http.
2. 从 Knox 下载 Knox Gateway TLS/SSL 客户端信任存储 JKS 文件,并将其保存在本地。
您可以从 Knox 属性的值中找到 JKS 文件的位置 gateway.tls.keystore.path。
3. 在 Hive 连接字符串中,包含如下参数:
代码语言:javascript复制jdbc:hive2://<host>:8443/;ssl=true;transportMode=http;
httpPath=gateway/cdp-proxy-api/hive;
sslTrustStore=/<path to JKS>/bin/certs/gateway-client-trust.jks;
trustStorePassword=<Java default password>
在此示例中,changeit是信任库的 Java 默认密码。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_secure_knox.html
HWC授权
您配置 Hive 仓库连接器 (HWC) 的方式会影响查询授权过程和您的安全性。有多种方法可以通过 HWC 访问 Hive,并不是所有操作都通过 HiveServer (HS2)。一些操作,例如 Spark Direct Reader 和 Hive Streaming,通过 HMS 直接进入 Hive,其中通常适用基于存储的权限。
作为客户端用户,您必须在使用 HWC 之前使用 kerberos 登录。您需要适当的存储权限才能写入目标分区或表位置。您需要配置 HWC 读取选项。您需要配置 HWC 读取选项。HWC 读取配置选项如下表所示:
能力 | JDBC方式 | Spark 直接阅读器模式 |
---|---|---|
Ranger 与细粒度访问控制的集成 | ✓ | 不适用 |
Hive ACID 读取 | ✓ | ✓ |
处理的工作量 | 非生产工作负载、小数据集 | 生产工作负载,没有细粒度访问控制的 ETL |
这些读取配置选项需要连接到不同的 Hive 组件:
- Direct Reader 配置:连接到 Hive Metastore (HMS)
- JDBC 配置:连接到 HiveServer (HS2) 或 HiveServer Interactive (HSI)
Ranger 授权通过 HiveServer (HS2) 或 Hive Metastore API (HMS API) 从 Spark 访问 Hive 表。
要将 ACID 托管表从 Spark 写入 Hive,您必须使用 HWC。要将外部表从 Spark 写入 Hive,您可以使用原生 Spark 或 HWC。
下图展示了典型的读授权流程:
下图展示了典型的写授权流程:
写入时,HWC 始终通过 HiveServer (HS2) 强制执行授权。在 JDBC 模式下读取托管表会强制实施 Ranger 授权,包括细粒度功能,例如列映射。在 Direct Reader 模式下,Ranger 和 HMS 集成提供授权。
外部表查询通过 HMS API,它也与 Ranger 集成。如果您不使用 HWC,则与 Ranger 集成的 Hive 元存储 (HMS) API 会授权外部表访问。在这种情况下,HMS API-Ranger 集成会强制执行 Ranger Hive ACL。使用 HWC 时,诸如 DROP TABLE 之类的查询会影响文件系统数据以及 HMS 中的元数据。
使用 Direct Reader 选项,SparkSQL 查询直接从 HMS 读取托管表元数据,但前提是您有权访问文件系统上的文件。您不能使用 Direct Reader 选项写入托管表。
托管表授权
Spark 作业在尝试访问 Apache Hive 托管表时模拟最终用户。作为最终用户,您无权访问 Hive 仓库中的托管文件。托管表具有不允许最终用户访问的默认文件系统权限,包括 Spark 用户访问。
作为管理员,当您为 JDBC 读取配置 HWC 时,您可以在 Ranger 中设置访问托管表的权限。您可以微调 Ranger 以保护特定数据。例如,您可以屏蔽某些列中的数据,或设置基于标签的访问控制。
当您为 Direct Reader 模式配置 HWC 时,您不能以这种方式使用 Ranger。您必须为托管表设置对文件系统位置的读取访问权限。您必须对 Hive 仓库位置 ( hive.metastore.warehouse.dir)具有读取和执行权限。
外表授权
支持外部表读写的 Ranger 授权。您需要在 Cloudera Manager 中配置一些属性来授权外部表写入。您必须被授予对外部表文件的文件系统权限,以允许 Spark 直接访问实际表数据,而不仅仅是表元数据。
直接读取授权限制
由于 Spark 允许用户运行任意代码,因此 Spark 本身无法实现 Ranger 细粒度访问控制,例如行级过滤或列级屏蔽。此限制扩展到使用 Direct Reader 读取数据。
要在细粒度级别限制数据访问,请使用支持 Ranger 的读取选项。如果不需要细粒度访问,请仅考虑使用 Direct Reader 选项从 Spark 读取 Hive 数据。例如,将 Direct Reader 用于 ETL 用例。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_apache_spark_hive_connection_configuration.html
Hive认证
HiveServer 支持使用 Kerberos 或 LDAP 支持的用户/密码验证对客户端进行身份验证。
如果您将 HiveServer 配置为使用 Kerberos 身份验证,则 HiveServer 在启动期间获取 Kerberos 票证。HiveServer 需要配置中指定的主体和密钥表文件。在启动到 HiveServer2 的连接之前,客户端应用程序(例如,JDBC 或 Beeline)必须具有有效的 Kerberos 票证。基于 JDBC 的客户端必须包含principal=<hive.server2.authentication.principal>在 JDBC 连接字符串中。例如:
代码语言:javascript复制String url = "jdbc:hive2://node1:10000/default;principal=hive/HiveServerHost@YOUR-REALM.COM"
Connection con = DriverManager.getConnection(url);
其中hive配置的主体hive-site.xml 和 HiveServerHost 是运行 HiveServer 的主机。
要启动 Beeline 并连接到安全的 HiveServer,请输入如下示例所示的命令:
代码语言:javascript复制beeline -u "jdbc:hive2://10.65.13.98:10000/default;principal=hive/_HOST@CLOUDERA.SITE"
使用 LDAP 保护 HiveServer
您可以通过将 HiveServer 配置为使用 LDAP 身份验证来保护到 Hive 的远程客户端连接。
当您将 HiveServer 配置为使用由 LDAP 支持的用户和密码验证时,Hive 客户端会在连接启动期间发送用户名和密码。HiveServer 使用外部 LDAP 服务验证这些凭据。您可以使用 Active Directory 或 OpenLDAP 通过 HiveServer 启用 LDAP 身份验证。
- 在 Cloudera Manager 中,选择Hive-on-Tez >配置。
- 搜索 ldap。
- 选中为 Hive(服务范围)启用 HiveServer2 的 LDAP 身份验证。
- 以 格式输入您的 LDAP URL ldap[s]://<host>:<port>。
LDAP_URL是 LDAP 服务器的访问 URL。例如, ldap://ldap_host_name.xyz.com:389
5. 为您的环境输入 Active Directory 域或 LDAP 基本 DN。
- 活动目录 (AD)
- LDAP_BaseDN
输入AD服务器的域名。例如, corp.domain.com。
输入 LDAP 服务器的基本 LDAP 专有名称 (DN)。例如, ou=dev, dc=xyz。
- 单击保存更改。
- 重新启动 Hive 服务。
- 构造 LDAP 连接字符串以连接到 HiveServer。
以下简单示例不安全,因为它发送明文密码。
代码语言:javascript复制String URL = "jdbc:hive2://node1:10000/default;user=LDAP_Userid;password=LDAP_Password"
Connection con = DriverManager.getConnection(url);
以下示例显示了使用加密密码的安全连接字符串。
代码语言:javascript复制String url ="jdbc:hive2://node1:10000/default;ssl=true;sslTrustStore=/mytruststore_path;trustStorePassword=my_truststore_password"
Connection con = DriverManager.getConnection(url);
客户端连接到 HiveServer
您可以使用 Beeline、JDBC 或 ODBC 连接到 HiveServer。
JDBC 客户端-HiveServer 身份验证
JDBC 客户端需要一个连接 URL,如下所示。基于 JDBC 的客户端必须在 JDBC 连接字符串中包含用户名和密码。例如:
代码语言:javascript复制String url = "jdbc:hive2://node1:10000/default;user=LDAP_Userid;password=LDAP_Password" Connection con = DriverManager.getConnection(url);
其中 LDAP_Userid 值是用户 ID,LDAP_Password 是客户端用户的密码。
HiveServer 操作模式
HiveServer 支持以下与 Hive 交互的模式:
操作模式 | 描述 |
---|---|
嵌入模式 | Beeline 客户端和 Hive 安装驻留在同一主机或虚拟机上。不需要 TCP 连接。 |
远程模式 | 使用远程模式支持多个并发客户端对同一个远程 Hive 安装执行查询。远程传输模式支持使用 LDAP 和 Kerberos 进行身份验证。它还支持使用 SSL 进行加密。需要 TCP 连接。 |
远程模式:使用以下 URL 启动 Hive:
代码语言:javascript复制jdbc:hive2://<host>:<port>/<db>.
默认的 HiveServer2 端口是 10000。
嵌入模式:使用以下 URL 启动 Hive:
代码语言:javascript复制jdbc:hive2://
传输方式
作为管理员,您可以使用以下传输模式之一启动 HiveServer:
运输方式 | 描述 |
---|---|
TCP | HiveServer 使用 TCP 传输来发送和接收 Thrift RPC 消息。 |
HTTP | HiveServer 使用 HTTP 传输来发送和接收 Thrift RPC 消息。 |
HiveServer 中的可插入身份验证模块
在 TCP 传输模式下运行时,HiveServer 支持可插拔身份验证模块 (PAM)。使用可插拔身份验证模块,您可以将多个身份验证方案集成到单个 API 中。您可以在HIVE_ON_TEZ-1 >配置上使用 Cloudera Manager 安全阀技术来设置以下属性:
代码语言:javascript复制hive.server2.authentication
值 = CUSTOM
代码语言:javascript复制hive.server2.custom.authentication.class
值 = <可插拔身份验证类名称>
您提供的类必须是 org.apache.hive.service.auth.PasswdAuthenticationProvider. HiveServer 调用其Authenticate(user, passed)方法来验证请求。该实现可以选择扩展 Hadoop 的 org.apache.hadoop.conf.Configured类以获取 Hive 配置对象。
HiveServer 可信的委派
HiveServer 从身份验证子系统(Kerberos 或 LDAP)确定连接用户的身份。为此连接启动的任何新会话都代表此连接用户运行。如果服务器配置为代理用户,则连接用户的身份用于连接到 Hive。具有 Hadoop 超级用户权限的用户可以为给定会话请求备用用户。HiveServer 检查连接用户是否可以代理请求的用户 ID,如果是,则以备用用户身份运行新会话。
JDBC 连接字符串语法
用于连接到远程 Hive 客户端的 JDBC 连接字符串需要主机、端口和 Hive 数据库名称。您可以选择指定传输类型和身份验证。
代码语言:javascript复制jdbc:hive2://<host>:<port>/<dbName>;<sessionConfs>?<hiveConfs>#<hiveVars>
连接字符串参数
下表描述了用于指定 JDBC 连接的参数。
JDBC 参数 | 描述 | 必需的 |
---|---|---|
host | 托管 HiveServer 的集群节点。 | 是 |
port | HiveServer 侦听的端口号。 | 是 |
dbName | 运行查询的 Hive 数据库的名称。 | 是 |
sessionConfs | 在以下格式JDBC / ODBC驱动可选配置参数: <key1>=<value1>;<key2>=<key2>...; | 否 |
hiveConfs | 服务器上 Hive 的可选配置参数采用以下格式: <key1>=<value1>;<key2>=<key2>; ...配置在用户会话期间持续。 | 否 |
hiveVars | Hive 变量的可选配置参数采用以下格式: <key1>=<value1>;<key2>=<key2>; ...配置在用户会话期间持续。 | 否 |
TCP 和 HTTP 传输
下表显示了配置 HiveServer 时在连接字符串中使用的变量。JDBC 客户端和 HiveServer 可以使用基于 HTTP 或 TCP 的传输来交换 RPC 消息。因为默认传输是 TCP,所以不需要指定transportMode=binary是否需要 TCP 传输。
运输模式变量值 | 描述 |
---|---|
http | 使用 HTTP 传输连接到 HiveServer2。 |
binary | 使用 TCP 传输连接到 HiveServer2。 |
使用这些参数的语法是:
代码语言:javascript复制jdbc:hive2://<host>:<port>/<dbName>;transportMode=http;httpPath=<http_endpoint>;
<otherSessionConfs>?<hiveConfs>#<hiveVars>
用户认证
如果配置为远程模式,HiveServer 支持 Kerberos、LDAP、Pluggable Authentication Modules (PAM) 和用于验证连接到 HiveServer 的 JDBC 用户的自定义插件。使用 Kerberos 进行身份验证的 JDBC 连接 URL 的格式与其他身份验证模型的格式不同。下表显示了 Kerberos 身份验证的变量。
用户认证变量 | 描述 |
---|---|
principal | 唯一标识 Kerberos 用户的字符串。 |
saslQop | SASL 框架的保护质量。质量级别在身份验证期间在客户端和服务器之间协商。由带有 TCP 传输的 Kerberos 身份验证使用。 |
user | 非 Kerberos 身份验证模型的用户名。 |
password | 非 Kerberos 身份验证模型的密码。 |
使用这些参数的语法是:
代码语言:javascript复制jdbc:hive://<host>:<port>/<dbName>;principal=<HiveServer2_kerberos_principal>;<otherSessionConfs>?<hiveConfs>#<hiveVars>
传输层安全
HiveServer2 支持 SSL 和 Sasl QOP 以实现传输层安全。SSL 的 JDBC 连接字符串的格式使用以下变量:
SSL 变量 | 描述 |
---|---|
ssl | 指定是否使用 SSL |
sslTrustStore | SSL TrustStore 的路径。 |
trustStorePassword | SSL TrustStore 的密码。 |
使用身份验证参数的语法是:
代码语言:javascript复制jdbc:hive2://<host>:<port>/<dbName>;
ssl=true;sslTrustStore=<ssl_truststore_path>;trustStorePassword=<truststore_password>;
<otherSessionConfs>?<hiveConfs>#<hiveVars>
当使用 TCP 进行传输并使用 Kerberos 进行安全时,HiveServer2 使用 Sasl QOP 进行加密而不是 SSL。
Sasl QOP 变量 | 描述 |
---|---|
principal | 唯一标识 Kerberos 用户的字符串。 |
saslQop | 所需的保护级别。对于身份验证、校验和和加密,请指定auth-conf。其他有效值不提供加密。 |
Sasl QOP 的 JDBC 连接字符串使用这些变量。
代码语言:javascript复制jdbc:hive2://fqdn.example.com:10000/default;principal=hive/_HOST@EXAMPLE.COM;saslQop=auth-conf
_HOST 是一个通配符占位符,它会自动替换为运行 HiveServer 守护进程的服务器的完全限定域名 (FQDN)。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive_remote_data_access.html
Hive 元存储的安全
Cloudera 建议使用 Apache Ranger 策略来保护 Hive 元存储中的 Hive 数据。您需要执行一些操作来防止用户绕过 HiveServer 访问 Hive Metastore 和 Hive Metastore 数据库。
- 在 Metastore 服务主机上添加防火墙规则,以仅允许从 HiveServer2 主机访问 Metastore 端口。您可以使用 iptables 执行此操作。
- 仅授予从 Metastore 服务主机访问 Metastore 数据库的权限。
例如,在 MySQL 中:GRANT ALL PRIVILEGES ON metastore.* TO 'hive'@'metastorehost'; 其中 metastorehost 是运行 Metastore 服务的主机。
3. 确保非管理员用户无法登录 HiveServer 主机。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive-secure-hms.html
激活 Hive Web UI
启用 Kerberos 后,HiveServer2 GUI/Web UI 不显示活动的客户端连接。您必须更正此问题,这会导致浏览器客户端的 Kerberos 票证问题。
启用 Kerberos 后,HiveServer2 GUI/Web UI 不显示活动的客户端连接。禁用 Spnego 身份验证时会出现此问题。此问题会导致在浏览器上获取客户端的 Kerberos 票证时出现问题。
- 在 Cloudera Manager 中,转到Clusters > Hive-on-Tez > Configuration。
- 搜索 HiveServer2的hive-site.xml高级配置片段(安全阀)
3. 单击 并添加以下属性和值:hive.server2.webui.spnego.keytab = hive.keytab
4. 单击 并添加以下属性和值:hive.server2.webui.spnego.principal = HTTP/_HOST@<REALM NAME>
5. 单击 并添加以下属性和值:hive.server2.webui.use.spnego = true
6. 保存更改,然后重新启动 Hive-on-Tez。
Hive Web UI 显示活动的客户端连接。
原文链接:https://docs.cloudera.com/cdp-private-cloud-base/latest/securing-hive/topics/hive-spnego.html