Hive安全配置

授权

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

属性值说明
legacy(默认值)授权检查很少执行,因此大多数操作都是允许的。使用配置属性hive.allow-drop-tablehive.allow-rename-tablehive.allow-add-columnhive.allow-drop-columnhive.allow-rename-column
read-only允许读数据或元数据的操作(如SELECT),不允许写数据或元数据的操作(如CREATEINSERTDELETE)。
file授权检查使用Hive配置属性security.config-file指定的配置文件来执行。有关详细信息,请参阅基于文件的授权
sql-standard按照SQL标准,只要用户具有所需的权限,就可以执行这些操作。在这种模式下,openLooKeng基于Hive元存储中定义的权限对查询执行授权检查。若要更改这些权限,使用GRANTREVOKE命令。有关详细信息,请参阅基于SQL标准的授权

基于SQL标准的授权

当启用sql-standard安全时,openLooKeng与Hive一样执行基于SQL标准的授权。

由于openLooKeng的ROLE语法支持符合SQL标准,而Hive并不完全遵循SQL标准,因此存在以下限制和差异:

  • 不支持CREATE ROLE role WITH ADMIN
  • 必须启用admin角色才能执行CREATE ROLEDROP ROLE
  • 不支持GRANT role TO user GRANTED BY someone
  • 不支持REVOKE role FROM user GRANTED BY someone
  • 默认在新的用户会话中,用户除角色admin外的所有角色都启用。
  • 通过执行SET ROLE role可以选择特定的角色。
  • SET ROLE ALL启用用户除admin以外的所有角色。
  • admin角色必须通过执行SET ROLE admin显式启用。

身份验证

/connector/hive默认的安全配置在连接Hadoop集群时不使用身份验证。无论哪个用户提交查询,所有查询都以运行openLooKeng进程的用户执行。

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

访问HDFS (Hadoop Distributed File System)时,openLooKeng可以模拟运行查询的最终用户。这可以与HDFS权限和ACLs (Access Control Lists)一起使用,为数据提供进一步的安全性。

警告

当对Hadoop服务使用Kerberos身份验证时,应该使用Kerberos来保护对openLooKeng协调节点的访问。未能安全地访问openLooKeng协调节点可能导致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服务身份验证说明

在Kerberos化Hadoop集群中,openLooKeng使用SASL (Simple Authentication and Security Layer)连接Hive 元存储Thrift服务并使用Kerberos进行身份验证。连接器的属性文件中使用以下属性配置元存储的Kerberos身份验证:

属性名称说明
hive.metastore.authentication.typeHive元存储身份验证类型。
hive.metastore.thrift.impersonation.enabled启用Hive元存储用户模拟。
hive.metastore.service.principalHive元存储服务的Kerberos主体。
hive.metastore.client.principalopenLooKeng在连接到Hive元存储服务时将使用的Kerberos主体。
hive.metastore.client.keytabHive元存储客户端keytab位置。
hive.metastore.krb5.conf.pathKerberos配置文件位置。

hive.metastore.authentication.type

NONEKERBEROS。使用默认值NONE时,Kerberos身份验证被禁用,无需配置其他属性。

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

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

hive.metastore.service.principal

Hive元存储服务的Kerberos主体。openLooKeng协调节点将使用此属性对Hive元存储进行身份验证。

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

示例:hive/hive-server-host@EXAMPLE.COMhive/_HOST@EXAMPLE.COM

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

hive.metastore.client.principal

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

此属性值中可使用_HOST占位符。当连接到Hive元存储时,Hive连接器会替换openLooKeng所在的工作节点的主机名。如果每个工作节点都有自己的Kerberos主体,此属性非常有用。

示例:openlookeng/openlookeng-server-node@EXAMPLE.COMopenlookeng/_HOST@EXAMPLE.COM

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

警告

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

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

hive.metastore.client.keytab

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

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

hive.metastore.krb5.conf.path

