Hive 安全配置

认证

Hive 连接器 的默认安全配置在连接到 Hadoop 集群时不使用认证。所有查询都将作为运行 Presto 进程的用户执行,而不管哪个用户提交了查询。

Hive 连接器提供额外的安全选项来支持已配置为使用 Kerberos 的 Hadoop 集群。

在访问 HDFS 时,Presto 可以 模拟 运行查询的最终用户。这可以与 HDFS 权限和 ACLs 一起使用,为数据提供额外的安全保障。

警告

在使用 Kerberos 认证到 Hadoop 服务时,应使用 Kerberos 安全 Presto 协调器的访问权限。未能保护对 Presto 协调器的访问权限可能会导致对 Hadoop 集群上敏感数据的未经授权的访问。

有关设置 Kerberos 认证的信息,请参阅 协调器 Kerberos 认证CLI Kerberos 认证

Kerberos 支持

为了将 Hive 连接器与使用 kerberos 认证的 Hadoop 集群一起使用,您需要配置连接器以与 Hadoop 集群上的两个服务一起工作

  • Hive 元存储 Thrift 服务

  • Hadoop 分布式文件系统 (HDFS)

Hive 连接器对这些服务的访问在包含一般 Hive 连接器配置的属性文件中配置。

注意

如果您的 krb5.conf 位置与 /etc/krb5.conf 不同,您必须在 jvm.config 文件中使用 java.security.krb5.conf JVM 属性显式设置它。

示例:-Djava.security.krb5.conf=/example/path/krb5.conf

Hive 元存储 Thrift 服务认证

在 Kerberized Hadoop 集群中,Presto 使用 SASL 连接到 Hive 元存储 Thrift 服务,并使用 Kerberos 进行身份验证。元存储的 Kerberos 认证在连接器的属性文件中使用以下属性配置

属性名称

描述

hive.metastore.authentication.type

Hive 元存储认证类型。

hive.metastore.service.principal

Hive 元存储服务的 Kerberos 主体。

hive.metastore.client.principal

Presto 连接到 Hive 元存储服务时将使用的 Kerberos 主体。

hive.metastore.client.keytab

Hive 元存储客户端 keytab 位置。

hive.metastore-impersonation-enabled

启用元存储最终用户模拟。

hive.metastore.authentication.type

其中之一是 NONEKERBEROS。使用 NONE 的默认值时,Kerberos 认证将被禁用,无需配置其他属性。

当设置为 KERBEROS 时,Hive 连接器将使用 SASL 连接到 Hive 元存储 Thrift 服务,并使用 Kerberos 进行身份验证。

此属性是可选的;默认值为 NONE

hive.metastore.service.principal

Hive 元存储服务的 Kerberos 主体。Presto 协调器将使用它来对 Hive 元存储进行身份验证。

可以在此属性值中使用 _HOST 占位符。在连接到 Hive 元存储时,Hive 连接器将替换它正在连接的 元存储 服务器的主机名。如果元存储在多个主机上运行,这将很有用。

示例:hive/[email protected]hive/[email protected]

此属性是可选的;没有默认值。

hive.metastore.client.principal

Presto 连接到 Hive 元存储时将使用的 Kerberos 主体。

可以在此属性值中使用 _HOST 占位符。在连接到 Hive 元存储时,Hive 连接器将替换 Presto 正在运行的 工作节点 的主机名。如果每个工作节点都有自己的 Kerberos 主体,这将很有用。

示例:presto/[email protected]presto/[email protected]

此属性是可选的;没有默认值。

警告

hive.metastore.client.principal 指定的主体必须具有足够的权限来删除 hive/warehouse 目录中的文件和目录。如果没有,则只会删除元数据,数据将继续占用磁盘空间。

这是因为 Hive 元存储负责删除内部表数据。当元存储配置为使用 Kerberos 认证时,元存储执行的所有 HDFS 操作都会被模拟。删除数据的错误会静默忽略。

hive.metastore.client.keytab

keytab 文件的路径,其中包含由 hive.metastore.client.principal 指定的主体的密钥。此文件必须可供运行 Presto 的操作系统用户读取。

此属性是可选的;没有默认值。

使用 NONE 认证的示例配置

hive.metastore.authentication.type=NONE

Hive 元存储的默认认证类型为 NONE。当认证类型为 NONE 时,Presto 连接到未保护的 Hive 元存储。不使用 Kerberos。

使用 KERBEROS 认证的示例配置

hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=hive/[email protected]
[email protected]
hive.metastore.client.keytab=/etc/presto/hive.keytab

当 Hive 元数据存储 Thrift 服务的身份验证类型为 KERBEROS 时,Presto 将使用属性 hive.metastore.client.principal 指定的 Kerberos 主体进行连接。Presto 将使用 hive.metastore.client.keytab 属性指定的 keytab 对该主体进行身份验证,并验证元数据存储的身份是否与 hive.metastore.service.principal 相匹配。

Keytab 文件必须分发到运行 Presto 的集群中的每个节点。

有关 Keytab 文件的更多信息。

HDFS 身份验证

在 Kerberized Hadoop 集群中,Presto 使用 Kerberos 对 HDFS 进行身份验证。使用以下属性在连接器的属性文件中配置 HDFS 的 Kerberos 身份验证。

属性名称

描述

hive.hdfs.authentication.type

HDFS 身份验证类型。可能的值为 NONEKERBEROS

hive.hdfs.impersonation.enabled

启用 HDFS 最终用户模拟。

hive.hdfs.presto.principal

Presto 连接到 HDFS 时使用的 Kerberos 主体。

hive.hdfs.presto.keytab

HDFS 客户端 keytab 位置。

hive.hdfs.authentication.type

其中之一是 NONEKERBEROS。使用 NONE 的默认值时,Kerberos 认证将被禁用,无需配置其他属性。

设置为 KERBEROS 时,Hive 连接器将使用 Kerberos 对 HDFS 进行身份验证。

此属性是可选的;默认值为 NONE

hive.hdfs.impersonation.enabled

启用最终用户 HDFS 模拟。

部分 最终用户模拟 深入解释了 HDFS 模拟。

此属性是可选的;默认值为 false

hive.hdfs.presto.principal

Presto 连接到 HDFS 时使用的 Kerberos 主体。

此属性值可以使用 _HOST 占位符。连接到 HDFS 时,Hive 连接器将使用 Presto 运行的 **工作节点** 的主机名进行替换。如果每个工作节点都有自己的 Kerberos 主体,这将很有用。

例如:presto-hdfs-superuser/[email protected]presto-hdfs-superuser/[email protected]

此属性是可选的;没有默认值。

hive.hdfs.presto.keytab

包含 hive.hdfs.presto.principal 指定的主体密钥的 keytab 文件的路径。此文件必须可被运行 Presto 的操作系统用户读取。

此属性是可选的;没有默认值。

使用 NONE 身份验证的示例配置

hive.hdfs.authentication.type=NONE

HDFS 的默认身份验证类型为 NONE。当身份验证类型为 NONE 时,Presto 将使用 Hadoop 的简单身份验证机制连接到 HDFS。不使用 Kerberos。

使用 KERBEROS 身份验证的示例配置

hive.hdfs.authentication.type=KERBEROS
[email protected]
hive.hdfs.presto.keytab=/etc/presto/hdfs.keytab

当身份验证类型为 KERBEROS 时,Presto 将使用 hive.hdfs.presto.principal 属性指定的主体访问 HDFS。Presto 将使用 hive.hdfs.presto.keytab keytab 对该主体进行身份验证。

Keytab 文件必须分发到运行 Presto 的集群中的每个节点。

有关 Keytab 文件的更多信息。

HDFS 线程加密

在启用了 HDFS 线程加密的 Kerberized Hadoop 集群中,您可以通过使用 hive.hdfs.wire-encryption.enabled 属性来启用 Presto 访问 HDFS。

属性名称

描述

hive.hdfs.wire-encryption.enabled

启用 HDFS 线程加密。可能的值为 truefalse

注意

根据 Presto 安装配置,使用线程加密可能会影响查询执行性能。

最终用户模拟

模拟访问 HDFS

Presto 可以模拟运行查询的最终用户。在用户从命令行界面运行查询的情况下,最终用户是与 Presto CLI 进程关联的用户名或可选 --user 选项的参数。如果使用 HDFS 权限或 ACL,模拟最终用户可以在访问 HDFS 时提供额外的安全性。

HDFS 权限和 ACL 在 HDFS 权限指南 中进行了说明。

NONE 身份验证与 HDFS 模拟

hive.hdfs.authentication.type=NONE
hive.hdfs.impersonation.enabled=true

当使用 NONE 身份验证与模拟时,Presto 在访问 HDFS 时会模拟正在运行查询的用户。运行 Presto 的用户必须被允许模拟此用户,如部分 Hadoop 中的模拟 中所述。不使用 Kerberos。

