ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【原创】洪兴社的Oracle情节之安全管理篇(一)

【原创】洪兴社的Oracle情节之安全管理篇(一)

Linux操作系统 作者:mdl9630 时间:2014-03-09 20:51:34 0 删除 编辑

 

更多精彩内容尽在 www.leonarding.com

《洪兴社的Oracle情节之安全管理篇()

数据库版本

SYS@LEO1>select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production


浅谈Oracle安全管理

1.说起安全,脑海里浮现出来CSDN数据库攻击事件,600w条用户账户信息被泄漏了,消息一出天下一片哗然。在网上我们经常可以看到安全事件,而往往都是出现问题后才亲身体验到安全的重要性,就好比伴随我们长大的QQ突然被可恶的家伙盗走了,我们都会伤心落泪,更何况金融账户信息被窃取了呢,这些都是非常严重的安全事件。对于企业而言,就要看企业对数据的重视程度了,如果数据对企业的发展至关重要,自然老总就要在安全方面多下下功夫。如果数据随时都可以有,网上一查一大把,安全问题自然就会无视。   

对于个人而言,思想形态的导向具有很大的参考价值,例如西方对个人信息会看的非常重要,动不动就可能闹上法庭。东方人思想涉及这方面的还不是很全面,安全的投入在总体上所占比重也小,这就导致了安全事件频发,值得深思。

2.数据安全知多少

网络层:内外网隔离

        软硬防火墙堆叠

        VPN专属通道

        IP地址隐藏

        MAC地址绑定

操作系统层:系统漏洞

            病毒入侵

            潜伏木马

            肉鸡效应

应用系统:数据加密

          ssh安全连接

          身份认证

          权限控制

          密码认证

数据库:用户管理

        权限管理

        数据管理

        审计管理

我们从一个系统角度由外到内给大家阐述了一下安全所涉及的层面,每个层面都有哪些安全内容分解出来,这里只写出了一些常见安全问题,目的是给大家一个思路和思考方向。下面我们来演示一下Oracle安全管理的小case


如果有一个用户,唯一的用途就是查询某张表的数据,请给他授予满足这个条件的最小权限。

故事名:《洪兴社的Oracle情节》

故事从这里开始:很久很久以前,中华大地上崛起了一个门派,名叫“洪兴”。这个门派可不得了,中华大地无人不知无人不晓,据后来讲其名声威望已经传至海外,正可谓“天福永享,寿与天齐”。俗话说的好,自古英雄出少年,此时我们的主人公正式出场,大名:陈浩南(当然东南西北你都可以取这里没上专利)  小名:难难  英文名:chenhaonan(请联想小沈阳语气)。此人就是后来称霸“铜锣湾”的扛把子-前途无量-这都是后话。现在他还是一枚未出茅庐的小正太,由于小时候看“古惑仔”看多了,就也想出来混。出来混就要有后台,有后台的绿色通道就是入门派,要加入门派就要选个有前途有名气的,这样出去一说才不会被人看扁,抱着不争馒头争口气的信念,难难同学光荣加入顶级帮派“洪兴”。到此就算入了门。

        国有国法~帮有帮规,难难同学也和别人一样从小弟干起,慢慢打怪升级。一般来讲要想升级快那就去实战,实战是检验真理的唯一标准嘛!如果你要是等级低那还是低调点,本来是出去打怪的,回头别让别人把自己当怪打了吧。那还有没有第二条路呢?老前辈早就给晚辈们做好了榜样,搭好了台子,指引了方向。洪兴社之所以长盛不衰是因为有着良好的“老中青”三层体系结构,为了锻炼“puber”们,特设“藏经阁”这个部门是用来专门培训新队员的。当然随着功力的提高,战绩也会相应提高,有了战绩的成绩,职务也自然水涨船高。职务提升了被授予的权限自然就多了,权大了可以做的事就多了。咱们的党就是采用这套“标准流程”据说挺好使。咱们难难同学只是个刚入门的小弟,自然没有什么权限,给个进门的通行证就不错了。下面说说“藏经阁”,它是一个9层大宝塔,里面放着武功秘籍,层数越高存放的武功秘籍越强,如果你是小弟就不用费啥脑细胞了一层一层的来吧。走个后门送个红包啥的就别想了,干这行的都是真刀真枪实干出来的,偷取不得半点马虎。第一层就有一本书,想必大家都听过“鳞波微步”,就是告诉你遇到麻烦时如何稳准狠的闪人,这个不丢脸,留得青山在不怕没柴烧~若山也不在那就去他山,反正保住小命最重要。为了让你进去后安心只看那本“跑的快”的书,会发给你一把钥匙,这个钥匙只能打开这本书,做什么事都讲究个循序渐进,一口吃不了个胖子,慢慢来吧。

