Oracle TDE(Oracle Transparent Data Encryption)
TDE透明数据加密允许用户对各个表列或整个表空间进行加密。当用户向加密的列中插入数据时,透明数据加密会自动对该数据加密。当用户选择该列时,数据将自动解密。选择完毕后,数据将重新加密。
由于透明数据加密在数据库之外的一个安全模块(即,wallet钱夹)中存储加密密钥,因此在存储介质或数据文件丢失时,该功能有助于保护存储在介质上的数据。在这类失窃事件中,保护数据是大部分合规管理的要求。使用透明数据加密的优势是,该功能仅需少量的编码工作,并且实施过程快速、简便。
透明数据加密允许用户对各个表列或整个表空间进行加密。当用户向加密的列中插入数据时,透明数据加密会自动对该数据加密。当用户选择该列时,数据将自动解密。选择完毕后,数据将重新加密。
(注:下文中提到的"wallet"与"钱夹"为同一术语)
第一次使用TDE时,需要按照步骤:
1)创建“wallet”目录以及指定位置
2)设置wallet密码
3)打开wallet
注意:缺省情况下,钱夹创建于ORACLE_BASE/admin/ORACLE_SID/wallet目录下。因此,如果ORACLE_BASE是/u01/app/oracle且ORACLE_SID是orcl,则钱夹将存储在**/u01/app/oracle/admin/orcl/wallet目录下。你也可以在位于$ORACLE_HOME/network/admin目录下的sqlnet.ora**(如果没有的话则创建)文件中指定的方式选择一个不同的目录。例如:如果要把wallet放在/u01目录下,在sqlnet.ora文件中写入如下内容:
ENCRYPTION_WALLET_LOCATION =
(SOURCE=
(METHOD=file)
(METHOD_DATA=
(DIRECTORY=/u01)))
打开一个 SQL*Plus 会话,并执行以下命令:
SQL>alter system set encryption key identified by "password";----password即为密钥密码。
备注
打开钱夹
SQL>alter system set wallet open identified by "password";打开钱夹。
(注:wallet的密钥一旦生成之后,每次数据库重启之后,都必须使用命令显式打开(后面章节会介绍自动登录))
关闭钱夹
通过执行如下命令:
SQL>alter system set wallet close identified by "password";
(注:wallet一旦打开之后,在数据库实例关闭之前会一直处于打开状况,除非显式的通过close命令关闭)
为了TDE能够正常工作,钱夹必须被打开。如果钱夹被关闭,你还是可以访问没有加密的列,但不能够访问加密的列。下面通过示例的方式来创建列加密
具体测试步骤见下:
a)创建测试表employee:
SQL>CREATE TABLE employee (
first_name VARCHAR2(128),
last_name VARCHAR2(128),
empID NUMBER,
salary NUMBER(6) ENCRYPT --->谓词“ENCRYPT”为加密字段
);
b)插入测试数据
SQL> insert into employee values ('tom','clus','1','8000');
c)关闭wallet(如果是打开状态)
SQL>alter system set wallet close identified by "oracle";
此时wallet没有开启情况下,查询语句未能查询加密数据
d)查询employee非加密列(FIRST_NAME,LAST_NAME,EMPID)
通过观察发现,employee表中未加密的列可以显式查询。
e)打开wallet
SQL>alter system set wallet open identified by "oracle"
System altered.
f)再次查询employee表
wallet打开之后就可以查询到加密的列了.
SQL> ALTER TABLE employee ADD (ssn VARCHAR2(11) ENCRYPT);
SQL> ALTER TABLE employee MODIFY (first_name ENCRYPT);
SQL> ALTER TABLE employee MODIFY (first_name DECRYPT);
oracle tde缺省情况下采用192位密钥长度的AES算法。另外可以使用不同的算法。例如,如果要使用128位的AES算法,可使用如下命令:
SQL>alter table salary modify (salary encrypt using 'AES128');
你可以使用AES128、AES192、AES256、或者3DES168。例如:AES256指采用AES算法、256位长度的密钥。
Oracle官方支持列加密的字段类型有如下几种:
• BINARY_DOUBLE • BINARY_FLOAT • CHAR • DATE • INTERVAL DAY TO SECOND • INTERVAL YEAR TO MONTH • LOBs (Internal LOBs and SECUREFILE LOBs Only) • NCHAR • NUMBER • NVARCHAR2 • RAW • TIMESTAMP (includes TIMESTAMP WITH TIME ZONE and TIMESTAMP WITH LOCAL TIME ZONE) • VARCHAR2
在oracle database 10g的时候是不支持表空间加密的,然而到了11g(11.1)以上已经支持表空间级别的加密,当列加密的字段类型不在支持范围内,可以使用表空间加密。在加密表空间内创建的表都具备加密特性,下面通过示例的方式,来了解TDE技术在表空间层面的应用。
示例:
SQL> CREATE TABLESPACE securespace
DATAFILE '/u01/app/oracle/oradata/secure.dbf’
SIZE 20M
ENCRYPTION
DEFAULT STORAGE(ENCRYPT);
Tablespace created.
示例:
a) 建emp表
SQL>CREATE TABLE emp (
first_name VARCHAR2(128),
last_name VARCHAR2(128),
empID NUMBER,
salary NUMBER(6) )
TABLESPACE securespace;
b)插入测试数据
SQL> insert into emp values ('Steve','Jobs','1','5888');
关闭tde wallet
SQL>alter system set wallet close identified by "oracle";
System altered.
由此可见,在加密表空间内创建的表已经被加密,必须显式打开wallet查询语句才能查询结果。
示例:
[oracle@orcldb:/u01/key]$orapki wallet change_pwd -wallet /u01/key -oldpwd oracle123 -newpwd oracle111
顶部菜单栏->wallet->OPEN->打开wallet文件夹
选择文件夹之后会提示输入原密码,输入正确的密码即可
在wallet图标右键选择change password进行修改密码
最后保存即可
测试步骤如下:
1. 在主机a数据库创建加密表空间securespace以及用户cs(步骤略)
2. 在加密表空间securespace建立表emp,并插入测试数据
SQL>CREATE TABLE emp (
first_name VARCHAR2(128),
last_name VARCHAR2(128),
empID NUMBER,
salary NUMBER(6) )
TABLESPACE securespace;
SQL> insert into emp values ('Steve','Jobs','1','5888');
3. 在主机a通过数据泵导出用户cs的数据(实际就一张表emp的数据)
[oracle@orcldb:/u01/key]$expdp cs/oracle schemas=cs directory=dump dumpfile=csbkj.dmp
Export: Release 11.2.0.4.0 - Production on Sat Jan 27 16:57:37 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "CS"."SYS_EXPORT_SCHEMA_01": cs/******** schemas=cs directory=dump dumpfile=csbkj.dmp
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 64 KB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
. . exported "CS"."EMP" 6.265 KB 1 rows
Master table "CS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for CS.SYS_EXPORT_SCHEMA_01 is:
/dump/csbkj.dmp
Job "CS"."SYS_EXPORT_SCHEMA_01" successfully completed at Sat Jan 27 16:57:49 2018 elapsed 0 00:00:11
4. 将数据泵导出的dmp文件拷贝到主机b(步骤略)
5. 在主机b环境下建立相应的用户以及表空间(步骤略)
6. 在主机b通过数据泵导入dmp文件,导入过程如下
[oracle@db dump]$ impdp cs/oracle schemas=cs dumpfile=csbkj.dmp directory=dump
Import: Release 11.2.0.4.0 - Production on Sat Jan 27 17:40:06 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Master table "CS"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "CS"."SYS_IMPORT_SCHEMA_01": cs/******** schemas=cs dumpfile=csbkj.dmp directory=dump
Processing object type SCHEMA_EXPORT/USER
ORA-31684: Object type USER:"CS" already exists
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
. . imported "CS"."EMP" 6.265 KB 1 rows
Job "CS"."SYS_IMPORT_SCHEMA_01" completed with 1 error(s) at Sat Jan 27 17:40:08 2018 elapsed 0 00:00:01
上述导入并没有报错
经过测试可以发现,在源主机a数据库开启wallet的情况下,用户cs的数据可以在异机环境进行数据泵(impdp)导入。
测试步骤如下:
1.在主机a数据库创建加密表空间securespace以及用户cs(步骤略)
2.在加密表空间securespace建立表emp,并插入测试数据
3.在主机a数据泵导出用户cs的数据
[oracle@orcldb:/u01/key]$expdp cs/oracle schemas=cs directory=dump dumpfile=csbkjclose.dmp
Export: Release 11.2.0.4.0 - Production on Sat Jan 27 16:58:41 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Starting "CS"."SYS_EXPORT_SCHEMA_01": cs/******** schemas=cs directory=dump dumpfile=csbkjclose.dmp
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 64 KB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/COMMENT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
ORA-31693: Table data object "CS"."EMP" failed to load/unload and is being skipped due to error:
ORA-02354: error in exporting/importing data
ORA-28365: wallet is not open
Master table "CS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for CS.SYS_EXPORT_SCHEMA_01 is:
/dump/csbkjclose.dmp
Job "CS"."SYS_EXPORT_SCHEMA_01" completed with 1 error(s) at Sat Jan 27 16:58:54 2018 elapsed 0 00:00:13
[·可以发现导出日志中会有wallet没有开启的报错信息·]
4.将数据泵导出的dmp文件拷贝到异机环境(步骤略
5.在主机b环境下建立相应的用户以及表空间(步骤略)
6.在主机b环境通过数据泵导入dmp文件,导入过程如下
[oracle@db dump]$ impdp cs/oracle schemas=cs directory=dump dumpfile=csbkjclose.dmp
Import: Release 11.2.0.4.0 - Production on Sat Jan 27 18:03:27 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Master table "CS"."SYS_IMPORT_SCHEMA_01" successfully loaded/unloaded
Starting "CS"."SYS_IMPORT_SCHEMA_01": cs/******** schemas=cs directory=dump dumpfile=csbkjclose.dmp
Processing object type SCHEMA_EXPORT/USER
ORA-31684: Object type USER:"CS" already exists
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/ROLE_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Job "CS"."SYS_IMPORT_SCHEMA_01" completed with 1 error(s) at Sat Jan 27 18:03:28 2018 elapsed 0 00:00:01
经过测试可以发现,在源数据库没有开启wallet的情况下,用户cs的数据不可以在异机环境进行数据泵(impdp)导入。
oralce数据泵导出支持密码参数,在已开启wallet的情况下,如果有需要对dump文件加密,可以根据示例语句的ENCRYPTION_PASSWORD参数进行调整,后面附加密码即可。
示例:
[oracle@orcldb:/u01/key]$expdp cs/oracle schemas=cs directory=dump dumpfile=expdpjiami.dmp ENCRYPTION_PASSWORD=oracle
注:impdp导入也需要添加密码参数ENCRYPTION_PASSWORD才可以导入成功
使用SQL 创建的wallet 的问题是不能自动登陆,这样我们在关闭wallet或者重启实例后,都需要手动的来open wallet。这样有点麻烦,Oracle 提供了wallet 自动登陆功能,可以在创建后使用owm(Oracle wallet manager)来修改。
在oracle用户终端输入own命令调出gui界面,使用owm工具修改:
Auto Login 勾选并保存后即可实现自动登陆,这样即使重启数据库也无需人为操作。
何时使用列级 TDE 或表空间加密,根据下面的指导原则确定具体方法的选择:
不能在现有表空间进行加密,变通方法为:
创建一个新的加密表空间,备份当前表空间,将所有表和其他内容从旧的表空间转移到新表空间中,然后删除旧的加密表空间。
TDE 有哪些相关的开销?
与未加密的表空间相比,加密的表空间不会要求更高的存储空间。
与列级 TDE 相关的开销分为两方面:存储和性能。在性能方面,与加密或解密常用属性(如信用卡号码)相关的开销估计为 5%。当索引基于加密列构建时,索引的创建将使用密文。如果经 TDE 加密的列已建立索引并为 SQL 语句引用,Oracle 将对 SQL 语句中用到的值进行透明加密并使用密文进行索引查询。TDE 相关的存储开销可能会很大,这是因为每个加密值都有额外 20 个字节的完整性检查。此外,TDE 会将加密值填充到 16 个字节,所以如果信用卡号码要求 9 个字节的存储空间,加密该号码将要求额外 7 个字节的存储空间。最后,如果为加密值指定了 salt,该 salt 将要求额外 16 个字节的存储空间。总之,加密表中的一列将要求每行有 33 到 48 个字节的额外存储空间。
一旦丢失了现有的加密钱夹 (‘ewallet.p12’) ,加密数据将无法访问,会报如下错误:ORA-28362: master key not found
因此对于该文件的备份尤为重要。
1、经过多次测试,个人认为Oracle TDE的使用场景更偏向于数据的安全。隐藏敏感数据,不被人知晓,更多的时候是防止数据库上的数据文件以及备份被”偷窃“之后的数据泄密。
2、使用TDE之后数据要么能显示,要么数据不显示,只有两种情况,此针对所有权限用户。
3、被加密之后的列,在磁盘级别的dbf数据文件
不会以明文显示,但是打开钱夹之后,经过一系列解密操作,用户终端的数据查询最终以明文方式展示。如果钱夹没有打开,对这些加密列的插入以及访问就会失败
4、TDE的秘钥更像是一把保险箱的钥匙,即使数据文件被偷了,但是没有钥匙仍旧无法获取数据。
5、TDE的加密并没有列字段的“脱敏”功能,无法对数据进行掩盖,无法在终端展示中隐藏明文
数据。相反第三方的审计设备经过本人测试可以实现身份证以及手机号的脱敏。
6、如果web应用程序经常与敏感列交互,然而不想在应用层面上以明文显示,那么TDE并不适用。