KERBEROS 身份验证与 HDFS 模拟

hive.hdfs.authentication.type=KERBEROS
hive.hdfs.impersonation.enabled=true
[email protected]
hive.hdfs.presto.keytab=/etc/presto/hdfs.keytab

当使用 KERBEROS 身份验证与模拟时,Presto 在访问 HDFS 时会模拟正在运行查询的用户。hive.hdfs.presto.principal 属性指定的主体必须被允许模拟此用户,如部分 Hadoop 中的模拟 中所述。Presto 使用 hive.hdfs.presto.keytab 指定的 keytab 对 hive.hdfs.presto.principal 进行身份验证。

Keytab 文件必须分发到运行 Presto 的集群中的每个节点。

有关 Keytab 文件的更多信息。

模拟访问 Hive 元数据存储

Presto 目前不支持在访问 Hive 元数据存储时模拟最终用户。

Hadoop 中的模拟

为了使用 NONE 身份验证与 HDFS 模拟KERBEROS 身份验证与 HDFS 模拟,Hadoop 集群必须配置为允许运行 Presto 的用户或主体模拟登录 Presto 的用户。Hadoop 中的模拟是在文件 core-site.xml 中配置的。配置选项的完整说明可以在 Hadoop 文档 中找到。

有关 Keytab 文件的更多信息

Keytab 文件包含用于对 Kerberos KDC 进行身份验证的加密密钥。这些加密密钥必须安全存储;您应该采取与保护 ssh 私钥相同的预防措施来保护它们。

特别是,对 keytab 文件的访问应限制为实际需要使用它们进行身份验证的帐户。在实践中,这是运行 Presto 进程的用户。应设置 keytab 文件的所有权和权限,以防止其他用户读取或修改这些文件。

Keytab 文件需要分发到运行 Presto 的每个节点。在常见的部署情况下,Hive 连接器配置在所有节点上都将相同。这意味着 keytab 需要位于每个节点上的相同位置。

您应该确保 keytab 文件在分发后在每个节点上都具有正确的权限。

授权

通过在 Hive 目录属性文件中设置 hive.security 属性来启用对 Hive 连接器 的授权检查。此属性必须是以下值之一

属性值

描述

legacy (默认值)

几乎没有强制执行授权检查,因此允许大多数操作。使用配置属性 hive.allow-drop-tablehive.allow-rename-tablehive.allow-add-columnhive.allow-drop-columnhive.allow-rename-column

只读

允许读取数据或元数据(例如 SELECT)的操作,但不允许写入数据或元数据(例如 CREATEINSERTDELETE)的任何操作。

文件

使用 Hive 配置属性 security.config-file 指定的配置文件强制执行授权检查。有关详细信息,请参阅 基于文件的授权

sql-standard

只要用户拥有根据 SQL 标准所需的权限,他们就可以执行操作。在此模式下,Presto 会根据 Hive 元数据存储中定义的权限强制执行对查询的授权检查。要更改这些权限,请使用 GRANTREVOKE 命令。有关详细信息,请参阅 基于 SQL 标准的授权

ranger

用户可以根据在 Ranger Hive 服务中配置的授权策略执行操作。有关详细信息,请参阅 基于 Ranger 的授权

基于 SQL 标准的授权

启用 sql-standard 安全性时,Presto 会强制执行与 Hive 相同的基于 SQL 标准的授权。

由于 Presto 的 ROLE 语法支持与 SQL 标准匹配,而 Hive 并不完全遵循 SQL 标准,因此存在以下限制和差异

  • 不支持 CREATE ROLE role WITH ADMIN

  • 执行 CREATE ROLEDROP ROLE 操作必须启用 admin 角色。

  • 不支持 GRANT role TO user GRANTED BY someone 语法。

  • 不支持 REVOKE role FROM user GRANTED BY someone 语法。

  • 默认情况下,新用户会话中会启用用户的所有角色,除了 admin 角色。

  • 可以通过执行 SET ROLE role 命令选择一个特定的角色。

  • SET ROLE ALL 命令会启用用户的所有角色,除了 admin 角色。

  • 必须通过执行 SET ROLE admin 命令显式启用 admin 角色。

基于文件的授权

配置文件使用 JSON 格式,包含三个部分,每个部分都是一个规则列表,这些规则按配置文件中指定的顺序进行匹配。用户将获得第一个匹配规则中的权限。所有正则表达式默认值为 .*,除非另有指定。

模式规则