Kerberos配置文件的路径。该文件必须可由运行openLooKeng的操作系统用户读取。

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

NONE身份验证配置示例

  1. hive.metastore.authentication.type=NONE

Hive元存储默认的身份验证类型为NONE。当身份验证类型为NONE时,openLooKeng连接不安全的Hive元存储。不使用Kerberos。

KERBEROS身份验证配置示例

  1. hive.metastore.authentication.type=KERBEROS
  2. hive.metastore.thrift.impersonation.enabled=true
  3. hive.metastore.service.principal=hive/hive-metastore-host.example.com@EXAMPLE.COM
  4. hive.metastore.client.principal=openlk@EXAMPLE.COM
  5. hive.metastore.client.keytab=/etc/openlookeng/hive.keytab
  6. hive.metastore.krb5.conf.path=/etc/openlookeng/krb5.conf

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

Keytab文件需要分发到集群中每一个运行openLooKeng的节点。

Keytab文件附加信息

HDFS身份验证

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

属性名称说明
hive.hdfs.authentication.typeHDFS身份验证类型。取值为NONEKERBEROS
hive.hdfs.impersonation.enabled启用HDFS终端用户模拟。
hive.hdfs.presto.principalopenLooKeng在连接到HDFS时将使用的Kerberos主体。
hive.hdfs.presto.keytabHDFS客户端keytab位置。
hive.hdfs.wire-encryption.enabled启用HDFS有线加密。

hive.hdfs.authentication.type

NONEKERBEROS。使用默认值NONE时,Kerberos身份验证被禁用,无需配置其他属性。

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

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

hive.hdfs.impersonation.enabled

启用终端用户HDFS模拟。

End User Impersonation章节将深入介绍HDFS模拟。

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

hive.hdfs.presto.principal

openLooKeng在连接到HDFS时将使用的Kerberos主体。

此属性值中可使用_HOST占位符。当连接到HDFS时,Hive连接器会替换openLooKeng所在的工作节点的主机名。如果每个工作节点都有自己的Kerberos主体,此属性非常有用。

示例:openlookeng-hdfs-superuser/openlookeng-server-node@EXAMPLE.COM

openlookeng-hdfs-superuser/_HOST@EXAMPLE.COM

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

hive.hdfs.presto.keytab

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

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

hive.hdfs.wire-encryption.enabled

在使用使用HDFS有线加密的Kerberos化Hadoop集群中,此属性需要设置为true,允许openLooKeng访问HDFS。注意,使用有线加密可能会影响查询执行性能。

NONE身份验证配置示例

  1. hive.hdfs.authentication.type=NONE

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

KERBEROS身份验证配置示例

  1. hive.hdfs.authentication.type=KERBEROS
  2. hive.hdfs.presto.principal=hdfs@EXAMPLE.COM
  3. hive.hdfs.presto.keytab=/etc/openlookeng/hdfs.keytab

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

Keytab文件需要分发到集群中每一个运行openLooKeng的节点。

Keytab文件附加信息

终端用户模拟

模拟访问HDFS

openLooKeng可以模拟运行查询的终端用户。对于从命令行界面运行查询的用户,最终用户是与openLooKeng CLI进程或可选--user选项的参数关联的用户名。如果使用了HDFS权限或ACL,模拟最终用户可以在访问HDFS时提供进一步的安全性。

HDFS权限和ACL在HDFS权限指南中有说明。

使用HDFS模拟进行NONE身份验证

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

当使用模拟进行NONE身份验证时,openLooKeng在访问HDFS时模拟运行查询的用户。如configuring-hadoop-impersonation章节中所述,运行openLooKeng的用户必须允许模拟此用户。不使用Kerberos。

使用HDFS模拟进行KERBEROS身份验证

  1. hive.hdfs.authentication.type=KERBEROS
  2. hive.hdfs.impersonation.enabled=true
  3. hive.hdfs.presto.principal=openlk@EXAMPLE.COM
  4. hive.hdfs.presto.keytab=/etc/openlookeng/hdfs.keytab

