一种密钥权限可动态管理的Hive列级数据加密方法及系统

阅读: 评论:0

著录项
  • CN202211085531.6
  • 20220906
  • CN115146245A
  • 20221004
  • 杭州比智科技有限公司
  • 卢薇
  • G06F21/31
  • G06F21/31 G06F21/60 H04L9/40

  • 浙江省杭州市余杭区仓前街道仓兴路1号23幢2-4楼
  • 浙江(33)
  • 北京云科知识产权代理事务所(特殊普通合伙)
  • 张飙
摘要
本发明公开了一种密钥权限可动态管理的Hive列级数据加密方法及系统,所述方法包括如下步骤:S1.Hive表权限申请;S2.提交HQL;S3.获取用户认证凭证;S4.Kerberos认证;S5.HQL任务提交;S6.创建表以及表密钥;S7.更新表元数据信息;S8.提交MapReduce作业;S9.获取表密钥;S10.获取用户表字段权限;S11.基于序列化的字段解密;S12.基于反序列化的字段加密。本发明的密钥权限可动态管理的Hive列级数据加密方案能够实现自动化数据加密和解密和基于用户权限的密钥管理,满足实际生产环境中的安全需求,提高了加密效率和数据安全性。
权利要求

1.一种密钥权限可动态管理的Hive列级数据加密方法,其特征在于,所述方法包括如下步骤:

S1. Hive表权限申请:用户向用户权限管理单元申请表创建权限,用户权限管理单元为用户创建相应的Kerberos认证主体以及keytab,并且向密钥管理服务为用户的Kerberos认证主体同步申请访问控制和创建密钥权限,实现密钥权限动态管理;

S2. 提交HQL:用户向HQL提交代理单元提交创建表的DDL语句;

S3. 获取用户认证凭证:HQL提交代理单元向用户权限管理单元获取用户的Kerberos认证主体和keytab文件;

S4. Kerberos认证:HQL提交代理单元根据用户的Kerberos认证主体和keytab文件进行Kerberos认证;

S5. HQL任务提交:Kerberos认证通过后,建表的DDL语句被作为HQL任务提交到Hive;

S6. 创建表以及表密钥:Hive将DDL语句转化为DDL任务,在建表的过程中连接密钥管理服务单元并使用DDL语句中的表密钥名称创建表密钥;

S7. 更新表元数据信息:在建表结束前,Hive将表的元数据信息更新到Hive元数据库;

S8. 提交MapReduce作业:在建表之后,当其他用户按照步骤S1-S5提交表查询和表插入的HQL任务后,Hive为其分别生成Fetch和MapRed任务并且转化为MapReduce作业提交到Yarn上去执行;

S9. 获取表密钥:表查询的MapReduce作业算子树上叶子节点将对应表扫描算子,表扫描算子在读取表的行数据时,需要进行序列化操作,序列化器在进行序列化之前根据用户信息和表密钥名称向密钥管理服务获取表密钥;

S10. 获取用户表字段权限:若成功获取表密钥,序列化器向用户权限管理获取用户的字段权限;

S11. 基于序列化的字段解密:序列化器只对有密钥和有权限的字段进行解密,其他情况下字段将直接按存储内容传递,不做加工处理;

S12. 基于反序列化的字段加密:表插入的MapRecuce作业算子树上叶子节点将对应文件输出算子,文件输出算子在将行数据写入表文件之前,需要进行反序列化操作,序列化器在进行反序列化时再次重复步骤S9获取表密钥,然后根据表密钥对表中需要加密的字段进行加密。

2.根据权利要求1所述的一种密钥权限可动态管理的Hive列级数据加密方法,其特征在于,步骤S1中,用户在提交HQL之前需要进行Hive表权限的申请,来保证HQL能够成功执行;用户权限管理单元中的表权限申请模块负责处理用户的表权限申请以及维护用户的表权限信息,并且向密钥管理服务单元为用户的Kerberos认证主体同步申请访问控制和创建密钥权限;由于密钥的创建和访问控制可通过用户权限管理单元动态配置,实现密钥权限可动态管理。

3.根据权利要求2所述的一种密钥权限可动态管理的Hive列级数据加密方法,其特征在于,步骤S2中,所述DDL语句包含了表名、字段名、字段类型、加密字段列表、密钥管理服务器地址、表密钥名称、加密算法和序列化及反序列化方式信息;用户将HQL发送给HQL提交代理,由HQL提交代理提交HQL任务。

