GaussDB高安全—数据掩护:数据透明加密

打印 上一主题 下一主题

主题 900|帖子 900|积分 2700

书接上文数据库高安全—数据掩护:数据动态脱敏,从数据动态脱敏方面对高斯数据库的数据掩护技能举行相识读,本篇将从数据透明加密方面继续介绍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参数,使能透明加密
  1. gs_guc set -D DATADIR -c"enable_tde=on"
复制代码
2.设置用于对接KMS的参数tde_key_info
使用key=value格式设置参数,各参数间使用逗号分隔    
场景一:华为云/混合云AK/SK认证场景
  1. 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,'"
复制代码
场景二:华为云/混合云账号与暗码认证场景
  1. gs_guc set ... -c "tde_key_info='\  keyType=$KMS类型,\  mkid=$主密钥ID', \  iamUrl=$IAM服务器地址,\  iamUser=$IAM用户名,\  iamDomain=$账号名,\  kmsUrl=$KMS服务器地址,\  kmsProject=$项目'"
  2. # 示例为混合云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
  1. # 华为云/混合云用户名密码认证gs_guc encrypt -M tde -K '$IAM用户密码'# 华为云/混合云AKSK认证gs_guc encrypt -M tde -K '$AK, $SK'
复制代码
2.重启数据库实例使上述设置生效
3.登陆数据库检查设置是否生效
  1. 连接数据库gsql -d postgres -p port检查tde开关是否开启gaussdb=# show enable_tde;检查tde密钥相关信息是否设置正确gaussdb=# show tde_key_info;
复制代码

创建加密表
创建加密表tde_test1,加密状态为开启,指定加密算法为AES_128_CTR:
  1. gaussdb=# CREATETABLE tde_test (a int, b text) with (enable_tde =on, encrypt_algo ='AES_128_CTR');
复制代码

创建加密表tde_test2,加密状态为开启,不指定加密算法,则加密算法默认为AES_128_CTR:
  1. gaussdb=# CREATETABLE tde_test2 (a int, b text) with (enable_tde =on);
复制代码

创建加密表tde_test3,加密状态为关闭,指定加密算法为SM4_CTR:
  1. gaussdb=# CREATETABLE tde_test3 (a int, b text) with (enable_tde =off, encrypt_algo ='SM4_CTR');
复制代码

切换加密状态
登录数据库,将加密表tde_test1的加密开关置为off:
  1. gaussdb=# ALTERTABLE tde_test1 SET (enable_tde=off);
复制代码

将加密表tde_test1的加密开关置为on:
  1. gaussdb=# ALTERTABLE tde_test1 SET (enable_tde=on);
复制代码

对加密表举行密钥轮转
登录数据库,对加密表tde_test1举行密钥轮转:   
  1. gaussdb=# ALTERTABLE tde_test1 ENCRYPTION KEY ROTATION;
复制代码

加密表与非加密表物理文件对比
首先按照上文中的指导设置好透明加密,连接到数据库,使用下面语句举行对比
1.创建加密表t1,并向其中插入一条数据

  1. 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,并向其中插入相同的数据

  1. 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数据库的高安全性能。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

商道如狼道

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表