orcl透明数据库加密(TDE)加密表空间

TDE加密介绍

透明数据加密包括列加密和表空间加密,它是oracle高级安全组件的一部分;
oracle11g企业版默认安装时会安装上oracle高级安全组件,oracle声称这是一个单独另外收费的组件,作为商业用途使用如果没有付费意味着侵权。

oracle增强表空间加密特性,数据库的兼容性参数必须被设置为11.2或更高。

oracle的列加密是从10gR2开始可以使用,表空间加密是从11gR1开始使用。

表空间加密算法3DES168,AES128,AES192,AES256,默认是AES128

TDE从11g开始支持加密整个表空间,表空间的对象都自动加密,不需要对表再进行加密。

表空间加密中,支持内部对象blod,clob等加密,不支持外部对象BFILE。

TDE的主密钥存储在外部安全模块(Oracle Wallet中或HSM)。这TDE主密钥用于加密TDE表空间加密密钥,而这又是用来加密和解密数据表空间。

已经加密的数据对数据库使用者或是应用程序都是透明的,自动解密。
如果存储介质或是数据文件被偷,TDE可以保护数据不被还原。
加密密钥自动产生,不需要用户管理。只需要及时做好备份,不要丢失即可。

注意:加密的秘钥即使是同一密码,生成的秘钥也会不同,不要试图重新加载秘钥,这样容易导致数据库不可用。

操作环境

系统:window7
数据库:oracle12C
(这里需注意,windows7系统不支持oracle19C原因:)
Navicat:12破解版

表空间加密实现过程

启用TDE

创建和管理Oracle钱夹

  1. 如果是linux系统,输入如下命令创建目录$ mkdir -p /u01/app/oracle/admin/orcl/wallet

  2. 如果是windows系统,直接在想存储秘钥的位置新建文件夹即可,我的存储位置是D:\AAA\box\oracle12WINDOWS.X64_193000_db_home(随意命名的oracle安装路径)\wallet

指定 wallet 路径

在oracle安装路径下的NETWORK\ADMIN下的 sqlnet.ora 中设置 ENCRYPTION_WALLET_LOCATION 参数,指定软件 wallet 路径。其中,在 sqlnet.ora 文件中添加的条目如下。

 ENCRYPTION_WALLET_LOCATION=
	(SOURCE=
		(METHOD = FILE)
		(METHOD_DATA =
			(DIRECTORY = D:\AAA\box\oracle12WINDOWS.X64_193000_db_home\wallet)
		)
	)

ENCRYPTION_WALLET_LOCATION参数的作用就是告知Wallet的实现方式和物理位置。DIRECTORY 的具体路径作为主加密Key的存放位置.

检查 sqlnet.ora 信息读取状态(任一节点)

 select * from v$encryption_wallet;
 select * from gv$encryption_wallet;

注意:确保 vencryption_wallet 与 gvencryptionwalletgvencryption_wallet 的 wallet location 是 一致的。
注意:对于 wallet 分别在不同节点的情况以及 sqlnet.ora 在加入 ENCRYPTION_WALLET_LOCATION 参数前已经被数据库各实例读取的情况,需要 重启各个实例以初始化 wallet 的状态,从而更新 gv$encryption_wallet 的 wallet location。

创建master key主密钥文件,指定wallet密码

创建该文件只有系统用户system可以,自己单独建立的用户无此权限


win+R后输入命令sqlplus打开窗口,输入用户名及密码,确定oracle正常运行

确认登录

通过以下命令建立加密文件:

alter system set encryption key identified by “123456”;

其中,123456为wallet密码。Oracle Wallet是一个可以打开关闭的功能组件,设置密码之后,只有通过密码口令可以启用wallet功能。

此时,在设置的目录下会多出一个ewallet.p12文件。这就是生成的master key文件。

启动和关闭Wallet

  1. 启动Wallet:
SQL> alter system set encryption wallet open identified by "123456";
  1. 关闭Wallet:(注意密码一定是双引号)
SQL> alter system set encryption wallet close identified by "123456";
  1. 可以通过以下语句查询Wallet是否在打开状态:
 select * from v$encryption_wallet;

查询是否是打开状态
说明:wallet只有在open的情况下才能进行数据库的透明加密,如果处于关闭状态,则会报错wallet,加密表空间需确认wallet是否真正开启。

 

表空间加密

在创建加密表空间之前,包含有表空间主密钥的 Oracle wallet 必须处于打开状态。

  1. 表空间限制
    1.1 不能加密临时和撤销表空间

    1.2 不能更改加密表空间的安全密匙

    1.3 不能加密外部表

  2. 加密表空间示例:

SQL> create tablespace DB_TEST
datafile 'D:\AAA\box\oracle\test.dbf' 
size 500m
encryption
default storage(encrypt);

其中encryption表时数据库使用默认的加密算法DES128,可以在encryption后面使用using子句来指定另外的算法,如:

SQL> create tablespace DB_TEST
datafile 'D:\AAA\box\oracle\test.dbf' 
size 500m
encryption
using '3DES168'
default storage(encrypt);
  1. 检查一个表空间是否加密:
    查看个表空间的加密属性,确定新建表空间为 TDE 加密表空间。
SQL> select encrypted from dba_tablespaces where tablespace_name='DB_TEST';

表空间是否加密

  1. 删除加密表空间
SQL>drop tablespace encts including contents and datafiles;

Tablespace dropped.

未找到相关修改现有表空间间加密解密语句。。。
如果在Navicat直接挪动表空间,可能会丢失数据。

验证加密表空间

可通过此步骤验证加密表空间是否真正有效。

  1. 测试表:创建加密表空间 ENCTS以及非加密表空间 DB_TEST。随后分别在两个表空间内创建表 JM_TABLE 以及非加密表 BJM_DATA,语句类似如下。
create table jm_table(col1 number, col2 varchar2(30)) tablespace ENCTS;
create table bjm_table(col1 number, col2 varchar2(30)) tablespace DB_TEST;

创建新表测试
创建成功后如图

  1. 创建后分别插入测试数据。
insert into jm_table values (1,'secret data');
insert into bjm_table values (1,'no secret data');

Oracle wallet 不打开,则无法对加密表空间中的表进行插入数据,类似如下结果。
其中红色框内的SQL因为wallet未打开,所以无法执行插入操作,反之,不加密的表空间则可以正常插入数据(增删改查全部同理)。
执行结果如图

尝试打开wallet之后,插入成功。如图:

插入成功

posted @ 2021-08-27 17:41  zwbsoft  阅读(1685)  评论(0编辑  收藏  举报