前文回顾:
1.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(1)
2.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(2)
3.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(3)
4.如何掌握openGauss数据库核心技术?秘诀一:拿捏SQL引擎(4)
5.如何掌握openGauss数据库核心技术?秘诀二:拿捏执行器技术(1)
6.如何掌握openGauss数据库核心技术?秘诀二:拿捏执行器技术(2)
7.如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(1)
8.如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(2)
9.如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(3)
10.如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(4)
11.如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(5)
12.如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(6)
13.如何掌握openGauss数据库核心技术?秘诀三:拿捏存储技术(7)
14.如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(1)
15.如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(2)
16.如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(3)
17.如何掌握openGauss数据库核心技术?秘诀四:拿捏事务机制(4)
18.如何掌握openGauss数据库核心技术?秘诀五:拿捏数据库安全(1)
19.如何掌握openGauss数据库核心技术?秘诀五:拿捏数据库安全(2)
20.如何掌握openGauss数据库核心技术?秘诀五:拿捏数据库安全(3)
21.如何掌握openGauss数据库核心技术?秘诀五:拿捏数据库安全(4)
目录
Ⅰ.openGauss安全机制概览
Ⅱ.openGauss安全认证
Ⅲ.openGauss角色管理机制
Ⅳ.openGauss审计与追踪
Ⅴ.openGauss数据安全技术
1.数据加密算法
2.数据脱敏技术
3.透明加密技术
4.全程加密技术
Ⅵ.openGauss云安全技术
Ⅶ.openGauss智能安全机制
五.openGauss数据安全技术
数据库最重要的作用是存储数据和处理分析数据。数据是整个数据库系统中最关键的资产。因此在保护系统不受侵害的基础上最为重要的任务就是保护数据的安全。常见的数据安全技术包括数据加密、数据脱敏(Data Masking)、透明加密(Transparent Data Encryption,TDE)和全程加密(Always Encryption)技术。这里囊括了数据的动态流程和静态存储行为。
数据加密算法
01
数据加解密是防止数据隐私泄露最为常见也最为有效的手段之一。数据在经过加密后以密文形式存放在指定的目录下。加密的意义在于,通过一系列复杂的迭代计算,将原本的明文转换为随机的没有任何具体含义的字符串,即密文。当所使用的加密算法足够安全时,攻击者在有限的计算资源下将很难根据密文获取到明文信息。
常见的加密算法可分为对称加密算法和非对称算法。其中最为著名的非对称加密算法叫RSA算法,其密钥长度须达到3072才可以保证其安全性,即强安全。常见的对称加密算法为AES算法,如AES128和AES256。相比于非对称加密算法,对称加密算法运算速度快,密文长度增长少,安全性容易证明,所需要的密钥长度短,但也存在密钥分发困难,不可以用于数字签名等缺点。除了上述介绍的加密算法外,还有很多其他强安全算法,在此不一一介绍。下面将重点介绍openGauss中所支持的数据加密能力。
首先openGauss在内核定义了数据加解密的函数,并对外提供了数据加解密的接口,函数接口为:
gs_encrypt_aes128(text, initial_value);
其中,text为需要加密的明文数据,initial_value为生成密钥时需要的初始化向量。该函数可以被灵活的应用在SQL语法的各个地方。如通过使用INSERT语法插入数据或者查询数据时均可以绑定该函数对数据进行加密处理,具体如下:
SELECT * FROM gs_encrypt_aes128(tbl.col, ‘1234’);
通过该查询,用户可以直接返回表tbl中的col列的密文信息。
与加密函数相对应的是解密函数,其接口格式定义为:
gs_decrypt_aes128(cypertext, initial_value);
其中cypertext为加密之后的密文,initial_value需要为与加密时所采用的相同的值才可以。否则使用该函数也无法得到正确明文。
除了基本的数据加解密接口外,openGauss还在多个特性功能里提供了数据加解密功能。其中第一个提供加解密功能的特性是数据导入导出;第二个提供加解密功能的特性是数据库备份恢复。
数据脱敏技术
02
在很多应用场景下,用户需要通过拥有表中某一列的访问权来执行任务,但是又不能获取所做事务之外其他的权限。以快递人员举例,快递人员在递送包裹的时候需要知道收件人的联系方式和姓氏,但是无需知道对应的收件人的全称。在快递收件人信息部分,如果同时定义了收件人的姓名和电话,则暴露了收件人的隐私信息,“有心之人”可以通过此信息进行虚假信息构造或利用该隐私信息进行财产欺诈。因此在很多情况下,所定义的敏感信息是不建议对外展现的。
数据脱敏是解决此类问题的最有效方法之一,通过对敏感数据信息的部分信息或全量信息进行特殊处理可以有效掩盖敏感数据信息的真实部分,从而达到保护数据隐私信息的目的。数据脱敏按照脱敏呈现的时机可以分为数据动态脱敏和数据静态脱敏,其中前者在数据运行时对数据进行特殊处理,后者在数据存储的时候进行特殊处理以防止攻击者通过提取数据文件来直接获取敏感信息。在本文中,将重点介绍数据动态脱敏技术。
数据动态脱敏的安全意义在于:
§ 用户在实际操作的时候无需真实数据只需要使用一个变化后的数据进行操作,可有效规避数据信息的直接暴露。
§ 在不同的国家及地区的法律合规中,如GDPR,约定不同的用户在管理数据的时候具有不同的访问对象权限。
§ 对于表中的同一列数据信息,不同的用户应具有不同的用途。
数据动态脱敏功能在数据库内核实际上表现为数据处理函数。通过函数处理使得数据库中的数据在返回给实际查询用户时数据值发生变更,如用户所有的年龄信息值在返回给客户端时均显示为“0”;又或是字符串数据中的部分字节位变更为其他字符,如信用卡卡号“1234 5678 0910 1112”在返回给客户端时显示为“XXXX XXXX XXXX 1112”。
在openGauss系统中,数据动态脱敏策略的语法定义如下所示:
CREATE MASKING_POLICY policy_name
(
(masking_clause)
[filter_clause]
[ENABLE|DISABLE]
);
其中具体的参数说明如下:
§ masking_clause语法定义如下:
MASKING_FUNCTION(PARAMETERS) ON (SCOPE(FQDN)) | (LABEL(resource_label_name)) [, …]*;
定义了针对不同数据集合对象所采用的脱敏函数。这里LABEL为数据库安全标签,数据库安全标签实际上定义了一组数据内部的表对象或表中的部分列,用于标记相应数据脱敏策略的范围。
§ filter_clause语法定义如下:
FILTER ON FILTER_TYPE(filter_value [, …]*) [, …]*;
定义了数据动态脱敏策略所支持的过滤条件。
一个实际的数据动态脱敏案例如下:
CREATE MASKING_POLICY my_masking_policy
creditcardmasking ON LABEL (mask_credcard),
maskall ON LABEL (mask_all)
FILTER ON IP(local), ROLES(dev);
其中,my_mask_polidy为定义的数据动态脱敏策略名字;creditcardmasking以及maskall为定义的masking处理函数,分别用于处理从属于mask_credcard对象集合和mask_all对象集合;mask_credcard和mask_all代表不同的Label对象,这些Label对象名称将作为唯一标识记录在系统表中。FILTER表示当前动态脱敏策略所支持的连接源,连接源指的是实际数据库管理员使用何种用户,从何IP源位置发起,使用何种APP应用来访问当前的数据库。通过使用FILTER可以有效定义系统的访问源信息,并规避不应该访问当前系统的行为。
openGauss在系统内部预定义了七种数据脱敏策略。具体如表1所示:
脱敏策略 | 含义 | 脱敏前数据 | 脱敏后数据 |
---|---|---|---|
creditcardmasking | 针对信用卡定义类数据的脱敏策略 | 4880-9898-4545-2525 | xxxx-xxxx-xxxx-2525 |
maskall | 全脱敏策略 | 4880-9898-4545-2525 | xxxxxxxxxxxxxxxxxxx |
basicemailmasking | 邮件类信息基础脱敏策略:脱敏用户名 | alex@gmail.com | xxxx@gmail.com |
fullemailmasking | 邮件类信息全脱敏策略 | alex@gmail.com | xxxx@xxxxx.com |
alldigitsmasking | 数字脱敏策略 | alex123alex | alex000alex |
shufflemasking | 置换脱敏策略 | hello word | ollehdlrow |
randommasking | 随机脱敏策略 | hello word | ad5f5ghdf5 |
表1 数据脱敏策略
用户在实际使用时,还可以根据自己的需求自行定义数据脱敏策略。
透明加密技术
03
当数据在静态存储状态时,除了使用常见的静态脱敏进行数据隐私保护外。另外一种行之有效的方法是透明加密(TDE)。事实上,静态脱敏在实际应用过程中是存在一定的限制的。用户并不能对所有的数据类型都施加静态脱敏措施。
数据透明加密从加密策略出发,即使用户数据被导出,也可以有效解决数据信息泄露风险。数据透明加密的初衷是为了防止第三方人员绕过数据库认证机制,直接读取数据文件中的数据(数据文件中的数据虽然是二进制数据,但是仍然是明文存放)。所以对数据库的数据文件进行加密后,必须在数据库启动后,用户通过正常途径连接数据库,才可以读取解密后的数据,达到数据保护的目的。
openGauss实施透明加密策略,首先是需要确定一个数据库密钥(Database Encryption Key,DEK),该DEK由系统密钥管理系统(Key Management Service,KMS)生成,数据库密钥密文(Encrypted Database Encryption Key,EDEK)以文件方式(gs_tde_keys.cipher)存储于数据库系统中。该DEK一次生成,终身使用,不可变更,不可轮换。在快照(即备份)恢复时,需要使用此前的DEK。
数据库节点在每次启动时,通过读取本地存储的密钥信息和密钥密文(EDEK),向KMS机器上的URL地址,传入密钥版本名(version-name),密钥名(name),IV值和数据库加密密钥密文值,从而获取到解密后的数据库加密密钥DEK。此密钥会缓存在节点的内存当中,当数据库需要加解密数据时从内存中拷贝密钥明文。
openGauss支持两种格式的透明加密算法,通过GUC参数transparent_encryption_algo来进行控制,当前支持的算法包括AES-CTR-128和SM4-CTR-128。加密模式选用CTR(CounTeR,计数器模式)的原因是CTR流加密可以保证明文和密文长度相等。明文和密文长度相等是由数据块(Block)的大小决定的,因为内存和磁盘存储格式对Block的大小是有要求的(默认8K)。特别的,在openGauss列存储中,列存储单元(Column Unit,CU)的最大大小是有限制的,所以也不能存在加密后长度超过最大限制。
一个完整的透明加密流程如图6所示。即该特性的生命周期共分为3个阶段:安装阶段、启动阶段和使用阶段。
§ 安装阶段用户通过安装部署的配置,生成密钥记录文件和GUC参数。
§ 启动阶段依据密钥记录文件和GUC参数,获取到明文。
§ 使用阶段用户根据密钥算法标记和全局缓存明文,完成数据落盘的加密和数据读取的解密。
图6 透明加密流程
全程加密技术
04
无论是当前通用数据脱敏方案,还是数据透明加密方案,其所解决的都是部分状态或部分流程下的数据隐私安全。数据库攻击者可通过其他不同的攻击技术手段在数据以明文存在的阶段或处于内存中的时候抓取数据流信息,从而达到获取数据隐私数据的目的。如果数据在整个生命周期过程中都能够处于加密的形态,且密钥掌握在用户自己手中。则数据库用户可有效的防止数据隐私安全泄露。
全程加密技术就是在这种场景下诞生的。其核心是使得数据从用户手中进入到数据库系统后一直处于加密状态,用户所关心的数据分析过程也在密态状态下完成。在整个数据分析处理过程中,即使用户数据被攻击者窃取,由于密钥一直掌握在客户自己手中,攻击者也无法获得相关的信息。目前该技术处于研发阶段,对应产品尚未向客户发布。
openGauss数据库分成三个阶段来实现完整的全程加密功能。
§ 第一阶段是客户端全程加密能力,系统在客户端提供数据加解密模块和密钥管理模块,在这种设计思路下数据在客户端完成加密后进入数据库,在完成处理分析返回结果的时候在客户端完成解密功能,客户端全程加密的缺陷在于只能支持等值类查询。
§ 在第二阶段,将在服务端实现基于密文场景的密文查询和密文检索能力,使得数据库具备更加强大的处理能力。
§ 第三阶段openGauss将构建基于可信硬件的可信计算能力。在此我们将基于鲲鹏芯片来构建数据库的可信计算能力。在可信硬件中,完成对数据的解密和计算。数据从可信硬件进入到真实世界后,将再加密成密文返回给客户。
一个完整的openGauss数据库全程加密方案架构如图7所示。
图7 openGauss 全程加密示意图
首先来介绍openGauss客户端全程加密方案,我们也称之为客户端列加密方案(Client Column Encryption,CCE)。在该方案中,首先应该由用户来指定对哪一列数据进行加密,通过在指定的属性列后面加上关键字“encrypted”来进行标记,如下述语法所示:
CREATE TABLE test_encrypt(creditcard varchar(19) encrypted);
为了有效保证加密数据的安全性并支持数据的密态查询,在内核中我们选用确定性AES算法,具体来说其加密算法为:
AEAD_AES_256_CBC_HMAC_SHA_256。整个方案中使用双层密钥方案,第一层根密钥用户向密钥管理中心获取,作为根密钥(master key)。第二层为数据加密密钥,也称之为工作密钥。工作密钥通过根密钥加密后存放在服务器端。在加密列创建完成后,如果没有工作密钥,则系统会单独为该列创建一个工作密钥。不同的属性列可以通过创建语法指定并共享列加密密钥。
为保证整个系统的安全性,加密工作密钥的加密算法强度应高于使用工作密钥加密数据的强度。在openGauss数据库中,我们使用RSA-OAEP算法来加密工作密钥,而根密钥仅存放在客户端。密钥层次关系如图8所示。
图8 全程加密方案密钥管理方案
由于采用确定性加密算法,对于相同的明文,所获取的密文也是相同的。在这种机制下,客户端全程加密可有效的支持等值查询,我们只需要将对应的查询条件中的参数按照对应属性列的加密算法进行加密,并传给服务端即可。一个完整的客户端全程加密逻辑流程如图9所示。在流程图的客户端部分,我们需要优先检查相关信息的有效性。
图9 客户端加密方案查询流程图
客户端全程加密方案是非常简单易懂的,通过确定加密机制保障结果的正确性和完整性。但对于日益复杂的查询任务来说,客户端全程加密方案是远远不够的。因为客户端全程加密仅仅能满足那些等值查询的查询任务,如等值条件查询、分组、连接操作等等。对于那些更为复杂的数据搜索,比较查询、范围查询等等,则需要更为复杂的密态查询算法或服务端可信硬件方案。
事实上,密文查询算法和检索算法在学术界一直都是热点的研究方向,如OPE(Order Preserve Encryption)/ORE(Order Reveal Encryption)算法、SSE(Symmetric Searchable Encryption)算法等。openGauss将针对排序、范围查询、模糊检索实现纯软件态的密文查询和密文检索。纯软方案的缺陷在于由于在密文状态下进行运算,会导致系统整体性能变慢。为了支持密态计算,需要密文在计算完成后解密的结果与明文计算所获得的结果相同。全同态加密是最行之有效的算法,可有效解决数据在密文形态下的加法和乘法计算,而不暴露相关明文信息。但是全同态加密最大的问题在于其性能过于低效,以至于没有一款商业数据库支持该能力,哪怕是部分同态加密能力,如加法同态或者乘法同态。
在第三阶段,openGauss将提供基于可信硬件的密态计算能力。其核心是数据以密文形态进入服务端可信硬件中并完成所需要的密文计算。可信硬件将系统内核分为安全世界和非安全世界。数据计算完成后再以密文形态返回给非安全世界,并最终返回给客户端。目前通用的Intel芯片和ARM芯片均提供了相类似的功能。在Intel芯片中,该隔离区域被称之为SGX(Software Guard Extensions)。SGX是一个被物理隔离的区域,数据即使以明文形式存放在该物理区域内,攻击者也无法访问。在ARM架构中,与其类似的功能被称之为Trust Zone,基于Trust Zone,人们可以构建可信操作系统(Trusted OS),然后可以开发相对应的可信应用。基于可信计算环境,用户可以解密这些数据进行各类数据库查询操作。当数据离开这些环境后,数据则以密文形态存在,并返回给客户再进行解密。从而起到保护数据隐私的目的。
未完待续......