下面我们进入场景篇

现在是19:28分,数字蛮吉利的,难难=nn同学腾空出世,出世归出世,可他什么权限都没有,连藏经阁都进不去

LEO1@LEO1>create user nn identified by nn default tablespace leo1;

User created.

现在是19:36分,数字也蛮不错的,我们传说中的“鳞波微步”大典也将出世

LEO1@LEO1>create table linboweibu (name varchar2(20),shijian number);        步法&时间

Table created.

LEO1@LEO1>insert into linboweibu values('kuai1',1);      1步法,要练1个月

1 row created.

LEO1@LEO1>insert into linboweibu values('kuai2',2);      2步法,要练2个月

1 row created.

LEO1@LEO1>insert into linboweibu values('kuai3',3);      3步法,要练3个月

1 row created.

LEO1@LEO1>insert into linboweibu values('kuai4',4);      4步法,要练4个月

1 row created.

LEO1@LEO1>commit;

Commit complete.

LEO1@LEO1>select * from linboweibu;

NAME                    SHIJIAN

-------------------- ----------

kuai1                         1

kuai2                         2

kuai3                         3

kuai4                         4

现在难难同学迫不及待想去学习这本“跑的快”的秘籍,但首先要解决的就是如何进入藏经阁,如果连门都进不去就啥都别想了。很简单找boss来张通行证即可。

nn太心急,头脑也简单,大半夜摸着黑就想神不知鬼不觉的溜进去

LEO1@LEO1>conn nn/nn

ERROR:

ORA-01045: user NN lacks CREATE SESSION privilege; logon denied

Warning: You are no longer connected to ORACLE.

咣叽碰了一鼻子灰,门禁系统打出友情提示:NN缺少会话权限,拒绝登陆,没辙还低申请通行证。

LEO1@LEO1>grant create session to nn;     

Grant succeeded.

LEO1@LEO1>conn nn/nn

Connected.

很快老板就给nn同学颁发了通行证,这回nn可以顺利进入藏经阁啦!到了藏经阁第一层,nn以迅雷不及掩耳之势,一下子扑到秘籍面前想一睹书颜,然后就哭了,为啥?跑的太快没拿钥匙,哎~心急吃不了热豆腐!

NN@LEO1>select * from linboweibu;

select * from linboweibu

              *

ERROR at line 1:

ORA-00942: table or view does not exist

再来一遍,回去->找老板->拿钥匙->取书

NN@LEO1>conn leo1/leo1

Connected.

LEO1@LEO1>grant select on leo1.linboweibu to nn;

Grant succeeded.

LEO1@LEO1>conn nn/nn

Connected.

NN@LEO1>select * from leo1.linboweibu;

NAME                    SHIJIAN

-------------------- ----------

kuai1                         1

kuai2                         2

kuai3                         3

kuai4                         4

nn翻山越岭,跋山涉水,苍天不负有心人,终于看到了久违的“鳞波微步”。

小结:从上面的故事中我们可以清楚的学习到,想查询一张表的内容至少需要获得“create session”和“select”两个权限。我的故事也告一段落,手都酸了~休息休息一会儿:)大家也休息一会。


通过配置,让Oracle分别使用操作系统身份验证和密码文件身份验证,给出演示过程。

操作系统身份验证