4.根据权利要求3所述的一种密钥权限可动态管理的Hive列级数据加密方法,其特征在于,步骤S3中,HQL提交代理在提交HQL任务之前向用户权限管理获取用户的Kerberos认证主体和keytab文件;用户权限管理单元的Kerberos凭证管理模块和用户认证凭证管理模块负责维护这些信息。

5.根据权利要求4所述的一种密钥权限可动态管理的Hive列级数据加密方法,其特征在于,步骤S4中,HQL提交代理根据获取到的Kerberos认证主体和keytab文件进行Kerberos认证,认证通过后向Hive提交HQL任务;Kerberos认证通过后,Hive会话中维护的用户信息将是Kerberos认证实体对应的信息。

6.根据权利要求5所述的一种密钥权限可动态管理的Hive列级数据加密方法,其特征在于,步骤S5中,HQL提交代理将HQL任务提交给Hive之后,Hive会根据HQL类型生成相应的任务;针对表创建,Hive生成DDL创建表任务;针对表插入,Hive生成MapRed任务;针对表查询,Hive生成Fetch任务。

7.根据权利要求6所述的一种密钥权限可动态管理的Hive列级数据加密方法,其特征在于,步骤S6中,针对DDL创建表任务,HQL中指定序列化、序列化属性和表属性信息,Hive将创建表HQL转化为DDL任务,对应着Hive Java源码中DDLTask,对DDLTask中的createTable和createTableLike方法进行改写;改写后的Hive建表流程中增加了连接密钥管理服务器创建表密钥的过程;只有表密钥创建成功,才能继续执行,否则中止表创建过程。

8.根据权利要求7所述的一种密钥权限可动态管理的Hive列级数据加密方法,其特征在于,步骤S6中表创建成功后自动连接Hive元数据库更新表的元数据信息;步骤S8中,当表创建成功后,用户提交表插入和表查询HQL任务时,Hive生成对应的MapRed和Fetch任务,最终翻译为MapReduce作业提交到Yarn上去执行。

9.根据权利要求8所述的一种密钥权限可动态管理的Hive列级数据加密方法,其特征在于,步骤S9中,在表读出时的序列化和表写入时的反序列化过程中,都需要根据属性hive.kms.uri和hive.encrypt.keynames向密钥管理服务获取表密钥;首先,序列化器向密钥管理服务单元提出获取密钥请求;然后,用户权限管理模块获取请求中携带的用户认证主体,根据表中的用户密钥接入权限控制,判断用户是否具有创建密钥权限;密钥管理模块根据请求中密钥名称检查用户是否具有密钥访问权限,如果有,密钥获取成功,否则获取失败。

10.一种密钥权限可动态管理的Hive列级数据加密系统,其特征在于,所述系统用于实现根据权利要求1-9任一项所述的密钥权限可动态管理的Hive列级数据加密方法,所述系统包括用户权限管理单元、密钥管理服务单元、HQL提交代理单元;用户权限管理单元包含三个模块,分别是表权限申请模块、Kerberos凭证管理模块和用户认证凭证管理模块;表权限申请模块负责处理用户的表权限申请请求以及维护用户的表权限信息;Kerberos凭证管理模块负责管理接入用户的Kerberos keytab文件;密钥管理服务单元包含用户接入权限管理模块和密钥管理模块;用户接入权限管理模块管理用户对应的Kerberos认证主体的访问控制;对于具有访问控制权限的Kerberos认证主体,密钥管理模块管理认证主体创建和获取密钥的安全;HQL提交代理单元负责接受用户提交的HQL,然后从用户权限管理单元获取用户的Kerberos认证主体和keytab文件,进行Kerberos认证,认证通过后,最终将HQL任务提交给Hive去执行。

说明书
技术领域

本发明涉及计算机通信及数据安全领域,尤其涉及一种密钥权限可动态管理的Hive列级数据加密方法及系统。

随着企业数据量从TB级向PB级快速增长,以“Hadoop”为核心的大数据组件成为搭建现代数据仓库和数据分析平台的关键技术。其中,Hive是必不可少的一个工具,这主要是因为它提供一个SQL(Structured Query Language, 结构化查询语言)方言(被称为HiveQL或HQL),可以查询存储在Hadoop分布式文件系统(Hadoop Distributed File System,HDFS)和HBase(一种基于列存储的非关系型数据库系统)中的海量数据,从而能够降低将基于SQL的关系型数据库实现的传统数据仓库移植到Hadoop上的障碍。不同于传统关系型数据库已经能够提供一系列成熟的数据安全解决方案,Hive则以一种开放的方式解决数据安全问题。虽然Hive提供基于角的权限管控,但是对于数据细粒度权限管控、脱敏和加密等企业P0级数据安全需求,Hive只提供开放接口,具体解决方案需要企业按需实现。因而,实现密钥权限可动态管理的Hive列级数据加密成为许多企业亟待解决的技术难题。

