1 Oracle TDE
1.1 TDE介绍
Oracle TDE是数据库层对存储的用户敏感数据进行的静态加密,加密数据满足主流的安全法规(如 PCI DSS)相关的加密要求,可以防止数据文件被其他非数据库读取方式访问的情况下(如通过工具直接打开读取数据文件块的方式)被窃取明文数据,加密操作过程对用户和应用完全透明。
1.2 TDE加密两层加密体系
TDE使用两层加密密钥体系结构,包括两层:
第一层:主加密密钥master key:用于加密列加密和表空间加密的密钥
第二层:表或是表空间密钥:表密钥是用于加密一个或多个特定列的密钥,无论表中的加密列数如何,都只有一个密钥,它将存储在数据字典中;表空间密钥是用于加密表空间的密钥,表空间密钥存储在加密表空间的每个数据文件头中。
表和表空间密钥使用主密钥进行加密。主密钥存储在外部安全模块中,该模块可以是以下模块之一:
1 Oracle Wallet - 数据库外部的安全容器。它是用密码加密的。
2 硬件安全模块 (HSM) - 用于保护密钥和执行加密操作的设备。Oracle 使用 HSM 供应商提供的PKCS#11 库连接到设备。
3 Oracle Key Vault - Oracle推出的是一款全栈、安全强化的软件一体机,旨在集中管理企业内的密钥和安全对象,初始版本12.1,目前最新版本21.8。
4 OCI Vault - Key Management。
1.3 加密算法
11G加密算法,表空间默认算法AES128,列加密默认算法AES192。
19c加密算法,表空间默认算法AES128,列加密默认算法AES192。
1.4 TDE加密的范围
1 Oracle 10.2版本可以对表列进行加密。
2 Oracle 11.1之后可以对表空间进行加密。
1.5 TDE加密实现过程
TDE可以对整个表空间开启加密模式,只要存储在表空间里面的对象,都会自动对磁盘里面的数据进行加密,包括加密数据的redo日志、数据文件的物理备份文件都会进行加密,但TDE不会加密存储在表空间外部的数据,比如BFILE列数据,数据库只存放了一个指针信息,实际存储的文件数据是在数据库的外部,这部分的数据是不会被TDE所加密。TDE还可以开启表列单独加密的,只针对开启加密的列数据进行加密,其他没有开启加密的列,不会进行加密。TDE的加密和解密过程对用户来说完全透明,对于查看或是修改数据的用户来说,操作TDE加密的数据不需要额外的操作步骤,需要注意的是在配置了TDE数据库中,任何有权访问加密表的用户都能够以明文形式查看数据,因为用户通过查询的表数据都是数据库解密之后的返回明文数据,数据库只是在对数据文件里面存储的数据进行加密,不会对查询显示出来的数据进行加密处理,对于数据显示的加密需要使用Oracle Data Redaction技术。
TDE表列数据加密和解密过程如下,首先需要打开外部的密钥存储模块(比如Oracle wallet,需要通过密码打开或是配置auto-login自动打开),拿到第一层的主密钥master key(PKCS#12格式由ewallet.p12生成),其次,通过主密钥加密和解密第二层的表密钥,表的密钥存储在数据字典中,最后通过表密钥对表列里面的数据进行加密和解密。
TDE表空间加密和解密过程如下,首先需要打开外部的密钥存储模块(比如Oracle wallet,需要通过密码打开或是配置auto-login自动打开),拿到第一层的主密钥master key(PKCS#12格式由ewallet.p12生成),其次,通过主密钥加密和解密第二层的表空间密钥,表空间密钥存储在加密表空间的每个数据文件头中,最后,通过表空间密钥对表空间存储的数据进行加密和解密。
TDE表空间加密适合那些需要大规模对表进行加密或是整个表加密的场景,它可以减少列加密的分析工作,此外,TDE 表空间加密还利用批量加密和缓存来增强的加密性能。TDE表列加密适合那些只针对某些特定表列加密的场景,加密操作更加的灵活。
1.6 TDE表空间加密使用风险与限制:
1 性能的问题,数据的加密以及解密会消耗额外的CPU资源,特别是SQL对于大数据量的扫描,这个消耗可能会更明显,Oracle官方给出的性能开销为5%~8%。
2 默认的加密只对新建的表空间表数据有作用,对已有的表空间需要手动进行转换,转换的方式有
a 将数据从非加密的表空间迁移到加密的表空间,比如通过move tablespace操作。
b 11G、12.1版本可以通过安装Patch 22066671实现将offline 表空间转换为加密表空间。
c 12.2之后可以实现将表空间在线online转换为加密表空间。
3 一旦启用加密了表空间所以如果密钥钱包丢失了,可能数据就无法重新再解密了,要做好加密钱包的备份。
4 备份恢复操作需要考虑加密配置和单独的密钥备份。
5 存储外部大对象,比如BFILE无法进行加密。
6 在12.2之前SYSTEM, SYSAUX, UNDO and TEMP表空间不能进行加密,在12.2之后,虽然可以对SYSTEM, SYSAUX, UNDO and TEMP进行加密,但需要永远打开密钥库,因此Oracle不推荐进行加密,直到19c之后,对于SYSTEM, SYSAUX, UNDO and TEMP的加密进行优化,关闭密钥库也不影响,Oracle官方不再不推荐。
7 在12.2版本之前,对于用create tablespace xx encryption创建的加密表空间,无法DECRYPT解密。
1.7 Oracle TDE的表列加密使用风险与限制:
1 表不能创建B-tree以外的其他索引
2 列上的索引不能使用索引范围扫描
3 存储外部大对象,比如BFILE无法进行加密
4 不能对加密表列进行数据同步抽取
5 不能使用传输表空间功能
6 列不能作为外键
7 加密字段只支持以下类型
8 每行数据需要额外的存储8-52字节。
a 一定会增加的存储加密key使用的字节8-16字节,根据使用的算法,AES使用128 bits(128/8 = 16bytes) 16字节, 3DES 8字节。
b 可能增加的存储20字节,用于完整性检查默认为配置SHA-1完整性算法检查,可以通过NOMAC选项关闭完整性检查。
c 可能增加的存储16字节,使用'SALT'加密的列,可以通过'NO SALT'选项避免
9 对队列进行加密,可能会产生额外的日志。
10 性能的问题,数据的加密以及解密会消耗额外的CPU资源,特别是SQL对于大数据量的扫描,这个消耗可能会更明显。
11 SYS对象不能进行加密。
12 加密的列长度限制。
Tip:欢迎关注公众号:勇敢牛牛的笔记,超100+的原创内容,每周不定期更新数据库技术文章