故事又开始了:在洪兴社成立2年之后,由于管理有方成员卖力,名气越来越响,生意蒸蒸日上,一片欣欣向荣。每年新招会员都突破了指标名额,渐渐的形成了一个小社区,大家都生活在这片名叫“洪兴城”的社区中,社区虽小但五脏俱全,同时各项成本也为之增加,虽说生意不错收入披丰,但咱也是过日子的人。经过了之前有上顿没下顿的生活,现在也需要引进集约化资源整合思路,控制各项成本的开支。其中成本最大的就是“通行证”制作费,比如每次进入“洪兴城”需要通行证,每次进入“藏经阁”又需要通行证,而且通行证单次有效,下次就不可以使用了,需要换新的,人少还行,可人多了之后,可以想象这是一个多么巨大的成本开销啊。改革!一定要改革!社长蒋先生喊出了口号。军师:小诸葛,眼睛一转,一个好主意就此诞生。不需要每次进出各个地方都开具通行证了,只要你已经通过了门卫许可进入了“洪兴城”,那么就可以证明你是社区中的一员,既然是自己人那么去其他地方就应当自由通行,无需验证。

我们进入场景篇

Linux操作系统=洪兴城

藏经阁=Oracle数据库

通过了洪兴城的验证在进入藏经阁的时候就无需再验证了,同理通过Linux操作系统验证在进入数据库的时候也就不用验证了。

现在我们已经进入操作系统了,当前用户名为“oracle

[oracle@leonarding1 ~]$ whoami

oracle

[oracle@leonarding1 ~]$ sqlplus / as sysdba       这时我们并没有输入密码等身份识别信息就顺利登录数据库了

SQL*Plus: Release 11.2.0.1.0 Production on Wed Jun 5 23:10:12 2013

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SYS@LEO1>show user

USER is "SYS"

注:当你可以顺利登录操作系统也就意味着可以正常登录数据库,这就是“操作系统身份验证”,即Oracle默认


密码文件身份验证

故事继续:抱着做大做强的理念,洪兴小团体已经从几个人发展成为上千人的大团体,俗话说“队伍一大就不好带了”。最近社区保安队总是接到“丢书事件”,由于去“藏经阁”学习的人太多,难免会有学霸出现,对武功秘籍如痴如醉读不完怎么办->:随手带走拿回去读。久来久之“藏经阁”管理员扛不住了,我们需要了解哪些人来过这里读了哪些书,这就需要一套信息验证系统,根据国际惯例,采用密码身份验证策略,其原理就是在我这里保存一套密码册,你来登录如果你在我的密码册有备案good恭喜顺利进入,如果密码册里没有你的信息,对不起暂时还不可进入,执行之后,大大控制了人流量,秩序又回到了从前。要不说管理员可不是单单的技术工种,这里需要经验需要思考需要谨慎的执行需要反复的测试,回报一定会有的,不要问路在何方其实路就在脚下。

进入场景篇

所谓密码文件验证:首先创建一个文件,文件中记录具有管理权限的管理员信息,当管理员登录的时候会去这个文件中找密码信息,如果输入的密码与密码文件中保存的密码匹配一致,那么可以顺利通过。密码文件验证只对具有SYSDBA角色的用户有效。

密码文件验证的使用场景

1)通过监听连接至数据库并登陆为管理员角色都会用到密码文件

2)在数据库没有打开的情况下,用密码文件作验证

3)本地登陆管理员角色不使用密码文件,使用操作系统认证OS这是默认设置,但可以修改成密码文件验证

密码文件的保存路径: $ORACLE_HOME/dbs

[oracle@leonarding1 dbs]$ pwd

/u02/app/oracle/product/11.2.0/db_1/dbs

-rw-r----- 1 oracle oinstall    1536 Apr 26 08:56 orapwLEO1   这个就是密码文件,orapw+实例名

如何生成一个密码文件

[oracle@leonarding1 dbs]$ orapwd file=orapwLEO1 password=oracle entries=30 force=y

-rw-r----- 1 oracle oinstall    5120 Jun  6 07:17 orapwLEO1   从日期上看这个密码文件是刚刚生成的

名词解释

orapwd 创建密码文件的关键字。

file=orapwLEO1 密码文件名称,格式 orapw+实例名。

password=oracle 密码文件中保存的密码为oracle