数据加密能够保障数据存储安全,而基于权限的数据解密则能够保障数据接入安全。在大多数生产场景中,Hive的数据会存储在HDFS中。针对数据存储安全,HDFS提供透明加密功能,这是一种文件级别的数据加密方案。所谓“透明加密”是指文件的加密和解密对于HDFS客户端是透明无感知的。也正因为如此,HDFS的透明加密只能防止非法用户通过窃取磁盘等方式破坏数据的机密性,而不能为Hive上层应用程序提供基于用户权限的数据接入安全保障。另外,相较于文件级别的数据加密,大多数企业更倾向对Hive中的表数据实现列级别(或者字段级别)加密,即只对表中一部分涉密列进行加密,来缓解数据加密和解密对业务性能造成的负面影响。目前企业常用的Hive列级加密大多是基于Hive的自定义函数(User Defined Functions, UDFs)实现。它们首先利用Hive提供的UDF接口实现加密和解密函数,然后在涉密列上通过绑定加密或解密函数来实现Hive中表字段的加密或解密。

现存数据加密方案存在以下两类问题:1)加密和解密函数必须在写业务HQL的过程中手动添加,这一方面会影响业务开发效率,另一方面也会破坏“select *”进而使得原本可以通过“select *”来避免触发MapReduce任务变得不可行;2)密钥保存在加密和解密函数中,不能够动态获取,容易被破解,存在很大的安全隐患。因而,本发明通过实现1)自动化数据加密和解密和2)基于用户权限的密钥管理两方面技术创新来弥补现有Hive列级数据加密方案在效率和安全两方面存在的不足。

如前所述,现有的Hive数据加密方案,一部分是基于HDFS透明加密实现,另一部分是基于Hive自定义函数实现。第一种方案只能够进行HDFS层的文件加密,数据一旦通过HDFS客户端获取就是明文状态,因而无法在Hive上层应用程序层提供用户级别的数据机密性保护。这种加密方案只能作为Hive数据加密的底层辅助方案。第二种方案需要人工参与1)自定义加密和解密UDF函数开发,2)将UDF函数注册为Hive永久函数,3)在业务HQL中为涉密字段绑定加密和解密UDF函数。第二种方案虽然能够实现Hive列级数据加密,但是在效率和安全两方面存在明显缺陷。在效率方面,加密和解密UDF需要人工参与,影响HQL的开发和执行效率,无法做到自动化数据加密和解密。在安全方面,密钥内嵌在加密和解密函数中,容易被破解,存在极大的安全隐患。

针对现有技术存在的问题,本发明的目的在于从效率和安全两方面进行技术创新,提出了一种密钥权限可动态管理的Hive列级数据加密方案,能够实现1)自动化数据加密和解密和2)基于用户权限的密钥管理,满足实际生产环境中的安全需求。

为实现上述目的,本发明提供一种密钥权限可动态管理的Hive列级数据加密方法,所述方法包括如下步骤:

S1. Hive表权限申请:用户向用户权限管理单元申请表创建权限,用户权限管理单元为用户创建相应的Kerberos认证主体以及keytab,并且向密钥管理服务为用户的Kerberos认证主体同步申请访问控制和创建密钥权限,此步骤对应着密钥权限动态管理;

S2. 提交HQL:用户向HQL提交代理单元提交创建表的DDL语句;

S3. 获取用户认证凭证:HQL提交代理单元向用户权限管理单元获取用户的Kerberos认证主体和keytab文件;

S4. Kerberos认证:HQL提交代理单元根据用户的Kerberos认证主体和keytab文件进行Kerberos认证;

S5. HQL任务提交:Kerberos认证通过后,建表的DDL语句被作为HQL任务提交到Hive;

S6. 创建表以及表密钥:Hive将DDL语句转化为DDL任务,在建表的过程中连接密钥管理服务单元并使用DDL语句中的表密钥名称创建表密钥;

S7. 更新表元数据信息:在建表结束前,Hive将表的元数据信息更新到Hive元数据库;

S8. 提交MapReduce作业:在建表之后,当其他用户按照步骤S1-S5提交表查询和表插入的HQL任务后,Hive为其分别生成Fetch和MapRed任务并且转化为MapReduce作业提交到Yarn上去执行;

