oracle資料安全面面觀(轉)

heying1229發表於2007-06-28
oracle資料安全面面觀
[@more@]

隨著計算機的普及以及網路的發展,資料庫已經不再僅僅是那些程式設計師所專有的話題。而Oracle資料庫更是憑藉其效能卓越,操作方便靈活的特點,在資料庫的市場中已經佔據了一席之地。但是同樣隨著網路技術的不斷進步,資料資訊的不斷增加,資料安全已經不再是以前的“老生長談”,也更不是以前書本上那些“可望不可及”的條條框框。
或許很久以前,大家都覺得Oracle資料庫的安全並不存在隱患,因為Oracle公司在去年11月份開始促銷其資料庫軟體時提出的口號是“只有Oracle9i能夠做到絕對安全”。但是不管它這麼說是為了促銷,還是為了擴大知名度,總之伴去年12 月份,英國的安全專家 David Litchfield 發現的9iAS 中存在的程式錯誤導致的緩衝溢位漏洞以及後來,PenTest Limited 和 eEye Digital Security 各自提出了一個小的漏洞,所有使用Oracle公司產品的人都不由地緊張了原本鬆弛的大腦--這個對於使用者來說,畢竟關係到了自己的“身家性命”。
下面筆者將帶著大家走進Oracle資料安全的世界。由於筆者水平有限,所以不足之處在所難免,望大家不吝賜教。
(一)Oracle資料庫的一些基本常識