entries=30 最多允许存放30个具有SYSDBA角色的用户信息,grant  dba  to  liushengSYSDBA角色授权给一个用户,此时就把用户名和权限信息添加到orapwLEO1密码文件中,如果revoke撤销了SYSDBA角色,会从密码文件中删除用户信息。

force=y 强制覆盖一个已存在的密码文件。

密码文件验证的设置

需要在sqlnet.ora文件中设置sqlnet.authentication_services=(none)之后Oracle采用密码文件验证

演示

设置密码文件

[oracle@leonarding1 admin]$ vim sqlnet.ora

551 #sqlnet.authentication_services=(beq, kerberos5)      大家找到551行修改为

sqlnet.authentication_services=(none)                  去掉#号,把括号内容变成none,保存退出

温馨提示:在command模式,输入:set number on可打开数字序列前缀

启动密码文件验证后测试,使用sys用户进行直接登录

[oracle@leonarding1 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Thu Jun 6 09:23:08 2013

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

ERROR:

ORA-01031: insufficient privileges                      权限不足

报错“权限不足”说明现在已经不是操作系统验证模式了,必须输入密码与密码文件中保存的密码进行匹配成功才可正常登录

[oracle@leonarding1 ~]$ sqlplus sys/oracle as sysdba

SQL*Plus: Release 11.2.0.1.0 Production on Thu Jun 6 09:30:55 2013

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

SYS@LEO1>show user

USER is "SYS"

Good现在SYS用户已经成功登录,请大家在输入登录字符串时一定不要忘记as sysdba指定DBA角色,否则会提示你漏掉关键字,如下所示

[oracle@leonarding1 ~]$ sqlplus sys/oracle

SQL*Plus: Release 11.2.0.1.0 Production on Thu Jun 6 09:31:14 2013

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

ERROR:

ORA-28009: connection as SYS should be as SYSDBA or SYSOPER

小结:如果从安全性角度密码文件比操作系统验证安全性要高,可在实际中根据需求自行选择。

                     

演示一个TDE的数据加密示例,并用logminer验证加密效果。

故事篇:日子平淡无奇的过着,难难同学刻苦攻读,虚心向前辈请教,进步很快,逐渐的从初级上升到中级,从藏经阁第一层升级到第二层了。突然有一天,他的师兄“白眉大侠”同志走火入魔,这可不得了,因为走火入魔的程序不外乎2件,其一是偷学比自己等级还高的武学,其二就是练就了非正义之功。看来还是第一种可能性高,就跟“天龙八部”里面的吐蕃国师鸠摩智一样,强行练就上乘武功又没有领悟精髓所在就此走火入魔一样。藏经阁规定不同的等级学员只能学习自己对应等级的武功秘籍,不可跨级学习这是明文禁止的,而为了防止这种事情发生,在高等级的秘籍中往往都会把关键的心法口诀给加密->采用TDE技术->把明文变成密文,如果有人偷学又没有掌握心法口诀就会发生上述“走火入魔”事件,因此如果没有特别情况大家都还是按照循序渐进的方法去学习的。果不其然上面发下公告“白眉”同学由于心急迫不及待强学了高等级秘术导致杯具的发生。所以说万丈高楼平地起,真不是盖儿的。


场景篇

TDE(Transparent Data Encryption):我们称之为“Oracle 透明数据加密技术”,它属于Oracle数据保护安全策略的一种。有两种数据加密技术,一种是基于列的数据加密,另一种是基于表空间的数据加密。下面分别来说明一下这两种加密技术。

①  基于列的加密:对某一列进行加密,适用Oracle10GR2以上版本

②  基于表空间的加密:对整个表空间进行加密,适用Oracle11gR2以上版本

TDE(Transparent Data Encryption)优点:

①  对单列进行加密,并且可以创建索引

②  对用户透明,用户感知不到

③  管理简便,无需应用设置

TDE(Transparent Data Encryption)缺点:

①  加密列上只能创建B-tree索引,由于被加密算法编码过键值凌乱,无法支持范围扫描

②  外部对象不可加密

③  可传输表空间不可加密

④  Exp/Imp导出导入不可加密

TDE可支持的加密算法种类

①  AES192(default)

②  AES128

③  AES256

④  3DES168

TDE加密原理

①  先要创建一个“wallet钱包”,这个钱包里面保存着密钥,Oracle就是通过这个密钥对列进行加密和解密的。

②  生成wallet钱包之前先要设定wallet钱包的保存位置

设置wallet钱包位置的文件$ORACLE_HOME/network/admin/sqlnet.ora

[oracle@leonarding1 admin]$ vim sqlnet.ora           在这个文件中添加如下脚本

encryption_wallet_location=(source=

                                  (method=file)

                                  (method_data=

                                  (directory=/u02/app/oracle/product/11.2.0/db_1/network/admin)))

③  在wallet里面创建密钥key

LEO1@LEO1>alter system set encryption key authenticated by "oracle";

System altered.

说明:authenticated by "oracle" :打开/关闭wallet的认证密码

④  查看一下wallet钱包是否在$ORACLE_HOME/network/admin/目录下生成

[oracle@leonarding1 admin]$ ll

total 48

-rw-r--r-- 1 oracle asmadmin  1573 Jun  6 18:11 ewallet.p12     这个就是我们刚才生成的wallet钱包,里面有我们创建的密钥,打开wallet钱包的密码是“oracle

⑤ 创建一个加密列的表encryption_table1

LEO1@LEO1>create table encryption_table1 (name varchar2(20),address varchar2(30),account number encrypt using 'AES192');

Table created.

指定account字段为加密字段,使用“AES192”加密算法

插入三条记录

LEO1@LEO1>insert into encryption_table1 values('leonarding','beijing','10000');

1 row created.

LEO1@LEO1>insert into encryption_table1 values('sun_nv','shanghai','20000');

1 row created.

LEO1@LEO1>insert into encryption_table1 values('tigerfish','guangzhou','30000');

1 row created.

LEO1@LEO1>commit;

Commit complete.

查询加密字段数据字典信息

LEO1@LEO1>select * from dba_encrypted_columns;

OWNER     TABLE_NAME          COLUMN_NAME      ENCRYPTION_ALG    SALT    INTEGRITY_ALG

------------------------------------------------------------------------------------------------------------------------------------------------------------

LEO1       ENCRYPTION_TABLE1    ACCOUNT            AES 192 bits key     YES     SHA-1

查看加密字段的表

LEO1@LEO1>select * from encryption_table1;

NAME              ADDRESS           ACCOUNT

-------------------- ------------------------------ ----------

leonarding          beijing              10000

sun_nv             shanghai            20000

tigerfish            guangzhou           30000

加密字段是否可见完全依赖于wallet里面的密钥是否解密,如果我们把wallet关闭,那么密钥就无法还原加密信息

LEO1@LEO1>alter system set wallet close identified by "oracle";

System altered.

LEO1@LEO1>select * from encryption_table1;

select * from encryption_table1

              *

ERROR at line 1:

ORA-28365: wallet is not open      钱包未打开

如果我们把wallet打开,那么就可顺利使用密钥进行解密,查看表内容啦,创建完wallet默认是打开状态。

LEO1@LEO1>alter system set wallet open identified by "oracle";

System altered.

LEO1@LEO1>select * from encryption_table1;

NAME              ADDRESS           ACCOUNT

-------------------- ------------------------------ ----------

leonarding          beijing              10000

sun_nv             shanghai            20000

tigerfish            guangzhou           30000

我们做到这里~ 大家有没有想过,基于列的TDE加密的机制是什么样的呢?先来看一下SQL执行计划,看看我们能够找到什么。

LEO1@LEO1>select * from encryption_table1 where account=10000;

Execution Plan

----------------------------------------------------------

Plan hash value: 1627286331

---------------------------------------------------------------------------------------

| Id  | Operation         | Name              | Rows  | Bytes | Cost (%CPU)| Time     |

---------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |                   |     1 |    76 |     3   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| ENCRYPTION_TABLE1 |     1 |    76 |     3   (0)| 00:00:01 |

---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   1 - filter(INTERNAL_FUNCTION("ACCOUNT")=10000)

在进行谓词条件过滤的时候,我们发现加密列被一个内部函数调用了,也就是说“数据保存在磁盘上时是不加密的”,在被SQL读取的过程中通过“internal_function内部函数”调用把明文编译为密文显示出来,这个过程对用户是透明的,用户感受不到加密处理。如果我们好奇想看看加密后的数据是什么样子,可不可以呢?答案是yes

LOG MINER 日志挖掘工具验证加密数据的存在性

我们知道凡是DML操作都会在redo日志里形成记录,由此我们可以使用logminer工具来挖掘redo日志内容,查看加密数据是否真实存在的。

1)开启补充日志信息功能,因为默认情况不收集全部日志信息,关键信息我们看不到

