书接上文数据库高安全---数据保护:数据动态脱敏,从数据动态脱敏方面对高斯数据库的数据保护技术进行了解读,本篇将从数据透明加密方面继续介绍GaussDB数据库的高安全性能。
5.2 数据透明加密
透明数据加密(Transparent Data Encryption,TDE),也简称透明加密,是指数据库对将要落盘的数据自动进行加密,读取的时候自动进行解密,同时外部用户或应用程序对数据使用过程中对整个加解密过程透明无感知。通过存储层的静态数据加密,可以防止攻击者绕过数据库认证机制直接读取数据存储中的敏感信息,即使磁盘文件被窃取,但磁盘中敏感信息已经加密,窃取者无法解密而得不到有效的用户数据,从而保证了数据的安全。
透明加密不保护传输中的数据,数据在内存中不进行加解密,可以有效的保证内存中数据的读写性能,数据只在落盘时候加密保存。
GaussDB提供的透明加密特性有以下几个优势:
-
精细 **的加密粒度:**可以支持表级加密,在创建表时指定是否需要被加密,数据库可自动对表中数据进行加密存储。
-
安全 **的密钥存储方案:**密钥通过外部KMS服务(华为云KMS、混合云KMS)进行托管,数据库通过RESTFUL API进行密钥创建和管理工作。数据的加密密钥的明文,缓存在内存中,使用哈希键值对做索引关系,保证密钥的查询效率,并且提供密钥明文定时清除机制保证密钥明文的安全性。数据加密密钥的密文会跟随数据的PAGE一起落盘存储,从而保证了数据加解密过程中的准确性和高效性。
-
灵活 **的密钥轮转方案:**一个加密表对应一个数据密钥,当用户认为当前的加密表的密钥时间过长或者不再安全以后,可以使用密钥在线轮转功能,可以将当前加密表的数据加密密钥轮转到新的数据加密密钥。
(1)GaussDB透明加密架构
应用在使用透明加密表的过程中会触发GaussDB的透明数据加密功能:在对加密表做DML插入或者查询操作时,密钥管理模块负责获取数据加密密钥,并在内存中缓存密钥明文,磁盘数据模块负责将数据明文使用密钥明文加密为数据密文并附加密钥密文共同落盘存储;解密时通过读取磁盘上的PAGE信息中的密钥密文,从密钥管理模块获取密钥明文,并解密数据密文为数据明文。GaussDB透明数据加密整体架构如图1所示。

图1 透明加密架构图
(2)加解密流程
当用户启用透明数据加密功能并创建加密表时,数据库会向KMS服务发送API请求获取数据加密密钥的密文,并存入系统表PG_CLASS中。当往加密表中插入数据时,数据会先存在缓冲区管理器的BUFFER中,以明文的形式保存。当BUFFER中的内容需要刷盘时,先在缓存中查找是否有可用的密钥明文缓存,如果有则直接使用,如果没有,则向KMS发送API请求获取密钥明文并同时将明文插入缓存,最后使用密钥明文、随机生成的IV值、用户指定的加密算法对数据进行加密,并且将数据加密密钥密文和IV值插入数据页中,在落盘以后物理文件PAGE页就是数据密文、密钥密文及IV值的集合。而解密是相反的过程。
密钥管理模块
GaussDB透明加密使用的密钥管理模块(图2)包含两部分:一是GaussDB内部密钥管理者模块,二是外部密钥管理服务KMS。