S9. 获取表密钥:表查询的MapReduce作业算子树上叶子节点将对应表扫描算子,表扫描算子在读取表的行数据时,需要进行序列化操作,序列化器在进行序列化之前根据用户信息和表密钥名称向密钥管理服务获取表密钥;

S10. 获取用户表字段权限:若成功获取表密钥,序列化器向用户权限管理获取用户的字段权限;

S11. 基于序列化的字段解密:序列化器只对有密钥和有权限的字段进行解密,其他情况下字段将直接按存储内容传递,不做加工处理;

S12. 基于反序列化的字段加密:表插入的MapRecuce作业算子树上叶子节点将对应文件输出算子,文件输出算子在将行数据写入表文件之前,需要进行反序列化操作,序列化器在进行反序列化时再次重复步骤S9获取表密钥,然后根据表密钥对表中需要加密的字段进行加密。

进一步,步骤S1中,用户在提交HQL之前需要进行Hive表权限的申请,来保证HQL能够成功执行;用户权限管理单元中的表权限申请模块负责处理用户的表权限申请以及维护用户的表权限信息。

进一步,步骤S2中,所述DDL语句包含了表名、字段名、字段类型、加密字段列表、密钥管理服务器地址、表密钥名称、加密算法和序列化及反序列化方式信息;用户将HQL发送给HQL提交代理,由HQL提交代理提交HQL任务。

进一步,步骤S3中,HQL提交代理在提交HQL任务之前向用户权限管理获取用户的Kerberos认证主体和keytab文件;用户权限管理单元的Kerberos凭证管理模块和用户认证凭证管理模块负责维护这些信息。

进一步,步骤S4中,HQL提交代理根据获取到的Kerberos认证主体和keytab文件进行Kerberos认证,认证通过后向Hive提交HQL任务;Kerberos认证通过后,Hive会话中维护的用户信息将是Kerberos认证实体对应的信息。

进一步,步骤S5中,HQL提交代理将HQL任务提交给Hive之后,Hive会根据HQL类型生成相应的任务;针对表创建,Hive生成DDL创建表任务;针对表插入,Hive生成MapRed任务;针对表查询,Hive生成Fetch任务。

进一步,步骤S6中,针对DDL创建表任务,HQL中指定序列化、序列化属性和表属性信息。Hive将创建表HQL转化为DDL任务,对应着Hive Java源码中DDLTask,对DDLTask中的createTable和createTableLike方法进行改写;改写后的Hive建表流程中增加了连接密钥管理服务器创建表密钥的过程;只有表密钥创建成功,才能继续执行,否则中止表创建过程;对Hive源码中DDL任务的创建表进行改写,使得表在创建的过程中自动向密钥管理服务单元创建表密钥,并且更新Hive元数据库中表元数据信息,元数据信息中维护着需要脱敏的字段。

进一步,步骤S6中表创建成功后自动连接Hive元数据库更新表的元数据信息;步骤S8中,当表创建成功后,用户提交表插入和表查询HQL任务时,Hive生成对应的MapRed和Fetch任务,最终翻译为MapReduce作业提交到Yarn上去执行。

进一步,步骤S9中,在表读出时的序列化和表写入时的反序列化过程中,都需要根据属性hive.kms.uri和hive.encrypt.keynames向密钥管理服务获取表密钥;首先,序列化器向密钥管理服务单元提出获取密钥请求;然后,用户权限管理模块获取请求中携带的用户认证主体,根据表中的用户密钥接入权限控制,判断用户是否具有创建密钥权限;密钥管理模块根据请求中密钥名称检查用户是否具有密钥访问权限,如果有,密钥获取成功,否则获取失败;

另一方面,本发明还提供一种密钥权限可动态管理的Hive列级数据加密系统,所述系统用于实现本发明所述的密钥权限可动态管理的Hive列级数据加密方法,所述系统包括用户权限管理单元、密钥管理服务单元、HQL提交代理单元;用户权限管理单元包含三个模块,分别是表权限申请模块、Kerberos凭证管理模块和用户认证凭证管理模块;表权限申请模块负责处理用户的表权限申请请求以及维护用户的表权限信息;Kerberos凭证管理模块负责管理接入用户的Kerberos keytab文件;密钥管理服务单元包含用户接入权限管理模块和密钥管理模块;用户接入权限管理模块管理用户对应的Kerberos认证主体的访问控制;对于具有访问控制权限的Kerberos认证主体,密钥管理模块管理认证主体创建和获取密钥的安全;HQL提交代理单元负责接受用户提交的HQL,然后从用户权限管理单元获取用户的Kerberos认证主体和keytab文件,进行Kerberos认证,认证通过后,最终将HQL任务提交给Hive去执行。

