更多精彩内容尽在 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 liusheng把SYSDBA角色授权给一个用户,此时就把用户名和权限信息添加到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%的武功秘籍他已经学完了,按说这已经相当厉害了,一般般的小毛贼不可近身,1:n的pk也不在话下。但难难同学毕竟不是一般的人物,他要有更高的追求,一般我们也是有追求的人,但只限在“身不能至心向往之”的程度,如过我们以同样的眼光来看待难难同学可就错了。他是位“有勇有谋 有理想有觉悟”的少年,古人云:胸有激雷而面如平湖者-可拜上将军也!现在用到他的身上一点也不为过。可要做最高等级的牛人,就需学习最上乘的武功。而藏经阁的最顶层就放着洪兴社最最牛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_t的object_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.如果wallet是open状态,那么我们可以使用其中的密钥,进行加密与解密处理。
3.如果wallet是close状态,那么我们就拿不到密钥,此时加密表空间是不可用的,例如 查询 修改 创建 都不允许,请见如下实例。
我们关闭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
唯一例外->删除表,因为删除的过程是不需要密钥参与,所以wallet是open or close状态都无所谓,直接执行就好
LEO1@LEO1>drop table encryption_t;
Table dropped.
小结:讲了这么多,最后我们应该总结一下TDE的使用场合
1.保护敏感数据,禁止未授权的访问,只有打开钱包才能查看数据。
2.防止数据丢失,当加密表空间的数据文件被拷贝走了,如果你没有密钥是无法还原数据的。
3.防止数据被截获,当在网络传输时加密后的信息更安全,即使截获了也无法得知内容。
Security 操作系统验证 密码文件验证 TDE 数据加密
Leonarding
2013.6.7
北京&summer
分享技术~成就梦想
Blog:www.leonarding.com
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26686207/viewspace-763470/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26686207/viewspace-763470/