作者:Digital Observer(施嘉伟)
Oracle ACE Pro: Database
PostgreSQL ACE Partner
11年数据库行业经验,现主要从事数据库服务工作
拥有Oracle OCM、DB2 10.1 Fundamentals、MySQL 8.0 OCP、WebLogic 12c OCA、KCP、PCTP、PCSD、PGCM、OCI、PolarDB技术专家、达梦师资认证、数据安全咨询高级等认证
ITPUB认证专家、PolarDB开源社区技术顾问、HaloDB技术顾问、TiDB社区技术布道师、青学会MOP技术社区专家顾问、国内某高校企业实践指导教师
公众号/墨天轮:Digital Observer;CSDN/PGfans:施嘉伟;ITPUB:sjw1933
重要说明
本方法适用于oracle 11g!
一、 相关概念
1. 什么是透明加密
TDE 旨在让客户能够透明地在数据库中进行加密,而不会影响现有应用。以加密格式返回数据会破坏大多数现有应用。TDE 的优势在于,加密不会产生传统数据库加密解决方案所产生的开销,对机器性能、存储几乎没有任何开销。传统的方案通常需要对应用进行更改,包括使用数据库触发器和视图,因而费时费力,成本高昂。
2. 什么是Oracle钱夹
2 什么是Oracle钱夹
钱夹是一个加密的容器,用于存储身份验证和签名凭证,包括 SSL 所需的密码、TDE 主密钥、PKI 私钥、证书和可信证书。借助 TDE,可以在服务器上使用钱夹保护 TDE 主密钥。除非使用 Diffie-Hellman,否则 Oracle 要求在 SSL 上通信的实体包含一个钱夹,该钱夹应当含有 X.509 版本 3 证书、私钥、可信证书列表。
Oracle 提供两种类型的钱夹:加密钱夹和(本地)自动打开的钱夹。我们建议对 TDE 使用加密钱夹(文件名为 ewallet.p12)。数据库启动后和访问 TDE 加密数据前,需手动打开该钱夹。由于数据在 REDO 日志、UNDO 和 TEMP 表空间中处于加密状态,因此在打开数据库前需要为其提供 TDE 主加密密钥。
二、创建钱夹
2.1 创建钱夹目录
以下操作使用Oracle用户进行
创建一个新目录
mkdir -p /u01/app/oracle/admin/orcl/wallet
复制
2.2 指定钱夹目录
ENCRYPTION_WALLET_LOCATION参数的作用就是告知Wallet的实现方式和物理位置。上述示例中将/u01/app/oracle/admin/orcl/wallet目录作为主加密Key的存放位置
vi $ORACLE_HOME/network/admin/sqlnet.ora 加入以下信息,保存。 ENCRYPTION_WALLET_LOCATION= (SOURCE= (METHOD=file) (METHOD_DATA= (DIRECTORY=/oracle/wallet/) ) )
复制
2.3 创建master key文件,指定wallet密码
使用SYS用户登陆,通过以下命令建立加密文件:
alter system set encryption key identified by "oracle"
复制
其中,oracle为wallet密码。Oracle Wallet是一个可以打开关闭的功能组件,设置密码之后,只有通过密码口令可以启用wallet功能。
此时,在设置的目录下会多出一个ewallet.p12文件。这就是生成的master key文件。
2.4 开起钱包
一般情况下,创建钱包成功后,默认都是为开起状态,我们可以通过一下命令查询钱包的开启状态
select * from V$ENCRYPTION_WALLET;
复制
通过以下命令可对钱包进行开启与关闭操作
alter system set encryption wallet open identified by "oracle"; alter system set encryption wallet close identified by "oracle";
复制
需要注意的是,当钱包为开启状态是,我们才能访问加密的数据!
2.5 修改钱包密码
orapki wallet change_pwd -wallet /oracle/wallet
复制
输入一次旧密码。一次新密码即可
三、加密数据
确认钱包创建完毕后,就可以开始加密数据
oracle不允许对sys,system用户的对象进行加密操作 测试前,创建一个测试用户 create user test identified by test; grant dba to test
复制
3.1 加密数据列
建表时在name列后面加上encrypt,进行加密
create table t (id number primary key, name varchar2(30) encrypt);
复制
对已有表进行加密
alter table t modify (id encrypt);
复制
对加密列关闭加密
alter tablet modify(id decrypt);
复制
创建一个测试表,插入数据,
create table t (id number primary key, name varchar2(30) encrypt); insert into t values (1,'test');
复制
此时,可以查询name列数据
关闭钱包后,无法查询,数据已经加密!
alter system set encryption wallet close identified by "oracle";
复制
注意的是,TDE不支持对外键约束中使用的列进行加密!
3.2 加密表空间
创建加密表空间,创建在加密表空间中的所有对象自动加密
(已在使用的表空间无法加密)
CREATE TABLESPACE test DATAFILE '/oracle/app/oradata/zwy/test.dbf' SIZE 50M ENCRYPTION DEFAULT STORAGE(ENCRYPT);
复制
通过dba_tablespace视图确认,test表空间为加密表空间
select TABLESPACE_NAME,ENCRYPTED from dba_TABLESPACES;
复制
四、清理加密数据
4.1 删除加密表,表空间
删除加密的表
select 'drop table '||owner||'.'||segment_nvvame||';' from (select distinct owner, segment_name from dba_segments a, dba_tablespaces b where b.ENCRYPTED='YES' and a.tablespace_name=b.tablespace_name and a.segment_type in ('TABLE', 'TABLE PARTITION')); select 'drop table '||OWNER||'.'||table_name||' cascade constraints purge' drop_cmm from DBA_ENCRYPTED_COLUMNS;
复制
删除加密的表空间
select 'drop tablespace '||tablespace_name||' including contents;' from DBA_TABLESPACES where ENCRYPTED='YES';
复制
清空回收站
purge recyclebin;
复制
4.2 删除钱包文件
cd /oracle/wallet rm -f ewallet.p12
复制
4.3 关闭钱夹
alter system set encryption wallet close identified by "oracle";
复制
4.4 清理配置文件
注释掉钱包的配置路径
cd $ORACLE_HOME/network/admin vi sqlnet.ora
复制
4.5 意外处理
关闭钱夹后,钱夹状态仍然为open,请切换归档以及undo文件,重启数据库!
五、DG架构下的透明加密
5.1 创建DG时未启用透明加密
正常运行中的主、备库,主库启用了透明加密,备库的恢复进程会报错退出,在备库告警日志中可以看到如下报错:
Apply redo for TSE master key re-key failed: wallet error 28365
Errors with log /oracle/mcexpdp2/arch/1_12_985882800.dbf
MRP0: Background Media Recovery terminated with error 28365
Errors in file /oracle/app/diag/rdbms/mcexpdp/mcexpdp/trace/mcexpdp_pr00_23659.trc:
ORA-28365: wallet is not open
Recovery interrupted!
Recovered data files to a consistent state at change 221392
可按如下步骤处理:
- 将主库的密钥文件拷贝到备库,$ORACLE_HOME/network/admin目录。
- 将主库sqlnet.ora拷贝到备库对应目录($ORACLE_HOME/network/admin目录)。
- 重启备库恢复进程
5.2 主库启用透明加密后创建DG
所有步骤都和正常的创建DG步骤一样,只需在拷贝主库备份文件到备库,增加如下两个步骤即可:
- 将主库的密钥文件(两个文件)拷贝到备库,$ORACLE_HOME/network/admin目录。
- 将主库sqlnet.ora拷贝到备库对应目录($ORACLE_HOME/network/admin目录)。
5.3 重建主库钱包文件
将新创建的钱包文件传送至备库,报错
需要特别注意的是:在创建钱夹后,一旦重新创建主库的加密钱夹,将新更新的钱夹传送至备库,备库也是仍然无法应用归档的,只能重建。在DG架构下,永远不要重建或者删除主库的钱包文件,更新钱包的操作对于备库是无效的,主库的钱包一定要做好备份操作!