本发明的技术方案架构设计中设置了用户权限管理、密钥管理服务、HQL提交代理和序列化/反序列化之间的交互逻辑和功能职责;提出了Hive创建表方案,基于用户权限的自动化字段加密和解密的序列化器。本发明的有益效果在于:1)本发明的技术方案架构设计能够满足企业内部Hive列级数据加密需求;2)本发明能够实现基于用户权限的密钥管理和列级数据加密和解密,提供更安全的数据保护;3)本发明提出的Hive创建表方案能够透明化表密钥创建过程;4)本发明提出的序列化器com.startdt.datablack.hive.ql.CyptoSerde能够实现在序列化/反序列化过程基于用户权限的自动化字段加密和解密。

图1示出了根据本发明实施例一种密钥权限可动态管理的Hive列级数据加密方法及系统的设计架构示意图;

图2示出了根据本发明实施例一种密钥权限可动态管理的Hive列级数据加密方法及系统中Hive表创建流程修改前后对比示意图;

图3示出了根据本发明实施例一种密钥权限可动态管理的Hive列级数据加密方法及系统中创建密钥过程流程图;

图4示出了根据本发明实施例一种密钥权限可动态管理的Hive列级数据加密方法及系统中获取Hive表密钥流程图。

下面将结合附图,对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

在本发明的描述中,需要说明的是,术语“中心”、“上”、“下”、“左”、“右”、“竖直”、“水平”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。此外,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。

在本发明的描述中,需要说明的是,除非另有明确的规定和限定,术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以根据具体情况理解上述术语在本发明中的具体含义。

以下结合图1-图4对本发明的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本发明,并不用于限制本发明。

图1示出了根据本发明的密钥权限可动态管理的Hive列级数据加密方法及系统总体技术方案架构设计图。其中,基于Hive、Yarn和HDFS,本发明的加密系统包括用户权限管理单元、密钥管理服务单元、HQL提交代理单元,以及实现表创建改写以及基于序列化/反序列化的字段加密和解密等功能。

本发明的密钥权限可动态管理的Hive列级数据加密系统中,用户权限管理单元包含三个模块,分别是表权限申请模块、Kerberos凭证管理模块和用户认证凭证管理模块。表权限申请模块负责处理用户的表权限申请请求以及维护用户的表权限信息。Kerberos凭证管理模块负责管理接入用户的Kerberos keytab文件,每一个接入用户会有一个对应的Kerberos认证主体(Principal),而一个认证主体对应一个keytab文件。在进行Kerberos认证时需要同时提供认证主体和keytab文件。用户认证凭证管理模块维护用户和Kerberos凭证之间的映射关系。密钥管理服务单元(Key Management Service, KMS)包含用户接入权限管理模块和密钥管理模块。用户接入权限管理模块管理用户对应的Kerberos认证主体的访问控制。对于具有访问控制权限的Kerberos认证主体,密钥管理模块管理这些认证主体创建和获取密钥的安全。HQL提交代理单元负责接受用户提交的HQL,然后从用户权限管理单元获取用户的Kerberos认证主体和keytab文件,进行Kerberos认证,认证通过后,最终将HQL任务提交给Hive去执行。

表创建改写模块是本发明的改进技术。本发明对Hive源码中DDL任务的创建表进行改写,使得表在创建的过程中自动向密钥管理服务单元创建表密钥,并且更新Hive元数据库中表元数据信息,元数据信息中维护着需要脱敏的字段、密钥管理服务器地址、表密钥名称、加密算法及序列化和反序列化方式。基于序列化和反序列化的字段加密和解密是本发明的另一个改进技术。本发明提供序列化和反序列化的具体实现。

当HQL提交代理单元向Hive提交表插入和查询任务时,Hive生成相应的MapRed和Fetch任务,并且将任务转化为MapReduce作业提交到Yarn上去执行。MapReduce作业本质上是一个算子树,其中表的读取需要通过表扫描算子,表的写入需要通过文件输出算子,算子之间的数据通信模式是Row对象,Row对象是一种结构化数据,代表表中的一行记录。表扫描算子的作用是将HDFS存储的表文件按行进行读出,其实现流程如下:

首先,借助InputFormat对象将文件字节流转换为Writable对象;

然后,序列化将Writable对象转换为表扫描算子能够处理的Row对象。

其中,序列化流程如下:

首先,获取当前会话的用户信息;

然后,根据用户信息向密钥管理服务单元获取表密钥以及向用户权限管理单元获取用户表字段权限;