当使用模拟进行KERBEROS身份验证时,openLooKeng在访问HDFS时模拟运行查询的用户。如configuring-hadoop-impersonation章节中所述,hive.hdfs.presto.principal指定的主体必须允许模拟此用户。openLooKeng使用hive.hdfs.presto.keytab指定的keytab对hive.hdfs.presto.principal进行身份验证。

Keytab文件需要分发到集群中每一个运行openLooKeng的节点。

Keytab文件附加信息

模拟访问Hive元存储

openLookeng支持在访问Hive元存储时模拟最终用户,可以使用以下配置启用元存储模拟

  1. hive.metastore.thrift.impersonation.enabled=true

当用户模拟时使用KERBEROS元存储身份验证时,通过配置hive.metastore.client.principal属性指定的主体必须允许当前的openLooKeng用户来模拟,如[在Hadoop中模拟](# 在Hadoop中模拟)章节所述。

在Hadoop中模拟

为了使用HDFS模拟进行NONE身份验证或使用HDFS模拟进行KERBEROS身份验证,Hadoop集群必须配置为允许openLooKeng正在运行的用户或主体模拟登录到openLooKeng的用户。Hadoop模拟配置在core-site.xml文件中。配置选项的完整描述见Hadoop文档

Keytab文件附加信息

Keytab文件包含加密密钥,用于对Kerberos KDC (Key Distribution Center)的主体进行身份验证。必须安全地存储这些加密密钥;应采取与保护SSH私钥相同的预防措施来保护。

特别是,对keytab文件的访问应该仅限于实际需要使用它们进行身份验证的账号。在实际操作中,这个账号是运行openLooKeng进程的用户。应设置keytab文件的属主和权限,防止其他用户读取或修改keytab文件。

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

分发keytab文件后,需要确保keytab文件在每个节点上都有正确的权限。

基于文件的授权

config文件使用JSON指定,由三个部分组成,每个部分都是按config文件中指定的顺序匹配的规则列表。授予用户第一个匹配规则的权限。如果不指定,所有正则表达式都默认为.*

模式规则

这些规则控制着谁被认为是一个模式的所有者。

  • user(可选):用于匹配用户名的正则表达式。
  • schema(可选):用于匹配模式名的正则表达式。
  • owner(必选):boolean类型,表示所有权。

表规则

这些规则管理授予特定表的权限。

  • user(可选):用于匹配用户名的正则表达式。
  • schema(可选):用于匹配模式名的正则表达式。
  • table(可选):用于匹配表名的正则表达式。
  • privileges(必选):SELECTINSERTDELETEOWNERSHIPGRANT_SELECT中的零个或多个。

会话属性规则

这些规则控制谁可以设置会话属性。

  • user(可选):用于匹配用户名的正则表达式。
  • property(可选):用于匹配会话属性名的正则表达式。
  • allowed(必选):boolean类型,是否设置该会话属性。

示例如下:

  1. {
  2. "schemas": [
  3. {
  4. "user": "admin",
  5. "schema": ".*",
  6. "owner": true
  7. },
  8. {
  9. "user": "guest",
  10. "owner": false
  11. },
  12. {
  13. "schema": "default",
  14. "owner": true
  15. }
  16. ],
  17. "tables": [
  18. {
  19. "user": "admin",
  20. "privileges": ["SELECT", "INSERT", "DELETE", "OWNERSHIP"]
  21. },
  22. {
  23. "user": "banned_user",
  24. "privileges": []
  25. },
  26. {
  27. "schema": "default",
  28. "table": ".*",
  29. "privileges": ["SELECT"]
  30. }
  31. ],
  32. "sessionProperties": [
  33. {
  34. "property": "force_local_scheduling",
  35. "allow": true
  36. },
  37. {
  38. "user": "admin",
  39. "property": "max_split_size",
  40. "allow": true
  41. }
  42. ]
  43. }