LEO1@LEO1>alter database add supplemental log data;

Database altered.

2)检查当前正在使用的redo日志成员,这两个成员都是镜像关系,在哪个里面挖掘都可以

LEO1@LEO1>select member from v$logfile where group# in (select group# from v$log where status ='CURRENT');

MEMBER

------------------------------------------------------------------------------------------------------------------------------------------------------------------

/u02/app/oracle/oradata/LEO1/disk2/redo02_b.log

/u02/app/oracle/oradata/LEO1/redo02.log

3)记录挖掘开始时起始SCN-> 插入1条记录 ->记录挖掘结束时SCN

LEO1@LEO1>select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

---------------------------------------------

                1197017

LEO1@LEO1>insert into encryption_table1 values('biaoge','shenzhen','40000');

1 row created.

LEO1@LEO1>commit;

Commit complete.

LEO1@LEO1>select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER

---------------------------------------------

                 1197080

4)开始进行logminer日志挖掘

首先选择需要挖掘的日志文件

LEO1@LEO1>execute dbms_logmnr.add_logfile(logfilename =>'/u02/app/oracle/oradata/LEO1/redo02.log',options => dbms_logmnr.new);

PL/SQL procedure successfully completed.

其次选择需要挖掘的SCN区间,只把这段数据库变化的内容挖掘出来

