论文部分内容阅读
如果例行重启数据库时返回错误:数据文件损坏,无法启动数据库,而准备恢复数据库时,却又发现损坏的数据文件根本没有备份,此时有多年DBA经验的你也开始紧张,变得手足无措。好在有人提醒你网上可以找到一类称为DUL的工具,能够脱机把损坏的数据文件中的数据读出来。在费了许多周折后,你终于将损坏文件中绝大部分数据读出,在数据库中重新建表并成功读入数据。你一方面暗中庆幸逃过一劫并心中立誓以后一定认真备份绝不重蹈覆辙,另一方面对这种工具的功能会感到好奇:Oracle软件都不能打开文件,无法启动数据库,这工具怎么能在没有DBMS的情况下将数据读出?
惊奇背后
事实上实现这类工具的原理非常简单:Oracle为了在文件中存放数据,设计了一套在数据块中存放数据的格式,只要按数据块的类型将内容还原即可。事实上,不需要使用专门的工具也可以直接从数据文件中找到许多数据。如图1为某一数据文件中一个块的十六进制输出。熟悉Oracle数据块结构的DBA可以很容易地识别出块的类型和实际存放的数据。然而即便是对块结构一无所知,执行Linux的标准命令“strings”,对下面的输出也能猜出数据的语义——身份证号和信用卡号。
120104198010102858
5311-5312-8600-0465
310104195802022516
5490-1234-5678-9128
110108197609091576
4552-7204-1234-5677
至此,相信你会有一种不祥的感觉:虽然在SQL层次上定义权限和角色严格限制了对数据的存取,原来在数据文件层次上却是完全不设防的。任何用户只要可以读数据库的数据文件,不需要数据库用户和口令,也不需要数据库权限,一条命令就可以将数据库中重要的數据全部取走。
在数据库服务器中限制数据文件的存取是必不可少的措施,但是很难限制对备份文件的存取。加密是保证数据文件中敏感数据不被泄露的可靠的方法。在Oracle 10gR2中,Oracle提供了透明数据加密(TDE)的新功能,不仅支持使用标准加密算法,并且加密解密对用户和程序是完全透明的,不需要应用程序做任何修改。加密KEY也由系统统一管理,方便使用,为解决文件级的安全性提供了较好的解决方案。在Oracle 11g中,针对Oracle 10g中表数据TDE存在的问题,如索引和外键的限制,实现了表空间级的TDE,不仅去掉了限制,而且系统开销和性能也有改善。本文介绍表数据TDE和表空间TDE的操作方法,并对使用中的注意事项进行了分析,希望能对读者学习和使用TDE有所帮助。
TDE操作方法
使用TDE对表数据加密的操作非常简单,需要注意的是最初设置生成MasterKey。下面先给出Oracle 10g中表列数据的TDE操作示例,之后给出Oracle 11g中表空间TDE的示例。
1.指定MasterKey的存放位置。本例中为:/app/oracle/11g/TDE_WALLETS
mkdir -p /app/oracle/11g/TDE _WALLETS
编辑$ORACLE_HOME/ network/admin/sqlnet.ora,追加以下语句:
ENCRYPTION_WALLET_LOCATION=
(SOURCE=
(METHOD=file)
(METHOD_DATA=
(DIRECTORY=/app/oracle/11g/
TDE_WALLETS)))
之后,重新启动listener。
2.创建MasterKey。
connect / as sysdba
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY “open_walllet_pwd”;
执行这一命令,在sqlnet.ora中指定的目录下,创建一用于TDE的Oracle Wallet,文件名为ewallet.p12;打开这一Wallet,随机生成一个用于这一数据库TDE的Masterkey。(命令中给出的口令open_walllet_pwd与生成的Masterkey无关,是每次打开Wallet需给出的口令。)
至此,TDE的使用环境设置完毕,可以创建使用TDE的表。
3.创建使用TDE的表。本例中对存放信用卡卡号的列进行加密。
create table e1(
cname VARCHAR2(10),
id_card VARCHAR2(18),
credit_card VARCHAR2(19) ENCRYPT);
列定义中关键字ENCRYPT指定对该列进行TDE加密存放。
4.TDE的验证。
查询和更新TDE加密的表时,所有列都正常显示,与其他表没有任何差别,如何验证一个表的列确实被加密存放呢?系统中有哪些表列使用了TDE呢?
首先,desc命令可以显示指定表中是否存在加密列。数据字典视图DBA_ENCRYPTED_COLUMNS可以显示系统中所有TDE列。
当然,最直接的验证方法是查看在数据文件存放的TDE表的数据块。图2为TDE表数据块的十六进制输出示例。与图1比较,可以确认TDE加密列数据在块中是加密存放。在此数据文件上执行strings和cat命令,也只能显示没有加密的列。这一结果证明TDE可以有效地防止从数据文件中窃取敏感数据。
上例中为创建使用TDE的新表,对已存在的表可以修改表结构对某列进行TDE加密:
alter table emp modify (salary encrypt);
同样,也可以将某TDE列改变回普通列:
alter table e1 modify (credit_card decrypt);
5.创建TDE表空间
为加速查询,需要在某些列上建立索引。以下语句在TDE加密列credit_card上创建索引:create index i1 on e1(credit_card);
结果执行时返回如下错误:无法创建索引,ORA-28338:无法使用SALT值加密索引列。
原因非常简单,由于在加密时每一个数据都附加了一个随机数SALT,相同值加密后得到了完全不同的值。无法根据加密后的值判断两个值是否相同,自然无法创建索引。创建TDE表时如指定不使用SALT,则可以创建索引。由于加密破坏了值之间原来的次序关系,所以即便建立了索引,执行区间查询时也无法利用索引。同样的原因,TDE加密列也不能在定义外键时使用。在Oracle 11g中提供了表空间级的TDE,即整个表空间进行TDE加密,而表空间中所有对象在操作时没有任何限制,基本解决了表级TDE存在的问题。
6.启动数据库时打开Wallet以及设置自动打开Wallet。
重启数据库时,没有错误信息,但是在存取使用TDE加密的表列或TDE表空间的表时,会返回如下错误信息:
ORA-28365:Wallet 未打开
存取TDE加密数据必须事先以DBA登录,打开Wallet:
alter system set wallet open identified by“open_walllet_pwd”;
而不再需要时,可以关闭Wallet:
alter system set wallet close;
如果每次重启数据库后人工输入打开Wallet的口令比较困难,可以执行Oracle提供的工具程序orapki设置系统自动打开Wallet:
orapki wallet create -wallet /app/oracle/11g/TDE_WALLETS -auto_login
参数中指定TDE使用的Wallet的目录,本例中为/app/oracle/11g/TDE_WALLETS,命令执行时,要求输入打开Wallet的口令。在命令执行后,在相应目录下生成一名为cwallet.sso的文件,以后只要目录下有这一文件存在,数据库重启时就会自动打开Wallet。
当然,我们一定要正确认识与理解TDE的用途和局限性,TDE只是保证Oracle数据库安全的诸多方法和工具中的一个。TDE无法替代“用户角色权限”的存取控制;TDE也不能阻止好奇的DBA查看数据库中所有重要信息。如果一个入侵者利用安全漏洞得到了数据库的存取权限,即便应用了TDE,入侵者仍然可以找到其需要的一切。没有坚实的基础安全管理,TDE根本不能发挥作用,这就好像将金库门改造得刀枪不入,但是最后却忘了将金库锁上一样。所以我们一定要在多方面加强数据库的安全管理。
惊奇背后
事实上实现这类工具的原理非常简单:Oracle为了在文件中存放数据,设计了一套在数据块中存放数据的格式,只要按数据块的类型将内容还原即可。事实上,不需要使用专门的工具也可以直接从数据文件中找到许多数据。如图1为某一数据文件中一个块的十六进制输出。熟悉Oracle数据块结构的DBA可以很容易地识别出块的类型和实际存放的数据。然而即便是对块结构一无所知,执行Linux的标准命令“strings”,对下面的输出也能猜出数据的语义——身份证号和信用卡号。
120104198010102858
5311-5312-8600-0465
310104195802022516
5490-1234-5678-9128
110108197609091576
4552-7204-1234-5677
至此,相信你会有一种不祥的感觉:虽然在SQL层次上定义权限和角色严格限制了对数据的存取,原来在数据文件层次上却是完全不设防的。任何用户只要可以读数据库的数据文件,不需要数据库用户和口令,也不需要数据库权限,一条命令就可以将数据库中重要的數据全部取走。
在数据库服务器中限制数据文件的存取是必不可少的措施,但是很难限制对备份文件的存取。加密是保证数据文件中敏感数据不被泄露的可靠的方法。在Oracle 10gR2中,Oracle提供了透明数据加密(TDE)的新功能,不仅支持使用标准加密算法,并且加密解密对用户和程序是完全透明的,不需要应用程序做任何修改。加密KEY也由系统统一管理,方便使用,为解决文件级的安全性提供了较好的解决方案。在Oracle 11g中,针对Oracle 10g中表数据TDE存在的问题,如索引和外键的限制,实现了表空间级的TDE,不仅去掉了限制,而且系统开销和性能也有改善。本文介绍表数据TDE和表空间TDE的操作方法,并对使用中的注意事项进行了分析,希望能对读者学习和使用TDE有所帮助。
TDE操作方法
使用TDE对表数据加密的操作非常简单,需要注意的是最初设置生成MasterKey。下面先给出Oracle 10g中表列数据的TDE操作示例,之后给出Oracle 11g中表空间TDE的示例。
1.指定MasterKey的存放位置。本例中为:/app/oracle/11g/TDE_WALLETS
mkdir -p /app/oracle/11g/TDE _WALLETS
编辑$ORACLE_HOME/ network/admin/sqlnet.ora,追加以下语句:
ENCRYPTION_WALLET_LOCATION=
(SOURCE=
(METHOD=file)
(METHOD_DATA=
(DIRECTORY=/app/oracle/11g/
TDE_WALLETS)))
之后,重新启动listener。
2.创建MasterKey。
connect / as sysdba
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY “open_walllet_pwd”;
执行这一命令,在sqlnet.ora中指定的目录下,创建一用于TDE的Oracle Wallet,文件名为ewallet.p12;打开这一Wallet,随机生成一个用于这一数据库TDE的Masterkey。(命令中给出的口令open_walllet_pwd与生成的Masterkey无关,是每次打开Wallet需给出的口令。)
至此,TDE的使用环境设置完毕,可以创建使用TDE的表。
3.创建使用TDE的表。本例中对存放信用卡卡号的列进行加密。
create table e1(
cname VARCHAR2(10),
id_card VARCHAR2(18),
credit_card VARCHAR2(19) ENCRYPT);
列定义中关键字ENCRYPT指定对该列进行TDE加密存放。
4.TDE的验证。
查询和更新TDE加密的表时,所有列都正常显示,与其他表没有任何差别,如何验证一个表的列确实被加密存放呢?系统中有哪些表列使用了TDE呢?
首先,desc命令可以显示指定表中是否存在加密列。数据字典视图DBA_ENCRYPTED_COLUMNS可以显示系统中所有TDE列。
当然,最直接的验证方法是查看在数据文件存放的TDE表的数据块。图2为TDE表数据块的十六进制输出示例。与图1比较,可以确认TDE加密列数据在块中是加密存放。在此数据文件上执行strings和cat命令,也只能显示没有加密的列。这一结果证明TDE可以有效地防止从数据文件中窃取敏感数据。
上例中为创建使用TDE的新表,对已存在的表可以修改表结构对某列进行TDE加密:
alter table emp modify (salary encrypt);
同样,也可以将某TDE列改变回普通列:
alter table e1 modify (credit_card decrypt);
5.创建TDE表空间
为加速查询,需要在某些列上建立索引。以下语句在TDE加密列credit_card上创建索引:create index i1 on e1(credit_card);
结果执行时返回如下错误:无法创建索引,ORA-28338:无法使用SALT值加密索引列。
原因非常简单,由于在加密时每一个数据都附加了一个随机数SALT,相同值加密后得到了完全不同的值。无法根据加密后的值判断两个值是否相同,自然无法创建索引。创建TDE表时如指定不使用SALT,则可以创建索引。由于加密破坏了值之间原来的次序关系,所以即便建立了索引,执行区间查询时也无法利用索引。同样的原因,TDE加密列也不能在定义外键时使用。在Oracle 11g中提供了表空间级的TDE,即整个表空间进行TDE加密,而表空间中所有对象在操作时没有任何限制,基本解决了表级TDE存在的问题。
6.启动数据库时打开Wallet以及设置自动打开Wallet。
重启数据库时,没有错误信息,但是在存取使用TDE加密的表列或TDE表空间的表时,会返回如下错误信息:
ORA-28365:Wallet 未打开
存取TDE加密数据必须事先以DBA登录,打开Wallet:
alter system set wallet open identified by“open_walllet_pwd”;
而不再需要时,可以关闭Wallet:
alter system set wallet close;
如果每次重启数据库后人工输入打开Wallet的口令比较困难,可以执行Oracle提供的工具程序orapki设置系统自动打开Wallet:
orapki wallet create -wallet /app/oracle/11g/TDE_WALLETS -auto_login
参数中指定TDE使用的Wallet的目录,本例中为/app/oracle/11g/TDE_WALLETS,命令执行时,要求输入打开Wallet的口令。在命令执行后,在相应目录下生成一名为cwallet.sso的文件,以后只要目录下有这一文件存在,数据库重启时就会自动打开Wallet。
当然,我们一定要正确认识与理解TDE的用途和局限性,TDE只是保证Oracle数据库安全的诸多方法和工具中的一个。TDE无法替代“用户角色权限”的存取控制;TDE也不能阻止好奇的DBA查看数据库中所有重要信息。如果一个入侵者利用安全漏洞得到了数据库的存取权限,即便应用了TDE,入侵者仍然可以找到其需要的一切。没有坚实的基础安全管理,TDE根本不能发挥作用,这就好像将金库门改造得刀枪不入,但是最后却忘了将金库锁上一样。所以我们一定要在多方面加强数据库的安全管理。