Oracle 11g 新特性 -- Transparent Data Encryption (透明数据加密TDE) 增强 说明
一.TransparentData Encryption (TDE:透明数据加密) 说明
Orace TDE 是Orcle 10R2中的一个新特性,其可以用来加密数据文件里的数据,保护从操作系统层面上对数据文件的访问。11g的TDE 在10gR2的基础上增强,允许在表空间级别进行加密。
1.1 11g 中TDE 新增功能
一些新增功能可增强透明数据加密(TDE)功能,这些功能是基于相同的基础结构构建的。
为支持TDE 而对LogMiner 所做的更改提供了用于更改捕获引擎的基础结构,这些引擎可用于逻辑备用、流和异步更改数据捕获。要让LogMiner 支持TDE,它必须能够访问加密Wallet。要访问该Wallet,必须装载实例并使Wallet 处于开启状态。LogMiner 不支持硬件安全模块(HSM) 或用户持有密钥。
对于逻辑备用,可在源或目标数据库挖掘日志,因此用于这两个数据库的Wallet 必须相同。
加密列的处理方式在流和基于流的更改数据捕获中均相同。将在Wallet 所在的源中挖掘重做记录。数据以未加密的方式传输到目标位置,然后在目标位置使用Wallet 进行加密。该数据可以使用高级安全选项在传输中进行加密以实现网络加密。
TDE 中的新增功能包括:
(1) 表空间加密
(2) 支持LogMiner
(3) 支持逻辑备用
(4) 支持流
(5) 支持异步更改数据捕获
(6) 基于硬件的主密钥保护
1.2 表空间加密
表空间加密以在写入时进行加密并在读取时进行解密的块级别加密技术为基础,并不在内存中对数据进行加密。影响加密的唯一因素与I/O 相关联。SQL 访问路径不变,并且支持所有数据类型。要使用表空间加密,加密Wallet 必须处于开启状态。
CREATETABLESPACE 命令包含一个用于设置加密属性的ENCRYPTION 子句,以及一个导致使用加密的ENCRYPT 存储参数。可以指定USING 'encrypt_algorithm' 来指示要使用的算法名称。有效的算法包括3DES168、AES128、AES192和AES256。默认算法为AES128。可以在V$ENCRYPTED_TABLESPACES 视图中查看这些属性。
加密的数据在执行操作(如JOIN 和SORT)期间会受到保护。这意味着数据在移动到临时表空间时是安全的。还原日志和重做日志中的数据也受到保护。
如果平台有相同的Endianess和Wallet,则加密的表空间是可移动的。
限制:
(1) 无法对临时表空间和还原表空间进行加密(所选的块已加密)。
(2) Bfiles 和外部表未加密。
(3) 不支持跨不同的endian 平台移动表空间。
(4) 当前无法更改加密表空间的密钥。解决方法是:使用所需的属性创建一个表空间,然后将所有对象移动到新建的表空间中。
1.3 硬件安全模块
硬件安全模块(HSM) 是一种物理设备,可以安全地存储加密密钥。它还可以提供安全的计算空间(内存)以执行加密和解密操作。HSM 是Oracle wallet 的一种更安全的代替方法。
透明数据加密(TDE) 可使用HSM 来加强敏感数据的安全性。HSM 用于存储TDE 使用的主加密密钥。因为HSM 是一种物理设备而不是一个操作系统文件,所以在未授权的访问尝试中密钥是安全的。使用主加密密钥的所有加密和解密操作都在HSM 中执行。这意味着主加密密钥永远不会在不安全的内存中公开。
有些供应商可提供硬件安全模块,这些供应商还必须提供相应的库。
二.示例
更多测试参考:
Securing Stored Data Using Transparent DataEncryption
http://docs.oracle.com/cd/E11882_01/network.112/e10746/asotrans.htm
2.1 创建Wallet
在对LOB 进行加密的SecureFile中也会用到wallet。
Oracle 11g 新特性 -- SecureFiles 说明
http://blog.csdn.net/tianlesoftware/article/details/8231322
在sqlnet.ora 文件里添加: ENCRYPTION_WALLET_LOCATION 和WALLET_LOCATION参数。
默认位置是:$ORACLE_BASE/admin/$ORACLE_SID/wallet。
--指定ORACLEWALLET的位置,这里使用ORACLE_HOME/network/admin,在sqlnet.ora里添加如下内容:
WALLET_LOCATION=
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY =/u01/app/oracle/product/11.2.0/db_1/network/admin)
)
)
ENCRYPTION_WALLET_LOCATION=
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY =/u01/app/oracle/admin/dave/encryption_wallet)
)
)
SQLNET.WALLET_OVERRIDE= TRUE
SSL_CLIENT_AUTHENTICATION= FALSE
SSL_VERSION =0
--添加完之后,重启listener,使参数生效。
--创建wallet:包括设置密码、生成信任文件、并启动wallet
CONN / ASSYSDBA
-- 11g version
ALTER SYSTEMSET ENCRYPTION KEY IDENTIFIED BY "myPassword";
ALTER SYSTEM SET ENCRYPTION WALLET CLOSE IDENTIFIEDBY "myPassword";
当实例重启后或者wallet被关闭后,必须重新openwallets,这样才能保护被加密的列.而在Open wallet之前,数据库必须处于mount 状态。 官网的说明如下:
The securityadministrator also needs to open the wallet before performing database recoveryoperations. This is because background processes may require access toencrypted redo and undo logs. When performing database recovery, the walletmust be opened before opening the database. This is illustrated in thefollowing statements:
SQL> STARTUP MOUNT;
SQL> ALTER SYSTEM SET ENCRYPTION WALLETOPEN IDENTIFIED BY "myPassword";
SQL> ALTER DATABASE OPEN;
当然也可以选择配置自动登陆wallets。 但oracle 并不推荐使用这种方法。
2.2 创建加密表空间
创建加密表空间使用ENCRYPTION 选项,通过USING 选项指定加密算法,默认使用AES128算法。注意,storage 选项必须指定ENCRYPT。 使用了表空间加密后就不允许使用NO SALT 选项。
注意: 存在在加密表空间里的数据,我们不能直接通过HEX的编辑器或者strings命令直接查看数据文件里的内容。 而如果是普通的数据文件,我么可以直接在操作系统层面查看数据文件里的内容。
SQL> CREATE TABLESPACE encrypted_anqing
2 DATAFILE'/u01/app/oracle/oradata/dave/anqing01.dbf' SIZE 50M
3 AUTOEXTEND ON NEXT 10M
4 ENCRYPTION USING 'AES256'
5 DEFAULT STORAGE(ENCRYPT);
Tablespace created.
--查看表空间加密情况:
SQL> SELECT tablespace_name, encryptedFROM dba_tablespaces;
TABLESPACE_NAME ENC
------------------------------ ---
SYSTEM NO
SYSAUX NO
UNDOTBS1 NO
TEMP NO
USERS NO
ENCRYPTED_ANQING YES
6 rows selected.
一般表空间不能转换成加密表空间。 可以使用export/import,alterdatabase…move… 或者create table …as select * from … 来进行转换。
2.3 测试表空间加密
SQL> CREATE TABLE dave (
2 id NUMBER(10),
3 data VARCHAR2(50)
4 )
5 TABLESPACE encrypted_anqing;
Table created.
SQL> CREATE INDEX idx_id ON dave(id)TABLESPACE encrypted_anqing;
Index created.
SQL> INSERT INTO dave (id, data) VALUES(1, 'This is a secret!');
1 row created.
SQL> COMMIT;
Commit complete.
SQL> select * from dave;
ID DATA
------------------------------------------------------------
1 This is a secret!
--flush buffer cache,确保数据刷入到数据文件:
SQL> ALTER SYSTEM FLUSH BUFFER_CACHE;
System altered.
--当数据存放在加密的表空间之后,我们使用HEX editor,如UltraEdit,则不会显示我们的data,而普通表空间是可以直接查看的:
[oracle@dave/u01/app/oracle/oradata/dave]$strings anqing01.dbf|grep "secret"
[oracle@dave /u01/app/oracle/oradata/dave]$
--这里返回为空。
--验证非加密表空间:
SQL> create table dave2 tablespace usersas select * from dave;
Table created.
SQL> alter system flush buffer_cache;
System altered.
--注意: 这里对非加密表空间而言,我们可以直接查看加密的数据:
[oracle@dave/u01/app/oracle/oradata/dave]$strings users01.dbf|grep "secret"
This is a secret!
[oracle@dave /u01/app/oracle/oradata/dave]$
--删除加密表空间:
SQL> DROP TABLESPACE encrypted_anqingINCLUDING CONTENTS AND DATAFILES;
Tablespace dropped.
2.4 列(Column)加密
SQL> conn dave/dave;
Connected.
SQL> create table dave as selectobject_id as id, object_name as name from dba_objects;
Table created.
SQL> desc dave
Name Null? Type
------------------------------------------------- ----------------------------
ID NUMBER
NAME VARCHAR2(128)
SQL> create index idx_dave_id ondave(id);
index created.
SQL> ALTER TABLE dave MODIFY (NAMEencrypt USING 'AES256' IDENTIFIED BY 'myPassword');
Table altered.
SQL> desc dave
Name Null? Type
------------------------------------------------- ----------------------------
ID NUMBER
NAME VARCHAR2(128) ENCRYPT
SQL> set lin 160
SQL> col WRL_PARAMETER FOR a50
SQL> SELECT * FROM V$ENCRYPTION_WALLET;
WRL_TYPE WRL_PARAMETER STATUS
---------------------------------------------------------------------- ------------------
file /u01/app/oracle/admin/dave/encryption_wallet OPEN
SQL> ALTER SYSTEM SET encryption walletCLOSE IDENTIFIED BY "myPassword";
System altered.
SQL> SELECT * FROM V$ENCRYPTION_WALLET;
WRL_TYPE WRL_PARAMETER STATUS
---------------------------------------------------------------------- ------------------
file /u01/app/oracle/admin/dave/encryption_wallet CLOSED
--这里wallet 已经关闭。
--关闭之后查询,就会报错: wallet is not open:
SQL> select * from dave where rownum=1;
select * from dave where rownum=1
*
ERROR at line 1:
ORA-28365: wallet is not open
--重新打开wallet,就可以查询加密的列了:
SQL> ALTER SYSTEM SET ENCRYPTION WALLETOPEN IDENTIFIED BY "myPassword";
System altered.
SQL> SELECT * FROM V$ENCRYPTION_WALLET;
WRL_TYPE WRL_PARAMETER STATUS
---------------------------------------------------------------------- ------------------
file /u01/app/oracle/admin/dave/encryption_wallet OPEN
SQL> select * from dave where rownum=1;
ID NAME
---------- -------------------
20 ICOL$
---------------------------------------------------------------------------------------
版权所有,文章允许转载,但必须以链接方式注明源地址,否则追究法律责任!
Skype: tianlesoftware
QQ: tianlesoftware@gmail.com
Email: tianlesoftware@gmail.com
Blog: http://blog.csdn.net/tianlesoftware
Weibo: http://weibo.com/tianlesoftware
Twitter: http://twitter.com/tianlesoftware
Facebook: http://www.facebook.com/tianlesoftware
Linkedin: http://cn.linkedin.com/in/tianlesoftware