图2 密钥管理模块
内部密钥管理者组件
主要负责数据加密密钥的创建、获取明文等控制行为,并且提供一系列密钥处理机制保证加解密过程的安全性和性能。密钥管理者是整个密钥管理模块的核心大脑,负责所有行为的统筹、执行与管理。
-
密钥管理:与KMS交互创建数据加密密钥,获取数据加密密钥明文密文。
-
密钥缓存:将数据加密密钥明文密文进行哈希键值对缓存。
-
密钥持久化:数据加密密钥密文、主密钥ID会被存入系统表中。
-
密钥定时清除:定时清理内存中缓存的密钥明文。
-
密钥在线轮转:支持用户触发数据加密密钥轮转。
密钥管理机制
透明加密特性使用三级密钥管理,密钥分为根密钥(RK)、主密钥(CMK)和数据加密密钥(DEK),CMK由RK加密,DEK由CMK加密,而数据由DEK加密,每一张表对应一个数据加密密钥DEK。根密钥(RK)和主密钥(CMK)通过KMS(Key Management Service)生成并加密存储,数据库通过RESTFUL API获取到用户需要的数据加密密钥(DEK)的密文和明文。获取到的DEK密文和明文会分别做持久化和缓存处理:密文持久化保证用户在系统表中可以看到加密表的密钥信息标识,缓存的密钥明文可以保证加密和解密过程快速获取到需要的密钥明文进行加解密操作。
密钥缓存机制
GaussDB透明数据加密的密钥管理模块了提供了一个进程级别的缓存进行密钥缓存以提升查询密钥明文的效率,一个GaussDB进程下启用一个进程级别动态哈希表进行数据加密密钥的明文和密文的缓存处理,key是密文,value是明文,每次通过密文查询明文,因为密文是持久化保存的,在数据加解密模块的存储层BUFFER中没有明文信息时,可以快速的从密钥哈希表中获取到密钥的明文,减少访问KMS的次数从而提升加解密效率。
密钥定时清除机制
根据密钥管理的安全标准要求:"数据加密密钥的密文可以落盘存储,密钥的明文不可以明文落盘存储,只能在内存中使用,并且要保证定时清除"。为了兼顾安全与性能,GaussDB会短期缓存密钥,并提供了定时清除机制来保证其安全性。在每一次缓存密钥密文明文对的同时会生成一个时间戳,每隔一个小时,会清除一次密钥缓存,从而减少密钥泄露风险。
密钥持久化机制
GaussDB将透明加密相关信息持久化到系统表PG_CLASS中的reloptions字段中,信息包括:数据加密密钥密文,主密钥ID,加密算法以及是否使能透明加密开关标识。用户可以在查看加密表时看到加密表相关信息。密钥持久化更重要的作用在于:当向加密表插入新数据生成PAGE页面时,若缓存中没有密钥密文,则可直接从系统表中获取,不需要再与KMS进行交互。
密钥在线轮转机制
密钥可更新才能更好保证密钥使用的安全。密钥使用时间越长,攻击者花费精力去破解它的诱惑也越大,这使得密钥被破解的风险也越大;如果密钥已经泄露,那么密钥被使用的时间越久,损失越大。为消除以上风险,GaussDB透明数据加密技术支持数据密钥在线轮转,同时也支持主密钥的轮转,从而提升密钥使用的安全性。
密钥在线轮转当前支持用户触发,给用户最大的选择权,当用户认为某个加密表的密钥不安全或者时间久了,就可以指定该表进行密钥在线轮转操作。进行密钥轮转操作后,系统表中的密钥密文会被更新;对于更新密钥后产生的新数据页,使用新的密钥进行加密,对于旧的数据页,如果没有读取到数据页,不处理旧的数据页,如果读取到数据页,使用旧密钥进行解密,然后再使用新密钥加密。密钥轮转时不会改表加密算法。
外部密钥管理服务KMS
除了内部的密钥管理者模块外,透明加密特性依赖外部密钥管理服务(Key Management Service,KMS)来进行密钥的托管。上文中已经提到过,透明加密特性使用三级密钥管理,密钥分为根密钥(RK)、主密钥(CMK)和数据加密密钥(DEK),数据由DEK加密,而DEK由CMK加密,CMK由RK加密。RK和CMK在外部KMS创建并进行加密存储,当创建数据加密表时,由内部数据管理者模块通过网络或其他途径向KMS发送请求创建DEK,获取DEK明文和密文,用于数据的加密和解密。当密钥在线轮转触发时,密钥管理者模块重新申请DEK,使用新DEK对表进行加密和解密。
目前大部分的云服务均提供KMS服务,当前GaussDB支持的外部KMS服务有:华为云KMS、混合云 KMS。KMS会为应用程序提供访问接口,数据库使用RESTFUL接口访问KMS。访问KMS前需要进行身份认证,目前,华为云KMS支持账号与密码认证、AKSK认证两种方式。
华为云密钥管理服务KMS
华为云密钥管理服务(Key Management Service,KMS),是一种安全、可靠、简单易用的密钥托管服务,可以使用密钥的全生命周期管理(创建,查看,启用,禁用等),数据加密密钥的管理(仅限API)等功能,保护密钥的安全。KMS通过使用硬件安全模块HSM(Hardware Security Module)保护密钥的安全,所有的用户密钥都由HSM中的根密钥保护,避免密钥泄露。KMS对密钥的所有操作都会进行访问控制及日志跟踪,提供所有密钥的使用记录,满足审计和合规性要求。
更加具体的华为云KMS服务介绍可参考https://support.huaweicloud.com/productdesc-dew/dew_01_0001.html
使用场景
当创建的数据表中包含敏感数据,为了防止敏感数据静态泄漏可以使用透明加密功能。但需注意有使用约束,见特性约束章节。
特性约束
规格
-
密钥管理:支持华为KMS(公有云KMS混合云KMS)
-
加密算法:支持AES_128_CTR(默认算法)、SM4_CTR
-
密钥轮转:支持轮转数据密钥
-
加密表转换:支持将加密表转换为非加密表,支持将加密表转换而来的非加密表重新转换为加密表
-
存储引擎:支持Astore、Ustore表
约束
-
密钥管理:需保证每个数据库节点与KMS之间网络通畅。
-
特性开关:如果已创建加密表并向加密表中写入数据,在关闭透明加密后,无法对加密表进行读写操作。
-
加密表转换:加密表转换为非加密表时,数据库不对新数据进行加密,但仍保留系统表和数据文件中的加密信息。非加密表转换为加密表时,要求非加密表保留加密信息。
-
物化视图:不支持加密物化视图。
-
索引、xlog、系统表:仅支持加密加密表数据文件,不支持加密其他可能含有部分加密表数据的文件,包括索引文件、xlog文件、PG_STATISTIC系统表文件和core文件等。
-
region:不支持单集群跨region的多副本主备同步,不支持单集群跨region的扩容,不支持跨region的备份恢复、集群容灾和数据迁移场景。
-
备份恢复:不支持细粒度备份恢复。
-
数据膨胀:与非加密表相比,加密表数据文件中存储了加密信息,额外存储空间占用在5%以内。
依赖关系
透明加密特性依赖外部密钥管理服务提供密钥管理功能
国密算法支持
随着信息安全上升到国家安全高度,数据安全作为信息安全的重要组成部分,如何保障数据安全也成为了重要方向之一。长期以来,我国金融、政企等行业都沿用3DES,RSA等国际通用的密码算法体系和标准,加密算法的自主性受到极大限制。近年来有关机关和监管机构站在国家安全和长远战略的高度,提出了推动国密算法落地,以摆脱对国外加密算法和产品的过度依赖,增强加密算法的自主性和安全性。
国密算法,是由国家密码管理局认定和公布的密码算法标准及其应用规范,主要包括SM1,SM2、SM3 、SM4、SM7、SM9、祖冲之密码算法(ZUC)等,随着近些年国家相关政策的推广,多个行业已陆续开始使用国密算法来替代传统的加密算法。
GaussDB的透明加密功能除支持AES_128_CTR算法外还支持使用国密SM4算法CTR模式进行对数据的加密和解密。SM4是分组对称加密算法,密钥长度和分组长度均为128位。加密算法与密钥扩展算法都采用32轮非线性迭代结构。数据解密和数据加密的算法结构相同,只是轮密钥的使用顺序相反,解密轮密钥是加密轮密钥的逆序。从密钥长度上看,SM4加密算法安全性与AES-128相当,比3DES算法要更安全。
透明加密配置
使用透明加密特性的主要流程包括如下几步:
-
创建主密钥:在云服务控制台开通KMS服务,使用KMS创建1个主密钥,记录主密钥ID。
-
开启透明加密:在数据库中,通过GUC参数开启透明加密,并配置KMS服务器地址、主密钥ID、KMS身份认证信息等用于访问KMS的参数,然后重启数据库。
-
创建加密表。
-
对加密表执行其他操作。
创建主密钥
创建主密钥需要在云服务控制台开通KMS服务,在数据库使用RESTFUL API访问KMS时,需提供服务器地址、认证信息、项目信息等参数,这些参数需在云控制台上获取,获取方式如下:
场景一:华为云场景AKSK认证
-
**KMS服务器地址**:https://kms.项目.myhuaweicloud.com/v1.0/$项目ID/kms。部分混和云场景下,需按实际部署场景设置地址。
-
$主密钥ID:使用KMS创建主密钥后,可在密钥列表查看密钥ID。

