目标
这个注解是为了回答下面的问题:
1. 当在2个或者更多的数据库中共享一个TDEwallet的时候,应该期待着什么?
2. 推荐什么,独立wallet还是共享?
解决方案
1. 当在2个或者更多的数据库中共享一个TDE钱包的时候,应该期待着什么?
1.2使用加密专栏
数据库将共享智能密钥
TDE 机制以这样的方式工作: 当产生一个新的智能密钥时,在数据库中已有的目标密钥用新的智能密钥加密。 新的目标将会用当前的智能密钥加密。
#2 因此,如果数据库的智能密钥是重新设置的,数据库#1中的所有目标,不管是新的还是旧的,都会使用最近的智能密钥。然而, 在数据库#2中,旧的目标仍会使用旧的智能密钥,也就是在数据可#1重设置密钥之前的使用的密钥。然而,新产生的目标将会使用新的智能密钥。
#3因此,如果智能密钥仅在第一个数据库中被重设多次,一个用户可能会以在数据库#1中的所有目标应用相同的,最新的,智能的密钥结束。然而在数据库#2中,目标可能会用在共享开始之后所产生的所有的智能密钥。
#4 如果想用最新的密钥重设第二个数据库中的所有目标,就得对数据库中用前面的智能密钥加密的目标进行解密。
为了证明上面的,一个应用数据库2的例子, TEST1 和TEST2 被创建。
1. enc$ 字典表, 保持智能密钥和目标的一致性
2. mkstore命令,它允许检查wallet的内容,使用: mkstore -wrl <wallet location> -list
证明上面陈述的步骤
#1. 首先创建数据库2, 从相同的Oracle主目录产生TEST1 和 TEST2。
#2. 这时,产生一个普通的钱包地址,ie,设置在sqlnet.ora:
#3. 在TEST1的数据库中产生wallet
SQL> 变换系统,由”welcome1” 设置密钥认证
#4. 在TEST1 和 TEST2中检查v$ 加密钱包,这个钱包在二者中时可见,可获得的。
在TEST2 中打开wallet
SQL >变换系统,由”welcome1”设置钱包的打开认证
正如所看到的,打开共享的钱包是没有问题的。 v$ 加密钱包在TEST1中显示了相同的值
#5 可以运行wallet目录核对wallet的内容
#6. 在两个数据库中创建加密的目标
下面的在TEST1和TEST2中运行:
SQL> 由测试创建测试用户认证
SQL > 为测试安排dba
sQL> conn test/test
SQL> 创建测试表
SQL>插入测试值
SQL > 提交
#7. 核对 enc$
测试1
SQL > 设置页码范围 1500
SQL> 从enc$选择obj#, mkeyid
测试2:
SQL> 从enc$选择obj#, mkeyid
到此,数据库2使用相同的智能key, 因为这些是创建的首批目标。因此,所有的,都没有问题。:
#8. 对wallet备份,并且在TEST1中重设密钥
SQL> 变换系统,由”welcome1” 设置密钥认证
#9. 在TEST1中核对enc$ 的效应
SQL> 从enc$选择obj#, mkeyid
正如所看到的,智能key已经变了。
在wallet 内部同样,也能看到。
#10. 在TEST2中重新打开wallet
SQL> 变换系统,由”welcome1” 设置密钥认证
SQL> 从enc$选择obj#, mkeyid
这个目标的智能密钥没有被重新设置,即使在第一个db中它已完成。 前面加密的目标仍然使用前面的智能key. 这是注意到的一个差异点。并且它不易被发现。
#11 重新存储第一个wallet, 因为前面的智能key被重设,证明上面的:
测试1:
SQL> 变换系统,由”welcome1” 重设wallet打开认证
SQL> select * from test;
测试2:
SQL> 变换系统,由”welcome1” 重设wallet打开认证
SQL> conn test/test
#12. 重新存储最近的wallet
#13. 当在TEST2上创建一个新的加密表时,将会使用新的智能密钥:
SQL> conn test/test
SQL> 在test1中创建表
2 (id number encrypt);
SQL >对测试1插入值
SQL> 提交
SQL> conn / as sysdba
SQL > 从enc$中选择obj#, mkeyid
新的目标应用新的智能key.
现在,在TEST2 中应用了两个智能密钥
#14. 在TEST2数据库中重新设置智能密钥,正如所期待的,对两个目标,智能密钥被重新设置。
SQL> 变换系统, 由”welcome1”设置密钥认证
SQL > 从enc$ 中选择 obj#, mkeyid
#15. 在enc$中,每一个加密目标有一个入口。
当创建智能key时,正如所期待的,所有的入口都被重设。然而,在这种情况下,当在2个数据库中共享wallet和智能key时, 重设智能key使在其他数据库的就目标应用旧的key.其他的数据库至少使用2个智能key. 因此,为了能够在两个数据库中使用相同的智能密钥,一个数据库重设智能key时,另一个数据库中存在的目标必须被重新编码。
alter table <table_name> rekey.
在TEST1中创建新的加密表。
SQSQL> conn test/test
SQL> 在test1中创建表
2 (id number encrypt);
SQL> 在test1 中插入值
SQL>提交
SQL> 从enc$中选择 obj#, mkeyid
73404 旧表使用以前的智能key
73409 新表使用新的智能key
重新设置key
SQL> 修改测试表key
SQL> 从enc$中选择obj#, mkeyid
73404 现在旧表使用新的key
73409 正如所期待的,wallet 的内容包含所有的3个智能key.
l 每次wallet 备份或者是恢复它推荐的一下步骤:
变换系统,由“welcome1”设置 wallet的关闭认证
恢复或者备份
变换形同,由“welcome1”设置wallet的打开认证
1.2 USING TABLESPACE ENCRYPTION
在11gR1中,数据库可以无误的共享wallet.在2个数据库中测试,的确可以证实2个数据库共享wallet.
SQL> 从vs$加密 wallet中选择wrl参数,状态
在创建空间表的过程中没有产生错误。2个数据库共享表空间加密key.在这个设置中没有明显的错误。同样地, 应该提到空间加密表在释放的过程中不能被重新设置。
在11gR2中,数据库之间可以无误的共享wallet. 事实上,
1. 空间加密key只产生一次,但是不管有多少数据库插入这个wallet, 它将一直被使用。这个加密key 不管是在11.1中还是在11.2中,都不能改变。
2. 释放1和2的仅有的不同是在11.2中, 使用同一标准的key去加密列和空间表加密key.
2. 推荐怎么做,把wallet独立和共享它们
在技术上共享wallet是没有问题的。 正如所看到的一样,在这样做的时候没有错误,或者是功能丢失。
然而,管理这样的一个系统可能会有点微妙,特别是当需要频繁的智能加密key时,必须在两个数据库上同时重设key, 来确保数据库要求标准的依从性。 正如所看到的,只在一个数据库上重设key,会使另一个数据库对于旧的目标仍然使用旧的key。
这样,只要这种情况被彻底的理解并且这样的接受,数据库之间就可以共享wallet, 只要数据库是单一实例,并且数量不大。
然而,共享wallet不是一个好主意。
RAC实例,必须在一个节点上重设key. 就像在文件中看到的一样,当wallet 不共享时,必须将wallet复制到其他节点上。
结点有大量的数据库时使用TDE. 对于所有的数据库,wallet 可能会变成一个单一失败点。
在这种情景下,最好使用独立的wallet. 不管是在$ORACLE_BASE/admin/<SID>/wallet下使用默认的地址,还是使用独立的sqlnet.ora files/instance管理wallet的地址。
注意 1240824.1, 设置Sqlnet时对数据库安全的细节性影响。
3.怎么把共享的wallet移植到独立的wallet?
#1. 关闭wallet。 将wallet备份以防出现错误并可以避免任何用户错误。
变换系统,设置wallet 为关闭状态。
#2. 如果这个wallet不使用默认的地址,确保在sqlnet.ora文件中它的独特性。
检查:
文件 1240824.1. 设置Sqlnet 对数据库安全性的影响。
#3. 创建一个新的wallet地址,并将这个wallet复制到期望的独立地址中。
#4. 如果需要的话,正如上面的注释所表明的,重启事务或者监听口。由v$wallet_location.查询来确保新的wallet 的地址已经使用。
变换系统,由“wallet password”设置打开认证,来打开wallet.
#5. 如果需要的话,确保存在的部分重启。只有当一个部分重启时,它才需要sqlnet.ora
#6. 实施操作,它可以使用新的wallet地址。
#7. 对于所有的数据库重复相同的步骤。