LEO1@LEO1>execute dbms_logmnr.start_logmnr(options =>dbms_logmnr.dict_from_online_catalog,startscn =>1197017,endscn =>1197080);

PL/SQL procedure successfully completed.

Logminer工具挖掘出的日志信息会自动收集到v$logmnr_contents动态性能视图中,只对当前会话生效

LEO1@LEO1>select operation,sql_redo,sql_undo from v$logmnr_contents where table_name='ENCRYPTION_TABLE1';

OPERATION         

SQL_REDO         

SQL_UNDO

------------------------------------------------------------------------------------------------------------------------------------------------------------------

INSERT

insert into "LEO1"."ENCRYPTION_TABLE1"("NAME","ADDRESS","ACCOUNT") values ('biaoge','shenzhen','40000');

delete from "LEO1"."ENCRYPTION_TABLE1" where "NAME" = 'biaoge' and "ADDRESS" = 'shenzhen' and "ACCOUNT" = '40000' and ROWID = 'AAAR/3AAFAAAADtAAD';

现在我们看到了刚刚进行的insert操作“飚哥”“深圳”“40000”,后面就是对应的delete回滚语句。但现在是明文

Ok我们关闭wallet钱包,上面说过wallet关闭密钥就无法还原加密记录

LEO1@LEO1>alter system set wallet close identified by "oracle";

System altered.

LEO1@LEO1>select operation,sql_redo,sql_undo from v$logmnr_contents where table_name='ENCRYPTION_TABLE1';

OPERATION         

SQL_REDO         

SQL_UNDO

------------------------------------------------------------------------------------------------------------------------------------------------------------------

INSERT

insert into "LEO1"."ENCRYPTION_TABLE1"("NAME","ADDRESS","ACCOUNT") values ('biaoge','shenzhen',HEXTORAW('2df5e261606a82efbaf112cff8907274f90ebc1be3eaf74bbc624cbfc47fec38b1eff9eda7bddd9756878be420bf08926f95c866'));

delete from "LEO1"."ENCRYPTION_TABLE1" where "NAME" = 'biaoge' and "ADDRESS" = 'shenzhen' and "ACCOUNT" = HEXTORAW('2df5e261606a82efbaf112cff8907274f90ebc1be3eaf74bbc624cbfc47fec38b1eff9eda7bddd9756878be420bf08926f95c866') and ROWID = 'AAAR/3AAFAAAADtAAD';