最后,对Writable对象的每一列按照获取的表密钥和用户字段权限进行字段数据解密,对于没有表密钥和/或字段权限情况,字段数据将不进行解密,以密文输出,最终转化为一个Row对象。

文件输出算子的作用是将Row对象插入到HDFS存储的表文件中,在这个过程中首先需要对Row对象进行反序列化为Writable对象,然后借助OutputFormat对象将Writable对象转换为字节流追加到HDFS上的表文件中。

反序列化流程如下:

首先,获取当前会话的用户信息;

然后,根据用户信息向密钥管理服务单元根据表密钥名称获取表密钥;

继而用表密钥对表中需要加密的字段进行加密,最终转化为一个Writable对象。

综上,在本发明的技术方案架构设计中,密钥权限可动态管理的Hive列级数据加密方法包括如下步骤:

S1. Hive表权限申请;用户向用户权限管理单元申请表创建权限,用户权限管理单元会为用户创建相应的Kerberos认证主体以及keytab,并且向密钥管理服务为用户的Kerberos认证主体同步申请访问控制和创建密钥权限,此步骤对应着密钥权限动态管理;

S2. 提交HQL;用户向HQL提交代理单元提交创建表的DDL语句,其中包含了表名、字段名、字段类型、加密字段列表、密钥管理服务器地址、表密钥名称、加密算法和序列化/反序列化方式等信息;

S3. 获取用户认证凭证;HQL提交代理单元向用户权限管理单元获取用户的Kerberos认证主体和keytab文件;

S4. Kerberos认证;HQL提交代理单元根据用户的Kerberos认证主体和keytab文件进行Kerberos认证;

S5. HQL任务提交;Kerberos认证通过后,建表的DDL语句会被作为HQL任务提交到Hive;

S6. 创建表以及表密钥;Hive将DDL语句转化为DDL任务,在建表的过程中会连接密钥管理服务单元并使用DDL语句中的表密钥名称创建表密钥;

S7. 更新表元数据信息;在建表结束前,Hive还会将表的元数据信息更新到Hive元数据库;

S8. 提交MapReduce作业;在建表之后,当其他用户按照步骤S1-S5提交表查询和表插入的HQL任务后,Hive会为它们分别生成Fetch和MapRed任务并且转化为MapReduce作业提交到Yarn上去执行;

S9. 获取表密钥;表查询的MapReduce作业算子树上叶子节点将对应表扫描算子,表扫描算子在读取表的行数据时,需要进行序列化操作,序列化器在进行序列化之前根据用户信息和表密钥名称向密钥管理服务获取表密钥;

S10. 获取用户表字段权限;如果成功获取密钥,序列化器向用户权限管理获取用户的字段权限;

S11. 基于序列化的字段解密;序列化器只对有密钥和有权限的字段进行解密,其他情况下字段将直接按存储内容传递,不做加工处理;

S12. 基于反序列化的字段加密;表插入的MapRecuce作业算子树上叶子节点将对应文件输出算子,文件输出算子在将行数据写入表文件之前,需要进行反序列化操作,序列化器在进行反序列化时同样需要通过步骤S9来获取表密钥,然后根据表密钥对表中需要加密的字段进行加密。

上述各个步骤中的详细技术内容如下:

步骤S1中,用户在提交HQL之前需要进行Hive表权限的申请,来保证HQL能够成功执行。这里将以与字段加密和解密相关的创建表、表查询和表插入三个权限为例。用户权限管理单元中的表权限申请模块负责处理用户的表权限申请以及维护用户的表权限信息。

如下表1所示,admin@startdt用户具有表“safe_test”的创建和插入权限,worker1@startdt用户具有表“safe_test”的部分字段查询权限,能够查询的字段为{id, name, religion},worker2@startdt用户具有表“safe_test”的全字段查询权限。注意,表1中权限是用户向表权限申请模块申请和审批的结果。

表1

表“safe_test”的表结构设计如下表2所示,其中展示了字段名和字段类型,{idcard, name, email}三个字段需要进行加密处理。

表2

步骤S2中,用户将HQL发送给HQL提交代理,由HQL提交代理提交HQL任务。HQL提交代理一方面能够防止用户凭证信息冒用,另一方面也能够阻挡一部分非法用户,避免网络攻击。