- AK,SK:登录云"控制台",单击右上角用户名,进入"我的凭证",选择"程序密钥",通过"新增访问密钥"创建AK与SK,创建完成后下载密钥(即AK与SK)

场景二:华为云场景账号与密码认证
-
$主密钥ID:使用KMS创建主密钥后,可在密钥列表查看密钥ID。
-
IAM用户名,账号名,项目,项目ID:登录云"控制台",单击右上角用户名,进入"我的凭证",选择"API凭证",即可获取相关参数。

-
$IAM用户密码:即IAM用户的密码。
-
**IAM服务器地址**:https://iam.项目.myhuaweicloud.com/v3/auth/tokens。部分混和云场景下,需按实际部署场景设置地址。
-
**KMS服务器地址**:https://kms.项目.myhuaweicloud.com/v1.0/$项目ID/kms。部分混和云场景下,需按实际部署场景设置地址。
开启透明加密
1.设置GUC参数,使能透明加密
gs_guc set -D DATADIR -c"enable_tde=on"
2.设置用于对接KMS的参数tde_key_info
使用key=value格式设置参数,各参数间使用逗号分隔
场景一:华为云/混合云AK/SK认证场景
gs_guc set ... -c "tde_key_info='\ keyType=$KMS类型,\ kmsUrl=$KMS服务器地址,\ mkid=$主密钥ID', \ authType=aksk'"# 示例为华为云KMS,混合云场景将keyType的值替换为hcs_kmsgs_guc set -D DATADIR -c "tde_key_info='\ keyType=huawei_kms,\ kmsUrl=https://kms.cn-north-4.myhuaweicloud.com/v1.0/00000000000000000000000000000000/kms,\ mkid=00000000-0000-0000-0000-000000000000,\ authType=aksk,'"
场景二:华为云/混合云账号与密码认证场景
gs_guc set ... -c "tde_key_info='\ keyType=$KMS类型,\ mkid=$主密钥ID', \ iamUrl=$IAM服务器地址,\ iamUser=$IAM用户名,\ iamDomain=$账号名,\ kmsUrl=$KMS服务器地址,\ kmsProject=$项目'"
# 示例为混合云KMS,华为云场景将keyType的值替换为huawei_kmsgs_guc set ... -c "tde_key_info='\ keyType=hcs_kms,\ mkid=00000000-0000-0000-0000-000000000000, \ iamUrl=https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens,\ ..."
表1 对接华为云KMS需要的tde_key_info参数列表如下
key | value | 是否必选 |
---|---|---|
keyType | huawei_kms/hcs_kms | 必选,该参数必须放在首位 |
kmsUrl | KMS服务api endpoint | 必选 |
kmsProject | KMS项目名 | 用户名密码认证时需要 |
mkid | 主密钥ID,主密钥由用户创建获取 | 必选 |
iamUrl | IAM身份认证服务api endpoint | 用户名密码认证时需要 |
iamUser | 用于IAM身份认证的用户名 | 用户名密码认证时需要 |
iamDomain | 用于IAM身份认证的域 | 用户名密码认证时需要 |
authType | 认证方式:AK/SK或用户名密码 | AK/SK认证时需要,值指定为aksk |
kmsCaCert | KMS CA证书文件位置 | 可选 |
iamCaCert | IAM CA证书文件位置 | 可选 |
1.加密用户密码 或 用户AK/SK
# 华为云/混合云用户名密码认证gs_guc encrypt -M tde -K '$IAM用户密码'# 华为云/混合云AKSK认证gs_guc encrypt -M tde -K '$AK, $SK'
2.重启数据库实例使上述配置生效
3.登陆数据库检查设置是否生效
连接数据库gsql -d postgres -p port检查tde开关是否开启gaussdb=# show enable_tde;检查tde密钥相关信息是否设置正确gaussdb=# show tde_key_info;
创建加密表
创建加密表tde_test1,加密状态为开启,指定加密算法为AES_128_CTR:
gaussdb=# CREATETABLE tde_test (a int, b text) with (enable_tde =on, encrypt_algo ='AES_128_CTR');
创建加密表tde_test2,加密状态为开启,不指定加密算法,则加密算法默认为AES_128_CTR:
gaussdb=# CREATETABLE tde_test2 (a int, b text) with (enable_tde =on);
创建加密表tde_test3,加密状态为关闭,指定加密算法为SM4_CTR:
gaussdb=# CREATETABLE tde_test3 (a int, b text) with (enable_tde =off, encrypt_algo ='SM4_CTR');
切换加密状态
登录数据库,将加密表tde_test1的加密开关置为off:
gaussdb=# ALTERTABLE tde_test1 SET (enable_tde=off);
将加密表tde_test1的加密开关置为on:
gaussdb=# ALTERTABLE tde_test1 SET (enable_tde=on);
对加密表进行密钥轮转
登录数据库,对加密表tde_test1进行密钥轮转:
gaussdb=# ALTERTABLE tde_test1 ENCRYPTION KEY ROTATION;
加密表与非加密表物理文件对比
首先按照上文中的指导配置好透明加密,连接到数据库,使用下面语句进行对比
1.创建加密表t1,并向其中插入一条数据
gaussdb=# CREATETABLE t1 (c1 INT, c2 TEXT) WITH (enable_tde =on, encrypt_algo ='AES_128_CTR');gaussdb=# INSERTINTO t1 VALUES (1, 'tde plain 123');
2.创建非加密表t2,并向其中插入相同的数据
gaussdb=# CREATETABLE t1 (c1 INT, c2 TEXT) WITH (enable_tde =on, encrypt_algo ='AES_128_CTR');gaussdb=# INSERTINTO t1 VALUES (1, 'tde plain 123');
3.查询t1,t2对应的物理文件位置
4.gaussdb=# select pg_relation_filepath('t1')
5.gaussdb=# select pg_relation_filepath('t2')
使能透明加密后物理文件中的内容

不使能透明加密物理文件中的内容


以上内容从数据透明加密方面继续介绍GaussDB数据库的数据保护技术,下篇将从软硬融合全密态、端侧加密引擎、端侧密钥管理、轻量化语法解析等四方面继续介绍GaussDB数据库的高安全性能。