Oracle-TDE研究及测试
一、简介
OracleTDE有列加密与表空间加密。结合实际需求,重点解释表空间加密。是针对Oracle数据文件加密的一种防护手段,防止数据文件被盗造成数据泄露。同时在TDE功能打开的过程中,数据泵导出的逻辑备份文件是被加密的,同样具备防泄漏功能。OracleTDE具备更换加密算法、自动登录钱包管理密钥等优势。
二、要点
1、TDE支持Oracle版本11g及以上
2、表空间加密仅在创建表空间时生效,中途修改表空间时添加TDE功能无效。
3、TDE支持数据泵(expdp)导出备份文件,无密钥无法被还原。密钥一致时,可还原上述备份文件。
4、利用rman进行加密备份时,未加密的表空间也可rman加密导出。
三、过程
1、Oracle-TDE加密过程
1.1、创建钱包(wallet)
/data/u01/app/oracle/admin/orcl
mkdir wallet
chown oracle:oinstall wallet/
1.2、设置wallet密码
alter system set encryption key identified by "123456";----password即为密钥密码。
1.3、打开/关闭钱包
alter system set wallet open identified by "123456";打开钱夹。
alter system set wallet close identified by "123456";
1.4、创建加密表空间
create temporary tablespace user_temp
tempfile '/oradata/u01/app/oracle/oradata/secure01.dbf'
size 50m
autoextend on next 50m
maxsize 10240m
extent management local;
CREATE TABLESPACE securespace_test
DATAFILE '/data/u01/app/oracle/oradata/securespace_test01.dbf'
size 50m
autoextend on next 50m
maxsize 10240m
ENCRYPTION
DEFAULT STORAGE(ENCRYPT);
select tablespace_name,ENCRYPTED from dba_tablespaces;
1.5、在加密表空间内创建表
create table test.test01 tablespace securespace_test as select * from scott.emp;
2、测试数据文件加密效果
2.1查看被加密的数据文件
user01.dbf是未加密的表空间,通过命令查看,内容正常。
encrypted_tablespaces.dbf是加密的表空间,通过命令查看,内容乱码。
3、测试逻辑备份文件(数据泵expdp/impdp)加密效果
环境1(本地测试库79)
环境2(电信测试库131)
步骤:将环境1中的加密表空间逻辑导出(expdp),环境2首先关闭TDE功能,将逻辑文件导入,如无法导入,说明加密成功,可以导入则加密失败。然后环境2打开TDE功能,将逻辑文件导入,如导入成功,说明加密成功,不可导入则加密失败。
3.1环境1逻辑导出
expdp test/ABC_abc123456 schemas=test directory=data_dir dumpfile=securespace_test.dmp logfile=export.log
3.2环境2逻辑导入
Impdp test/ABC_abc123456 schemas=test directory=data_dir dumpfile=securespace_test.dmp table_exists_action=replace logfile=export.log
环境2关闭TDE功能,导入失败,提示wallet未打开。说明加密成功。
环境2开启TDE功能,导入成功。
4、测试物理备份文件(rman)加密效果
4.1、方式一口令加密:适合异机恢复。输入临时密码。对表空间数据文件加密,删除对应数据文件后,进行恢复,如果可以正常恢复,说明加密失败,如果提示需要解密,说明加密成功。
RMAN> show all
#启用加密
RMAN> CONFIGURE ENCRYPTION FOR DATABASE ON;
#查看
RMAN> show encryption for database;
#only表示只以口令的方式加密,设置口令oracle
RMAN> set encryption on identified by 'oracle' only;
#备份表空间,然后关库
RMAN> backup tablespace securespace_test format '/tmp/test/securespace_%d_%s';
RMAN> shutdown abort;
#删除物理文件
[oracle@db2 ~]$ rm -f securespace_test01.dbf
#缺文件,启动报错
RMAN> startup;
#restore报错,提示钱包没有打开
RMAN> restore tablespace securespace_test;
#设置解密口令
RMAN> set decryption identified by 'oracle';
#restore正常
RMAN> restore tablespace securespace_test;
RMAN> recover tablespace users;
RMAN> alter database open;
4.2方式二TDE透明加密:适合本地加密和恢复。透明(Transparent)模式 默认的加密方式,比较适合于同一服务器进行的备份和恢复,换台服务器就无法识别了,因为缺少必备的密钥。 这种方法不需要设置密码,很适合在本地的备份与恢复,如果备份不需要传到其他的机器上, 建议采用这样的加密方法。
#wallet配置
/u01/app/oracle/product/11.2/dbhome_1/network/admin/sqlnet.ora
中加入条目
ENCRYPTION_WALLET_LOCATION=
(SOURCE=(METHOD=FILE)(METHOD_DATA=
(DIRECTORY=/u01/app/oracle/product/11.2/dbhome_1/network/admin/wallet)))
#确保目录存在
mkdir /u01/app/oracle/product/19.3/dbhome_1/network/admin/wallet
#创建mster key
SQL> alter system set key identified by "123456";
#打开钱夹
SQL> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "123456";
System altered.
关闭钱夹:ALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIED BY "123456";
#wallet创建好之后,rman备份可以用Wallet选项来备份。
RMAN> configure encryption for database on;
RMAN> set encryption on;
#备份,关库,关库之后钱夹也会close,恢复时要打开
backup tablespace users format '/data/oracle_bak/user_%d_%s';
shutdown abort
rm -f users01.dbf--进入数据目录下删除
#启动报错
startup
#restore显示钱夹未打开
RMAN> restore tablespace users;
#打开钱夹,正常恢复
RMAN> ALTER SYSTEM SET ENCRYPTION WALLET OPEN IDENTIFIED BY "123456";
RMAN> restore tablespace users;
RMAN> recover tablespace users;
RMAN> startup
结论:
Oracler-TDE满足公司数据安全需求,对数据文件、备份文件均可实现加密。数据库运维人员掌握开通加密功能,完成功能测试,可择期开通。
5、备注:
5.1参考链接(包含更换密钥等步骤):
(50条消息) Oracle TDE透明加密研究以及测试_oracle tde 基於表加密_iverycd的博客-CSDN博客
rman加密备份(口令、TDE透明、混合) - EverEternity - 博客园 (cnblogs.com)
5.2数据具体导入导出过程略,仅保留关键步骤。
CREATE USER test IDENTIFIED BY 123456
PROFILE DEFAULT
DEFAULT TABLESPACE securespace_test;
GRANT connect,resource,dba TO test;
grant create session TO test;
create directory data_dir as '/data/u01/app/oracle';
select * from dba_directories;
grant read,write on directory data_dir to test;
grant exp_full_database,imp_full_database to test;