【原創】洪興社的Oracle情節之安全管理篇(一)
更多精彩內容盡在
《洪興社的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 資料加密
2013.6.7
北京&summer
分享技術~成就夢想
Blog:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26686207/viewspace-763470/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【原創】Oracle RAC 日常管理Oracle
- oracle 啟動篇總結(原創)Oracle
- [原創] Oracle資料庫資源管理Oracle資料庫
- Oracle RAC 日常管理之CRS篇Oracle
- [原創]密碼朋克的社會實驗(一):開燈看暗網密碼
- 【原創】Oracle Flashback 知行合一Oracle
- Oracle RAC 日常管理之CRS篇-3Oracle
- Oracle RAC 日常管理之CRS篇-2Oracle
- 復旦發展研究院:2014年中國網路社會心態報告之“社會情緒”篇
- mysql 安全管理詳情叭嚕MySql
- 【原創】彼得德魯克《管理的實踐》札記(一)
- 【原創】 Oracle 事務探索與例項(一)Oracle
- 【原創】Oracle 資料結構知多少(一)Oracle資料結構
- 蕪湖人社×美創科技,人社局資料安全管理制度與資料分類分級建設
- 網路安全之iptables實驗篇一
- 劇情大逆轉,美聯社爆料“他”不是比特幣的創始人比特幣
- [原創] 研發人員績效管理之KPI設定KPI
- Jerry的WebClient UI 42篇原創文章合集WebclientUI
- ERP系統的工廠物流管理之一(原創)
- 【原創】Oracle 高可用概述Oracle
- 前盛大遊戲CEO譚群釗:我是一個有創業情節的人遊戲創業
- ERP和其他管理軟體之間的邏輯關係(原創)
- 原創書寫開篇sqltuningSQL
- 【原創】MySQL之slowlogMySql
- [原創] 當表空間不足時,Oracle是這樣管理RecyclebinOracle
- 網易文案策劃必修課:從劇情、世界觀到情節的具體創作
- oracle network 管理之安全(b14266)Oracle
- [原創]Swift+Sprite Kit中文教程第一篇Swift
- 「一體化資訊建設」,江蘇人社如何完成資料安全管控(成果篇)
- 【原創】答一位網友專案管理問題專案管理
- [原創]App效能測試指標篇APP指標
- 原創:oracle 事務總結Oracle
- 原創:oracle 儲存過程Oracle儲存過程
- 【原創】ORACLE 分割槽與索引Oracle索引
- [原創]SpriteKit+Swift學習筆記(一)-父節點座標系Swift筆記
- 【原創】OllyMachine Script之Dump易格式原體Mac
- 【原創】【Android】揭祕 ART 細節 ---- Garbage collectionAndroid
- 【原創】erlang模組之rpcRPC