步骤S3中,HQL提交代理在提交HQL任务之前需要向用户权限管理获取用户的Kerberos认证主体和keytab文件。用户权限管理单元的Kerberos凭证管理模块和用户认证凭证管理模块负责维护用户的Kerberos认证主体和keytab文件信息。如表3所示,Kerberos凭证管理中创建好了三个认证主体,相对应的keytab文件和krb5.conf文件已经放在HQL提交代理所在的物理服务器上,表格中给出了路径信息,三个认证主体对应的linux用户也在表格中给出。这里,linux用户是指HQL提交代理、Hive、Yarn和HDFS服务所在物理主机上的linux用户,这主要是因为在默认情况下以“Hadoop”为核心的大数据组件均以linux用户作为身份认证对象。

表3

表4展示了表1中三个用户账号与表3中三个认证主体之间的映射关系。假设admin@startdt用户向HQL提交代理提交HQL,代理获取的Kerberos认证主体和keytab文件将分别是simba@STARTDT.COM和/opt/startdt/keytabs/simba.keytab。

表4

步骤S4中,HQL提交代理根据获取到的Kerberos认证主体和keytab文件进行Kerberos认证,认证通过后向Hive提交HQL任务。Kerberos认证通过后,Hive会话中维护的用户信息将是Kerberos认证实体对应的信息。比如,HQL提交代理使用simba@STARTDT.COM认证主体进行Kerberos认证,Hive、Yarn和HDFS都会将simba@STARTDT.COM所对应的linux用户simba作为当前用户,密钥管理服务的访问控制权限校验也是针对simba用户。

步骤S5中,HQL提交代理将HQL任务提交给Hive之后,Hive会根据HQL类型生成相应的任务。比如,针对表创建,Hive会生成DDL创建表任务;针对表插入,Hive会生成MapRed任务;针对表查询,Hive会生成Fetch任务。

步骤S6中,针对DDL创建表任务,HQL中需要指定序列化、序列化属性和表属性等信息。下列代码是针对表2中“safe_test”的建表HQL,其中指定了序列化方式、序列化属性和表属性。

下表5对上面代码中序列化方式和属性进行了详细解释。其中指定了密钥管理服务器地址、密钥名称、加密列、加密算法以及序列化方式。序列化方式必须指定本发明实现的com.stardt.datablack.hive.ql.CryptoSerde,其他配置参数都是为com.stardt.datablack.hive.ql.CryptoSerde在字段加密和解密过程中提供必要信息,可根据实际情况灵活设置。

表5

Hive将创建表HQL转化为DDL任务,对应着Hive Java源码中DDLTask,对DDLTask中的createTable和createTableLike方法进行改写,改写前后的流程对比如图2所示。从图中可以看出,修改后的Hive建表流程中增加了连接密钥管理服务器创建表密钥的过程(右侧的步骤S3-S5),只有表密钥创建成功,才能继续执行,否则中止表创建过程。

图3展示了根据表属性hive.kms.uri和hive.encrypt.keynames向密钥管理服务器创建表密钥的过程。首先,DDL创建表任务以simba@STARTDT.COM向密钥管理服务单元提出创建密钥请求,密钥名称为“safetest”。然后,用户权限管理模块获取请求中携带的用户认证主体,根据下表6中的用户密钥接入权限控制,判断用户是否具有创建密钥权限。

表6

由于simba@START.COM具有创建密钥权限,请求继续转发为密钥管理模块,否则用户管理权限直接拒绝请求,创建表任务将中止。密钥管理模块根据请求中密钥名称创建相应的密钥,并且设置密钥的访问控制,如图3中所示,simba、tenant1和tenant2具有密钥“safetest”的访问权限。这种两层密钥访问控制权限设计能够更好地保护密钥的安全和密钥权限的灵活可配置性。最后,如果表密钥创建成功,DDL创建表任务继续向下执行,直到表创建成功。

步骤S6中表创建成功后会自动连接Hive元数据库更新表的元数据信息。

步骤S8中,当表创建成功后,用户提交表插入和表查询HQL任务时,Hive会生成对应的MapRed和Fetch任务,最终翻译为MapReduce作业提交到Yarn上去执行。MapReduce作业本质上是一个算子树,其中表的读取需要通过表扫描算子,表的写入需要通过文件输出算子,算子之间的数据通信模式是Row对象(一种结构化数据,代表表中的一行记录)。表扫描算子的作用是将HDFS存储的表文件按行进行读出,在这个过程中首先会借助InputFormat对象将文件字节流转换为Writable对象,然后序列化会将Writable对象转换为表扫描算子能够处理的Row对象。文件输出算子的作用是将Row对象插入到HDFS存储的表文件中,在这个过程中首先需要对Row对象进行反序列化为Writable对象,然后借助OutputFormat对象将Writable对象转换为字节流追加到HDFS上的表文件中。

