暂无图片
暂无图片
4
暂无图片
暂无图片
暂无图片

Oracle 加密不求人:一篇文章教你搞定 TDE

作者: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文件。
image.png

2.4 开起钱包

一般情况下,创建钱包成功后,默认都是为开起状态,我们可以通过一下命令查询钱包的开启状态

select * from V$ENCRYPTION_WALLET;
复制

image.png
通过以下命令可对钱包进行开启与关闭操作

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列数据

image.png

关闭钱包后,无法查询,数据已经加密!

alter system set encryption wallet close identified by "oracle";
复制

image.png

注意的是,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;
复制

image.png

四、清理加密数据

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

可按如下步骤处理:

  1. 将主库的密钥文件拷贝到备库,$ORACLE_HOME/network/admin目录。
  2. 将主库sqlnet.ora拷贝到备库对应目录($ORACLE_HOME/network/admin目录)。
  3. 重启备库恢复进程

5.2 主库启用透明加密后创建DG

所有步骤都和正常的创建DG步骤一样,只需在拷贝主库备份文件到备库,增加如下两个步骤即可:

  1. 将主库的密钥文件(两个文件)拷贝到备库,$ORACLE_HOME/network/admin目录。
  2. 将主库sqlnet.ora拷贝到备库对应目录($ORACLE_HOME/network/admin目录)。

5.3 重建主库钱包文件

将新创建的钱包文件传送至备库,报错
image.png

需要特别注意的是:在创建钱夹后,一旦重新创建主库的加密钱夹,将新更新的钱夹传送至备库,备库也是仍然无法应用归档的,只能重建。在DG架构下,永远不要重建或者删除主库的钱包文件,更新钱包的操作对于备库是无效的,主库的钱包一定要做好备份操作!

hhh6.jpg

最后修改时间:2025-04-14 10:59:05
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

王旭
关注
暂无图片
获得了10次点赞
暂无图片
内容获得8次评论
暂无图片
获得了8次收藏
TA的专栏
RMAN备份恢复实战
收录9篇内容
PostgreSQL
收录11篇内容
目录
  • 重要说明
  • 一、 相关概念
    • 1. 什么是透明加密
    • 2. 什么是Oracle钱夹
  • 二、创建钱夹
    • 2.1 创建钱夹目录
    • 2.2 指定钱夹目录
    • 2.3 创建master key文件,指定wallet密码
    • 2.4 开起钱包
    • 2.5 修改钱包密码
  • 三、加密数据
    • 3.1 加密数据列
    • 3.2 加密表空间
  • 四、清理加密数据
    • 4.1 删除加密表,表空间
    • 4.2 删除钱包文件
    • 4.3 关闭钱夹
    • 五、DG架构下的透明加密
    • 5.1 创建DG时未启用透明加密
    • 5.2 主库启用透明加密后创建DG
    • 5.3 重建主库钱包文件