這裡僅僅是為了以後的安全奠定一些基礎,因為我們後面要用到它們。呵呵~!
1.Oracle所包含的元件:
在 Oracle,資料庫是指整個 Oracle RDBMS 環境,它包括以下元件:
·Oracle 資料庫程式和緩衝(例項)。
·SYSTEM 表空間包含一個集中系統類目,它可以由一個或多個資料檔案構成。
·其它由資料庫管理員 (DBA)(可選)定義的表空間,每個都由一個或多個資料檔案構成。
·兩個以上的聯機恢復日誌。
·歸檔恢復日誌(可選)。
·其它檔案(控制檔案、Init.ora、Config.ora 等)。
每個 Oracle 資料庫都在一箇中央系統類目和資料字典上執行,它位於SYSTEM 表空間。
2.關於“日誌”
Oracle資料庫使用幾種結構來保護資料:資料庫後備、日誌、回滾段和控制檔案。下面我們將大體上了解一下作為主要結構之一的“日誌”:
每一個Oracle資料庫例項都提供日誌,記錄資料庫中所作的全部修改。每一個執行的Oracle資料庫例項相應地有一個線上日誌,它與Oracle後臺程式LGWR一起工作,立即記錄該例項所作的全部修改。歸檔(離線)日誌是可選擇的,一個Oracle資料庫例項一旦線上日誌填滿後,可形成線上日誌歸檔檔案。歸檔的線上日誌檔案被唯一標識併合併成歸檔日誌。
·關於線上日誌:一個Oracle資料庫的每一例項有一個相關聯的線上日誌。一個線上日誌由多個線上日誌檔案組成。線上日誌檔案(online redo log file)填入日誌項(redo entry),日誌項記錄的資料用於重構對資料庫所作的全部修改。
·關於歸檔日誌:Oracle要將填滿的線上日誌檔案組歸檔時,則要建立歸檔日誌(archived redo log)。其對資料庫備份和恢復有下列用處:
<1>資料庫後備以及線上和歸檔日誌檔案,在作業系統和磁碟故障中可保證全部提交的事物可被恢復。
<2>在資料庫開啟和正常系統使用下,如果歸檔日誌是永久儲存,線上後備可以進行和使用。
資料庫可執行在兩種不同方式下:NOARCHIVELOG方式或ARCHIVELOG 方式。資料庫在NOARCHIVELOG方式下使用時,不能進行線上日誌的歸檔。如果資料庫在ARCHIVELOG方式下執行,可實施線上日誌的歸檔。
3.物理和邏輯儲存結構:
Oracle RDBMS是由表空間組成的,而表空間又是由資料檔案組成的。表空間資料檔案被格式化為內部的塊單位。塊的大小,是由DBA在Oracle第一次建立的時候設定的,可以在512到8192個位元組的範圍內變動。當一個物件在Oracle表空間中建立的時候,使用者用叫做長度的單位(初始長度((initial extent)、下一個長度(next extent)、最小長度(min extents)、以及最大長度(max extents))來標明該物件的空間大小。一個Oracle長度的大小可以變化,但是要包含一個由至少五個連續的塊構成的鏈。
4.Oracle與Microsoft SQL Server比較下的聯網協議:

(二)Oracle資料安全的維護
記得某位哲學家說過:“事物的變化離不開內因和外因。”那麼對於Oracle資料安全這個話題而言,也勢必分為“內”和“外”兩個部分。那麼好,我們就先從“內”開始說起:
§1.從Oracle系統本身說起
我們先拋開令人聞風色變的“hacker”和其他一些外部的原因,先想一下我們的資料庫。什麼硬碟損壞,什麼軟體受損,什麼操作事物……一系列由於我們的“疏忽”而造成的系統問題就完全可以讓我們辛苦建立的資料庫中的資料一去不復返。那麼,我們就先從自己身上找找原因吧。
【一】解決系統本身問題的方法--資料庫的備份及恢復
·資料庫的備份:
關於Oracle資料庫的備份,標準地有三中辦法:匯出/匯入(Export/Import)、冷備份、熱備份。匯出備份是一種邏輯備份,冷備份和熱備份是物理備份。
<1>匯出/匯入(Export/Import)
利用Export可將資料從資料庫中提取出來,利用Import則可將提取出來的資料送回Oracle資料庫中去。
a.簡單匯出資料(Export)和匯入資料(Import)
Oracle支援三種型別的輸出:
(1)表方式(T方式),將指定表的資料匯出。
(2)使用者方式(U方式),將指定使用者的所有物件及資料匯出。
(3)全庫方式(Full方式),將資料庫中的所有物件匯出。
資料匯出(Import)的過程是資料匯入(Export)的逆過程,它們的資料流向不同。
b.增量匯出/匯入
增量匯出是一種常用的資料備份方法,它只能對整個資料庫來實施,並且必須作為SYSTEM來匯出。在進行此種匯出時,系統不要求回答任何問題。匯出檔名預設為export.dmp,如果不希望自己的輸出檔案定名為export.dmp,必須在命令列中指出要用的檔名。
增量匯出包括三個型別:
(1)“完全”增量匯出(Complete)
即備份整個資料庫,比如:
$exp system/manager inctype=complete file=990702.dmp
(2)“增量型”增量匯出
備份上一次備份後改變的資料。比如:
$exp system/manager inctype=incremental file=990702.dmp
(3)“累計型”增量匯出(Cumulative)
累計型匯出方式只是匯出自上次“完全” 匯出之後資料庫中變化了的資訊。比如:
$exp system/manager inctype=cumulative file=990702.dmp
資料庫管理員可以排定一個備份日程表,用資料匯出的三個不同方式合理高效地完成。比如資料庫的備份任務可作如下安排:
·星期一:完全匯出(A)
·星期二:增量匯出(B)
·星期三:增量匯出(C)
·星期四:增量匯出(D)
·星期五:累計匯出(E)
·星期六:增量匯出(F)
·星期日:增量匯出(G)
如果在星期日,資料庫遭到意外破壞,資料庫管理員可按以下步驟來恢復資料庫:
第一步:用命令CREATE DATABASE重新生成資料庫結構;
第二步:建立一個足夠大的附加回段。
第三步:完全增量匯入A:
$imp system./manager inctype= RECTORE FULL=Y FILE=A
第四步:累計增量匯入E:
$imp system/manager inctype= RECTORE FULL=Y FILE =E
第五步:最近增量匯入F:
$imp system/manager inctype=RESTORE FULL=Y FILE=F
<2>冷備份
冷備份發生在資料庫已經正常關閉的情況下,當正常關閉時會提供給我們一個完整的資料庫。冷備份是將關鍵性檔案複製到另外位置的一種說法。對於備份Oracle資訊而言,冷備份是最快和最安全的方法。冷備份的優點是:
·是非常快速的備份方法(只需複製檔案)
·容易歸檔(簡單複製即可)
·容易恢復到某個時間點上(只需將檔案再複製回去)
·能與歸檔方法相結合,作資料庫“最新狀態”的恢復。
·低度維護,高度安全。
但冷備份也有如下不足:
·單獨使用時,只能提供到“某一時間點上”的恢復。
·在實施備份的全過程中,資料庫必須要作備份而不能作其它工作。也就是說,在冷備份過程中,資料庫必須是關閉狀態。
·若磁碟空間有限,只能複製到磁帶等其它外部儲存裝置上,速度會很慢。
·不能按表或按使用者恢復。
如果可能的話(主要看效率),應將資訊備份到磁碟上,然後啟動資料庫(使使用者可以工作)並將所備份的資訊複製到磁帶上(複製的同時,資料庫也可以工作)。冷備份中必須複製的檔案包括:
·所有資料檔案
·所有控制檔案
·所有聯機REDO LOG檔案
·Init.ora檔案(可選)
值得注意的是冷備份必須在資料庫關閉的情況下進行,當資料庫處於開啟狀態時,執行資料庫檔案系統備份是無效的
下面是做冷備份的完整例子:
(1) 關閉資料庫$sqldba lmode=y
SQLDBA >connect internal;
SQLDBA >shutdown normal;
(2) 用複製命令備份全部的時間檔案、重做日誌檔案、控制檔案、初始化引數檔案
SQLDBA >! cp < file > < backup directory >
(3) 重啟Oracle資料庫
$sqldba lmode=y
SQLDBA >connect internal;
SQLDBA >startup;
<3>熱備份
熱備份是在資料庫執行的情況下,採用archivelog mode方式備份資料的方法。所以,如果你有昨天夜裡的一個冷備份而且又有今天的熱備份檔案,在發生問題時,就可以利用這些資料恢復更多的資訊。熱備份要求資料庫在Archivelog方式下操作,並需要大量的檔案空間。一旦資料庫執行在archivelog狀態下,就可以做備份了。熱備份的命令檔案由三部分組成:
1.資料檔案一個表空間一個表空間地備份。
(1)設定表空間為備份狀態
(2)備份表空間的資料檔案
(3)恢復表空間為正常狀態
2.備份歸檔log檔案。
(1)臨時停止歸檔程式
(2)log下那些在archive redo log目標目錄中的檔案
(3)重新啟動archive程式
(4)備份歸檔的redo log 檔案
3.用alter database backup controlfile命令來備份複製檔案
熱備份的優點是:
·可在表空間或資料檔案級備份,備份時間短。
·備份時資料庫仍可使用。
·可達到秒級恢復(恢復到某一時間點上)。
·可對幾乎所有資料庫實體作恢復。
·恢復是快速的,在大多數情況下在資料庫仍工作時恢復。
熱備份的不足是:
·不能出錯,否則後果嚴重。
·若熱備份不成功,所得結果不可用於時間點的恢復。
·因難於維護,所以要特別仔細小心,不允許“以失敗而告終”。


【二】來自內部的另外一個隱患--使用者管理以及密碼問題
在這裡,其實作為一個差不多點的資料庫管理員都很清楚,Oracle資料庫本身就使用了很多種手段來加強資料庫的安全性,經常見到的就有密碼,角色,許可權等等。那麼我們就從最簡單的DBSNMP
說起:
Oralce 資料庫如果採用典型安裝後,自動建立了一個叫做DBSNMP的使用者,該使用者負責執行Oracle系統的智慧代理(Intelligent Agent),該使用者的預設密碼也是“DBSNMP”。如果忘記修改該使用者的口令,任何人都可以透過該使用者存取資料庫系統。現在我們來看一下該使用者具有哪些許可權和角色,然後來分析一下該使用者對資料庫系統可能造成的損失。
啟動SQL/PLUS程式,使用該使用者登入進入:
SQL> select * from session_privs;
CREATE SESSION
ALTER SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SYNONYM
CREATE PUBLIC SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE DATABASE LINK
CREATE PROCEDURE
CREATE TRIGGER
ANALYZE ANY
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE
可以看到該使用者不是SYS或SYSTEM管理使用者,然而,它卻具有兩個系統級許可權:UNLIMITED TABLESPACE和CREATE PUBLIC SYNONYM。
看到這兩個許可權你應該馬上想到,這些都是安全隱患,尤其是UNLIMITED TABLESPACE,它是破壞資料庫系統的攻擊點之一。如果這時候你還依然認為,即使有人利用這個沒有修改的口令登入進資料庫也造成不了什麼

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

相關文章