小结:当密钥被关闭后,我们可以清楚的看到表中数据是被AES192算法加密过的了。由此我们可以得出列的加密是在SQL提取数据的时候被转换加密的。


演示一个基于表空间(11g)的数据加密示例。

故事篇

随着时间的推移,难难同学已经逐渐成长为一名优秀的办事人,同时在业内也有了较高的声誉。这是他不断进取努力奋斗得到的。但难难同学还不满足于此他要向更高的目标前进。因此他从第一层一直奋斗到第八层,可以说藏经阁中90%的武功秘籍他已经学完了,按说这已经相当厉害了,一般般的小毛贼不可近身,1npk也不在话下。但难难同学毕竟不是一般的人物,他要有更高的追求,一般我们也是有追求的人,但只限在“身不能至心向往之”的程度,如过我们以同样的眼光来看待难难同学可就错了。他是位“有勇有谋 有理想有觉悟”的少年,古人云:胸有激雷而面如平湖者-可拜上将军也!现在用到他的身上一点也不为过。可要做最高等级的牛人,就需学习最上乘的武功。而藏经阁的最顶层就放着洪兴社最最牛X最最无敌最最上乘的秘术心法,反正你就理解为非常厉害的武功就行了。有这么个东西放在那,自然也有不少人惦记着,boss为了安全起见,把第九层建成一个滴水不漏的密室,只有掌握密钥的人才可进入,我们也可以这么理解,凡是高强的武功秘籍都会放在这一层,你进不去就别想看的到。如果要想进入就要进行层层选拔,海选->半决赛->决赛,可想而知这是多么的不容易但难难同学将会迎难而上,一切问题在他那里都变成了不是问题,从这个小故事中我们启迪到了一 学习东西要循序渐进,天道而酬勤。二 多实践多动手,在实践的过程中慢慢深入体会知识的内涵,你会记的更牢。我们回头见。

场景篇

上面我们说过TDE(Transparent Data Encryption)透明数据加密技术有两种加密方式,一种是基于列的加密,另一种是基于表空间的加密。下面我们来详细讲解一下表空间加密是怎么回事。

基于表空间的加密:对整个表空间进行加密,表空间中的所有对象都是加密的,例如 在加密表空间上创建一个表,表的所有字段都是加密状态,适用Oracle11gR2以上版本。

创建一个加密表空间 encryption_leo1

LEO1@LEO1>create tablespace encryption_leo1 datafile '/u02/app/oracle/oradata/LEO1/encryption_leo1_01.dbf' size 20m autoextend off encryption using 'AES256' default storage(encrypt);

create tablespace encryption_leo1 datafile '/u02/app/oracle/oradata/LEO1/encryption_leo1_01.dbf' size 20m autoextend off encryption using 'AES256' default storage(encrypt)

*

ERROR at line 1:

ORA-28365: wallet is not open    此时报错没有打开钱包,因为表空间的加密也是使用钱包中的密钥进行加密的,如果钱包没打开便无法使用密钥,当然也就创建不了加密表空间了

LEO1@LEO1>alter system set wallet open identified by "oracle";                开打钱包

System altered.

创建加密表空间encryption_leo1,大小20MB,非自动扩展,使用AES256加密算法,需open wallet

LEO1@LEO1>create tablespace encryption_leo1 datafile '/u02/app/oracle/oradata/LEO1/encryption_leo1_01.dbf' size 20m autoextend off encryption using 'AES256' default storage(encrypt);

Tablespace created.

查看表空间属性

LEO1@LEO1>select tablespace_name,encrypted from dba_tablespaces;

TABLESPACE_NAME                ENC

------------------------------ ---

SYSTEM                          NO

SYSAUX                          NO

UNDOTBS1                       NO

TEMP                           NO

USERS                           NO

LEO1                            NO

CATALOG1                       NO

LEO_FLASHBACK_1                 NO

UNDOTBS03                      NO

ENCRYPTION_LEO1                 YES               这个表空间是加密状态

