【原創】洪興社的Oracle情節之安全管理篇(一)

leonarding發表於2013-06-08

 

更多精彩內容盡在

《洪興社的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 資料加密


2013.6.7
北京
&summer
分享技術~
成就夢想
Blog

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26686207/viewspace-763470/,如需轉載,請註明出處,否則將追究法律責任。

相關文章