这些规则决定谁被认为是模式的所有者。

  • user(可选):与用户名匹配的正则表达式。

  • schema(可选):与模式名称匹配的正则表达式。

  • owner(必需):指示所有权的布尔值。

表规则

这些规则决定对特定表的授权。

  • user(可选):与用户名匹配的正则表达式。

  • schema(可选):与模式名称匹配的正则表达式。

  • table(可选):与表名匹配的正则表达式。

  • privileges(必需):SELECTINSERTDELETEOWNERSHIPGRANT_SELECT 中的一个或多个。

会话属性规则

这些规则决定谁可以设置会话属性。

  • user(可选):与用户名匹配的正则表达式。

  • property(可选):与会话属性名称匹配的正则表达式。

  • allowed(必需):指示该会话属性是否可以设置的布尔值。

以下是一个示例。

{
  "schemas": [
    {
      "user": "admin",
      "schema": ".*",
      "owner": true
    },
    {
      "user": "guest",
      "owner": false
    },
    {
      "schema": "default",
      "owner": true
    }
  ],
  "tables": [
    {
      "user": "admin",
      "privileges": ["SELECT", "INSERT", "DELETE", "OWNERSHIP"]
    },
    {
      "user": "banned_user",
      "privileges": []
    },
    {
      "schema": "default",
      "table": ".*",
      "privileges": ["SELECT"]
    }
  ],
  "sessionProperties": [
    {
      "property": "force_local_scheduling",
      "allow": true
    },
    {
      "user": "admin",
      "property": "max_split_size",
      "allow": true
    }
  ]
}

基于 Ranger 的授权

Apache Ranger 是一个广泛使用的框架,用于提供集中式的安全管理。Ranger 支持各种组件插件,通过与组件集成来实现授权策略管理和验证。Ranger Hive 插件用于扩展 Hive 客户端(如 Beeline)的授权。Presto Ranger 插件用于 Hive 连接器,可以与 Ranger 集成作为访问控制系统,以对使用 Ranger Hive 组件定义的策略配置的 Presto Hive 连接器查询进行授权。当向 Presto 提交查询时,Presto 会解析和分析查询,以了解用户访问模式和表等对象所需的权限。创建这些对象的列表后,Presto 会与 Ranger 服务通信以确定请求是否有效。如果请求有效,则查询将继续执行。如果请求无效,因为用户没有查询对象的必要权限,则会返回错误。Ranger 策略缓存在 Presto 中以提高性能。

身份验证是在 Ranger 外部处理的,例如使用 LDAP,Ranger 使用已验证的用户和用户组与策略定义相关联。

要求

在将 Presto 配置为与 Apache Ranger 集成之前,请验证以下先决条件。

Presto 协调器和工作节点具有与 Ranger 服务通信所需的网络访问权限。通常是端口 6080。

必须使用 Apache Ranger 2.1.0 或更高版本。

策略

策略是一组资源及其关联权限的组合。Ranger 提供用户界面或可选的 REST API 来创建和管理这些访问控制策略。

用户、组和角色

Apache Ranger 具有 UserGroups 同步机制,通过该机制,用户、组和角色来自您配置的 Apache Ranger 身份验证系统。

支持的授权

Ranger Hive 服务允许在模式、表、列级别配置权限。请注意,要限制对特定用户和组的访问,需要使用显式拒绝条件配置 Ranger 策略。

列出模式、显示表元数据和配置会话属性的访问权限默认情况下是启用的。

配置属性

属性名称

描述

默认

hive.ranger.rest-endpoint

Ranger REST 服务的 URL 地址。目前不支持 Kerberos 身份验证。

hive.ranger.refresh-policy-period

刷新缓存策略的间隔。

60 秒

hive.ranger.policy.hive-servicename

Ranger Hive 插件服务名称

hive.ranger.service.basic-auth-username

为基本 HTTP 身份验证配置的 Ranger Hive 插件用户名。

hive.ranger.service.basic-auth-password

为基本 HTTP 身份验证配置的 Ranger Hive 插件密码。

hive.ranger.audit.path

Ranger 审计配置 - Ranger 审计文件路径

ranger.http-client.key-store-path

Ranger SSL 配置 - 客户端密钥库文件路径

ranger.http-client.key-store-password

Ranger SSL 配置 - 客户端密钥库密码

ranger.http-client.trust-store-path

Ranger SSL 配置 - 客户端信任库文件路径

ranger.http-client.trust-store-password

Ranger SSL 配置 - 客户端信任库密码