步骤S9中,在表读出时的序列化和表写入时的反序列化过程中,都需要根据表6属性hive.kms.uri和hive.encrypt.keynames向密钥管理服务获取表密钥。图4展示了获取表密钥流程。首先,序列化器以tenant1@STARTDT.COM或tenant2@STARTDT.COM向密钥管理服务单元提出获取密钥请求,密钥名称为“safetest”。然后,用户权限管理模块获取请求中携带的用户认证主体,根据表中的用户密钥接入权限控制,判断用户是否具有创建密钥权限。由于tenant1@STARTDT.COM或tenant2@STARTDT.COM具有获取密钥权限,请求继续转发给密钥管理模块,否则用户管理权限直接拒绝请求,密钥获取失败。密钥管理模块根据请求中密钥名称检查用户是否具有密钥访问权限,如果有,密钥获取成功,否则获取失败。由于tenant1@STARTDT.COM或tenant2@STARTDT.COM具有获取名为“safetest”密钥权限,他们将成功获取密钥。

步骤S10中,针对表查询,表读取时的序列化还需要向用户权限管理获取用户表字段权限。如上表2所示,worker1@startdt用户具有表“safe_test”的部分字段查询权限,能够查询的字段为{id, name, religion},worker2@startdt用户具有表“safe_test”的全字段查询权限。worker1@startdt对应着tenant1@STARTDT.COM,worker2@startdt对应着tenant2@STARTDT.COM。由于两个用户具有不同的表字段查询权限,两个用户查询表“safetest”将会得到不同的查询结果。

步骤S11中,序列化会将Writable对象转换为表扫描算子能够处理的Row对象。在序列化的过程中,基于步骤S9和步骤S10获取的表密钥和用户表字段权限,对Writable对象的每一列进行字段数据解密,对于没有表密钥或/和字段权限情况,字段数据将不进行解密,以底层存储内容输出,最终转化为一个Row对象。在一个具体实施例中,表2中“safe_test”的数据如下表7所示:

表7

由于字段{idcard, phone, email}为加密字段,在表查询时只有有表密钥和字段权限的用户才能够看到三个字段的真实数据,否则只能看到三个字段的密文数据。根据本发明的权限设计,tenant1用户通过Hive客户端Beeline查询表“safe_test”结果如下所示:

而tenant2用户查询表“safe_test”结果如下所示:

对比两张图的结果可以看到,对于tenant1,由于它只有{id, name, religion}三个字段权限,查询结果中{idcard, phone, email}三列数据都是密文;而对于tenant2,由于它具有所有字段的查询权限,查询结果中所有列的数据都和如下数据一致,为明文状态。

步骤S12中,序列化会将文件输出算子处理后的Row对象转化Writable对象,然后借助OutputFormat对象将Writable对象转换为字节流追加到HDFS上的表文件中。在反序列化的过程中,基于步骤九获取表密钥,继而用表密钥对表中需要加密的字段进行加密,最终转化为一个Writable对象。在将表7中的表“safe_test”存储到HDFS上之后,HDFS上表文件内容如上段中的数据所示。其中三个需要加密的列在HDFS表文件中都是密文存储。

本发明从效率和安全两方面进行技术创新,提出了一种密钥权限可动态管理的Hive列级数据加密方案,能够实现1)自动化数据加密和解密和2)基于用户权限的密钥管理,满足实际生产环境中的安全需求。

本发明有四大关键点:1)本发明的技术方案架构设计能够满足企业内部Hive列级数据加密需求,2)本发明能够实现基于用户权限的密钥管理和列级数据加密和解密,提供更安全的数据保护,3)本发明提出的Hive创建表方案能够透明化表密钥创建过程,4)本发明提出的序列化器com.startdt.datablack.hive.ql.CyptoSerde能够实现在序列化/反序列化过程基于用户权限的自动化字段加密和解密。

在本说明书的描述中,参考术语“实施例”、“示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。在本说明书中,对上述术语的示意性表述不必须针对的是相同的实施例或示例。此外,本领域的技术人员可以在不产生矛盾的情况下,将本说明书中描述的不同实施例或示例以及其中的特征进行结合或组合。

上述内容虽然已经示出和描述了本发明的实施例,可以理解的是,上述实施例是示例性的,不能理解为对本发明的限制,本领域的普通技术人员在本发明的范围内可以对上述实施例进行变化、修改、替换和变型等更新操作。

本文发布于:2023-04-15 00:28:32,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/4/86809.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图