14 rows selected.

在加密表空间上创建一张表encryption_t,这张表上数据全部为加密状态

LEO1@LEO1>create table encryption_t tablespace encryption_leo1 as select * from dba_objects;

Table created.

LEO1@LEO1>select count(*) from encryption_t;         表中有72211条记录

  COUNT(*)

-----------------

     72211

在表encryption_tobject_id字段上创建一个B-tree索引

LEO1@LEO1>create index idx_encryption_t on encryption_t(object_id);

Index created.

在加密表空间中创建的表中索引是支持range scan

LEO1@LEO1>set autotrace trace exp;

LEO1@LEO1>select * from encryption_t where object_id<10000;

Execution Plan

----------------------------------------------------------

Plan hash value: 3820331211

------------------------------------------------------------------------------------------------

| Id  | Operation                   | Name             | Rows  | Bytes | Cost (%CPU)| Time     |

------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT            |                  | 10490 |  2120K|   199   (1)| 00:00:03 |

|   1 |  TABLE ACCESS BY INDEX ROWID| ENCRYPTION_T     | 10490 |  2120K|   199   (1)| 00:00:03 |

|*  2 |   INDEX RANGE SCAN          | IDX_ENCRYPTION_T | 10490 |       |    29   (0)| 00:00:01 |

------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):

---------------------------------------------------

   2 - access("OBJECT_ID"<10000)

Note

-----  采用动态采样技术

   - dynamic sampling used for this statement (level=2)

可能有的同学会问,刚刚上面还写着“基于列的加密”是不支持range scan的,现在怎么又支持了,嗯 观察的很细致,这里必有原委!答:这是加密表空间的加密机制决定的,加密表空间上的数据本身在存储的时候就是加密状态,而加密字段是在数据读取的过程中由SQL调用内部函数进行加密处理,这样索引键值就被打乱自然不可range scan。表空间中的数据本身就是加密的,没有中间转换过程,因此可支持range scan

表空间加密数据的优点:不会再收到字段加密的限制,例如 字段类型,索引类型,需要设置no salt才可见索引等。

表空间加密数据的缺点:外部大对象不支持,exp/imp逻辑导出导入不支持但可以用expdp/impdp数据泵。

加密表空间与wallet的关系

1.Oracle 表空间的加密与解密完全是基于wallet钱包中的密钥进行的。

2.如果walletopen状态,那么我们可以使用其中的密钥,进行加密与解密处理。

3.如果walletclose状态,那么我们就拿不到密钥,此时加密表空间是不可用的,例如 查询 修改 创建 都不允许,请见如下实例。

我们关闭wallet

LEO1@LEO1>alter system set wallet close identified by "oracle";

System altered.

对表encryption_t 查询->报错,因为数据需要密钥解密后才可呈现

LEO1@LEO1>select * from encryption_t where object_id<10000;

select * from encryption_t where object_id<10000

*

ERROR at line 1:

ORA-28365: wallet is not open

创建一个新表encryption_t_new,数据也需要密钥加密后保存

LEO1@LEO1>create table encryption_t_new tablespace encryption_leo1 as select * from dba_objects;

create table encryption_t_new tablespace encryption_leo1 as select * from dba_objects

                                                                          *

ERROR at line 1:

ORA-28365: wallet is not open

唯一例外->删除表,因为删除的过程是不需要密钥参与,所以walletopen or close状态都无所谓,直接执行就好

LEO1@LEO1>drop table encryption_t;

Table dropped.


小结:讲了这么多,最后我们应该总结一下TDE的使用场合

1.保护敏感数据,禁止未授权的访问,只有打开钱包才能查看数据。

2.防止数据丢失,当加密表空间的数据文件被拷贝走了,如果你没有密钥是无法还原数据的。

3.防止数据被截获,当在网络传输时加密后的信息更安全,即使截获了也无法得知内容。


Security 操作系统验证 密码文件验证 TDE 数据加密

Leonarding
2013.6.7
北京
&summer
分享技术~
成就梦想
Blogwww.leonarding.com

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/23280800/viewspace-1104180/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-01-15

  • 博文量
    20
  • 访问量
    29515