【Poster】openGauss全栈在线明密文转换

openGauss全栈在线明密文转换

作者:何睿、徐美婷、张宇轩
{herui30, xumeiting, zhangyuxuan37}@huawei.com

摘要

为了解决数据上云、数据流通过程中海量数据机密性、完整性保护挑战,openGauss提供丰富的数据加密保护机制以及全栈国密保护能力,包括数据透明加密(TDE)、全密态数据库等能力。数据透明加密在用户数据从缓冲区淘汰前使用用户指定的加密算法对明文数据页加密处理随后落盘,在磁盘数据读取到缓冲区后,按照页面中指定的密钥元数据以及加解密算法将数据解密成明文供计算引擎使用。而全密态数据库在客户端实现免改造的SQL查询自动加密、查询结果集自动解密的能力,提供数据全生命周期保护。本工作主要聚焦于用户存量数据迁移到全密态、透明加密的痛点问题:数据明密文转换,提供在线明密文转换能力,打通用户国密改造的最后一公里。

引言

随着密评改造,openGauss数据库提供的全密态、透明加密、备份加密等丰富的数据机密性保护能力能够保证用户核心数据的机密性及完整性。但是在改造过程中的一个难点是,如何将存量的明文数据在线转换成为密文,支撑业务无感切换、安全升级,为了满足客户的这一痛点需求,openGauss针对全密态、透明加密的存储特点,实现全栈的在线明密文转换功能。

  • 针对少量机密字段:少量核心加密字段的保护,天然适合openGauss全密态功能。该功能采用列级数据加密,能够精确的保护敏感信息。针对全密态的列级数据明密文转换诉求,采用在线ALTER表的功能高效实现。
  • 针对全表敏感数据:全表数据的保护,适合使用openGauss透明加密功能,实现每个数据页都加密存储。针对明文表向密文表的转换,采用在线VACUUM FULL能力,在页面整理过程中完成密钥的轮转、数据加密操作。

系统架构


用户根据业务诉求,配置GUC参数以及加密主密钥等信息后,创建全密态表并按需指定加密列、加密算法,或者创建透明加密表指定表级加密密钥后,即可通过DDL语法触发明密文在线转换,数据库后台通过页面整理、列级数据转换完成数据在线加密。

① 触发阶段

  • 全密态:用户使用CRETE CLOUMN ENCRYPTION KEY语法指定列加密密钥,并且创表指定加密字段。
  • 透明加密:用户创建表时,开启透明加密开关,指定加密算法,数据库内核会自动为该表创建密钥。

② 转换阶段

  • 全密态:用户使用ALTER TABLE [ONLINE] MODIFY COLUMN触发列级数据在线转换。
  • 透明加密:用户使用ALTER TABLE打开明文表的enable_tde开关,并使用在线VACUUM触发表级转换。

③ 执行阶段

  • 全密态:数据库在原表追加一列数据并指定其加密密钥,使用后台线程将明文数据在线追加至该列。
  • 透明加密:数据库后台VACUUM线程在线读取原表的明文页面并整理至新的密文页中。

④ 完成阶段

  • 数据追加完成后,会短暂的对该表加锁,保证原始明文与转换后的密文一致,即可恢复正常业务。

加密列在线转换

  • 存量数据加密:通过后台线程,向中间表追加数据。在追加数据过程中,根据指定的加密列算法以及密钥,将密文列转为明文列。
  • 在线数据追加:根据CTID映射,同步原表的数据删除。新增数据采用多轮DELTA表更新的方式,追加到中间表中,追加过程自动进行列数据加密。
  • 在线数据加密结束:在全部明文列转换为密文列后,交换中间表和原表,删除中间表、DELTA表、映射表等,完成在线列级数据转换。

密文数据页在线转换

  • 创建新页面:表级透明加密在线转换后,新创建的页面special区会填充表加密密钥相关元数据,同时在页面头标识该页面为加密页。
  • 在线页面整理:在线VACUUM FULL后台线程会自动扫描旧数据页面,跳过死元组,将LIVE元组复制到新页面,并在线加密。复制的元组会冻结XID。
  • 页面文件替换:完成所有页面扫描以及新数据的追增后,获得全部未密文的页面,删除旧数据页面,完成密文数据页在线转换。

未来工作

  • 加解密性能加速:支持ARM、X86最新指令集以及加解密协处理器,提升国密算法加解密性能。
  • 加密机生态支持:支持标准GM0018接口,对接丰富的第三方加密机以及加密卡,实现更高等级密码模块支持。