隨著計算機的普及以及
網絡的發展,
數據庫已經不再僅僅是那些程序員所專有的話題。而Oracle
數據庫更是憑借其性能卓越,操作方便靈活的特點,在數據庫的市場中已經占據了一席之地。但是同樣隨著
網絡技術的不斷進步,數據信息的不斷增加,
數據安全已經不再是以前的“老生長談”,也更不是以前書本上那些“可望不可及”的條條框框。 或許很久以前,大家都覺得Oracle數據庫的安全并不存在隱患,因為Oracle公司在去年11月份開始促銷其數據庫軟件時提出的口號是“只有Oracle9i能夠做到絕對安全”。但是不管它這么說是為了促銷,還是為了擴大知名度,總之伴去年12 月份,英國的安全專家 David Litchfield 發現的9iAS 中存在的程序錯誤導致的緩沖溢出漏洞以及后來,PenTest Limited 和 eEye Digital Security 各自提出了一個小的漏洞,所有使用Oracle公司產品的人都不由地緊張了原本松弛的大腦--這個對于用戶來說,畢竟關系到了自己的“身家性命”。
/ f. S) s+ B. K* m# G2 K 下面筆者將帶著大家走進Oracle數據安全的世界。由于筆者水平有限,所以不足之處在所難免,望大家不吝賜教。
4 F4 l1 d7 c& u (一)Oracle數據庫的一些基本常識
# H( d, J; _& Q* x- }6 } 這里僅僅是為了以后的安全奠定一些基礎,因為我們后面要用到它們。
) e4 A2 J5 j( a; y3 o 1.Oracle所包含的組件:
( k' I! ?' c% u2 w1 [ 在 Oracle,數據庫是指整個 Oracle RDBMS 環境,它包括以下組件:
f6 I5 L; ^8 Y ·Oracle 數據庫進程和緩沖(實例)。
: a& @0 Z1 G: H& }2 z3 k ·SYSTEM 表空間包含一個集中系統類目,它可以由一個或多個數據文件構成。
" _7 `% C, c x8 F) p ·其它由
數據庫管理員 (DBA)(可選)定義的表空間,每個都由一個或多個數據文件構成。
( D+ H4 s& ?0 O" l ·兩個以上的聯機恢復日志。
k) y9 {( |7 N7 w A' p ·歸檔恢復日志(可選)。
1 h4 Y" ]; n1 c/ x/ N g ·其它文件(控制文件、Init.ora、Config.ora 等)。
1 _8 D1 R' j- X$ b! Z 每個 Oracle 數據庫都在一個中央系統類目和數據字典上運行,它位于SYSTEM 表空間。
2 ?7 e) o. J9 ]. |' K 2.關于“日志”
: r: w2 d1 H$ R; F5 q Oracle數據庫使用幾種結構來保護數據:數據庫后備、日志、回滾段和控制文件。下面我們將大體上了解一下作為主要結構之一的“日志”:
& |. {! }* [! o1 ^/ x( y0 j" _' r 每一個Oracle數據庫實例都提供日志,記錄數據庫中所作的全部修改。每一個運行的Oracle數據庫實例相應地有一個在線日志,它與Oracle后臺進程LGWR一起工作,立即記錄該實例所作的全部修改。歸檔(離線)日志是可選擇的,一個Oracle數據庫實例一旦在線日志填滿后,可形成在線日志歸檔文件。歸檔的在線日志文件被唯一標識并合并成歸檔日志。
7 F. n; f, n6 Z* C ·關于在線日志:一個Oracle數據庫的每一實例有一個相關聯的在線日志。一個在線日志由多個在線日志文件組成。在線日志文件(online redo log file)填入日志項(redo entry),日志項記錄的數據用于重構對數據庫所作的全部修改。
1 q& `; X. |, j ·關于歸檔日志:Oracle要將填滿的在線日志文件組歸檔時,則要建立歸檔日志(archived redo log)。其對數據庫
備份和恢復有下列用處:
, [9 a& p- h* u* ^6 M <1>數據庫后備以及在線和歸檔日志文件,在
操作系統和磁盤故障中可保證全部提交的事物可被恢復。
) e5 u8 A( C4 C/ i/ g" \: e" c <2>在數據庫打開和正常系統使用下,如果歸檔日志是永久保存,在線后備可以進行和使用。
; I$ ^* \0 l% C' @$ ^% x; t 數據庫可運行在兩種不同方式下:NOARCHIVELOG方式或ARCHIVELOG 方式。數據庫在NOARCHIVELOG方式下使用時,不能進行在線日志的歸檔。如果數據庫在ARCHIVELOG方式下運行,可實施在線日志的歸檔。
# s5 z) u; _9 B! j2 M' Q9 A* T% c" \ 3.物理和邏輯存儲結構:
a) J5 I y4 F( F4 O Oracle RDBMS是由表空間組成的,而表空間又是由數據文件組成的。表空間數據文件被格式化為內部的塊單位。塊的大小,是由DBA在Oracle第一次創建的時候設置的,可以在512到8192個字節的范圍內變動。當一個對象在Oracle表空間中創建的時候,用戶用叫做長度的單位(初始長度((initial extent)、下一個長度(next extent)、最小長度(min extents)、以及最大長度(max extents))來標明該對象的空間大小。一個Oracle長度的大小可以變化,但是要包含一個由至少五個連續的塊構成的鏈。
; Z% |* U; q) T9 c# \ 4.Oracle與Microsoft SQL Server比較下的聯網協議:
3 z- x, H2 n1 G7 O! K# d (二)Oracle數據安全的維護
0 k: W: D4 A, I' e) ~. y 記得某位哲學家說過:“事物的變化離不開內因和外因!蹦敲磳τ贠racle數據安全這個話題而言,也勢必分為“內”和“外”兩個部分。那么好,我們就先從“內”開始說起:
. x' A9 J Q& U5 L §1.從Oracle系統本身說起
3 w5 _) r+ G. x' b# M t5 Y5 d( Y 我們先拋開令人聞風色變的“hacker”和其他一些外部的原因,先想一下我們的數據庫。什么硬盤損壞,什么軟件受損,什么操作事物……一系列由于我們的“疏忽”而造成的系統問題就完全可以讓我們辛苦建立的數據庫中的數據一去不復返。那么,我們就先從自己身上找找原因吧。
0 O5 `" y+ L& s# a 【一】解決系統本身問題的方法--數據庫的備份及恢復
5 P' n9 A. u- _5 _* t+ ? ·數據庫的備份:
& U, w! H0 |4 ?& l! ^8 i. l 關于Oracle數據庫的備份,標準地有三中辦法:導出/導入(Export/Import)、冷備份、熱備份。導出備份是一種邏輯備份,冷備份和熱備份是物理備份。
/ m. {* O+ I5 M/ X <1>導出/導入(Export/Import)
4 X: Z5 m4 S4 T( G 利用Export可將數據從數據庫中提取出來,利用Import則可將提取出來的數據送回Oracle數據庫中去。
6 y, B* C% }8 f+ @) p a.簡單導出數據(Export)和導入數據(Import)
1 x& ?9 Z) [$ @+ }% B Oracle支持三種類型的輸出:
7 [9 z0 ~, ?: r' W$ w (1)表方式(T方式),將指定表的數據導出。
! |5 z J( }0 L3 m" B& U (2)用戶方式(U方式),將指定用戶的所有對象及數據導出。
: s+ a" r7 U' J" C5 p (3)全庫方式(Full方式),將數據庫中的所有對象導出。
" d' j# E. I' j% c 數據導出(Import)的過程是數據導入(Export)的逆過程,它們的數據流向不同。
6 V, j7 @% C+ S, }! H ?, W4 L/ N4 u b.增量導出/導入
2 l" A% u) i$ m- F T5 ? 增量導出是一種常用的
數據備份方法,它只能對整個數據庫來實施,并且必須作為SYSTEM來導出。在進行此種導出時,系統不要求回答任何問題。導出文件名缺省為export.dmp,如果不希望自己的輸出文件定名為export.dmp,必須在命令行中指出要用的文件名。
/ C& h* K- M) R, B 增量導出包括三個類型:
, v- I# V3 }0 E, O (1)“完全”增量導出(Complete)
6 r. z- x! e. D# X 即備份整個數據庫,比如:
5 x; E+ j7 K, d {$ q) j $exp system/manager inctype=complete file=990702.dmp
. `* o) V: ^: N9 i (2)“增量型”增量導出
4 _% A+ H9 T; I% C9 W7 m4 | 備份上一次備份后改變的數據。比如:
! O8 c* y. V6 o( L1 v $exp system/manager inctype=incremental file=990702.dmp
5 O6 z) y& S% x r8 @3 N' i (3)“累計型”增量導出(Cumulative)
+ C0 W. A( D. v8 b- l+ n 累計型導出方式只是導出自上次“完全” 導出之后數據庫中變化了的信息。比如:
1 ]1 b* b8 j& G% ^ @3 D/ Z% g $exp system/manager inctype=cumulative file=990702.dmp
9 u$ `: X6 A- O 數據庫管理員可以排定一個備份日程表,用數據導出的三個不同方式合理高效地完成。比如數據庫的備份任務可作如下安排:
- J- K# X' I$ M8 d) r) h/ j ·星期一:完全導出(A)
3 c& d. m6 l! }/ _" Y, Y2 M F ·星期二:增量導出(B)
7 h6 q3 r7 z+ J: w1 W( r5 l ·星期三:增量導出(C)
. a1 b2 U8 j" g( `3 | ·星期四:增量導出(D)
9 v! n1 K& i1 N* N& d) x- L$ I6 U ·星期五:累計導出(E)
# b! [! A( X0 S ·星期六:增量導出(F)
" ~$ T! r6 N# T, Z6 H ·星期日:增量導出(G)
, U s/ m" P1 w+ Y& n 如果在星期日,數據庫遭到意外破壞,數據庫管理員可按以下步驟來
恢復數據庫:
0 F( N! ?; v0 X O0 c 第一步:用命令CREATE DATABASE重新生成數據庫結構;
2 y1 t3 o2 c( f: S6 t S$ | 第二步:創建一個足夠大的附加回段。
, |2 T4 z" h: S2 w: p, e 第三步:完全增量導入A:
' T1 ^4 N/ @7 v" Y: N; O $imp system./manager inctype= RECTORE FULL=Y FILE=A
5 ]2 b5 R0 j* }3 A, E3 l 第四步:累計增量導入E:
$ P( L* g% g9 [2 Q$ \7 B! q! k: ` $imp system/manager inctype= RECTORE FULL=Y FILE =E
) D. q" `2 f$ n2 S4 P% S 第五步:最近增量導入F:
/ {0 T0 c! e, r- a' ]$ B* }' ?' y $imp system/manager inctype=RESTORE FULL=Y FILE=F
5 l& u1 V3 `2 ~& J! \ <2>冷備份
' ]. d+ {4 ]) B+ b! G& f* U8 r 冷備份發生在數據庫已經正常關閉的情況下,當正常關閉時會提供給我們一個完整的數據庫。冷備份是將關鍵性文件拷貝到另外位置的一種說法。對于備份Oracle信息而言,冷備份是最快和最安全的方法。冷備份的優點是:
' h* P- x8 M# s( Z ·是非常快速的備份方法(只需拷貝文件)
: \9 _0 }1 x4 c3 q% j ·容易歸檔(簡單拷貝即可)
; L! ^* N, K7 f- E3 q ·容易恢復到某個時間點上(只需將文件再拷貝回去)
5 Y$ F0 D3 a A/ \! e5 Z ·能與歸檔方法相結合,作數據庫“最新狀態”的恢復。
& f3 k9 m2 ~' F1 H( C) K ·低度維護,高度安全。
( W2 M8 a( X. S& O5 Y 但冷備份也有如下不足:
4 H& E$ T0 @+ O: v! }# L ·單獨使用時,只能提供到“某一時間點上”的恢復。
+ W) q8 E1 ~. C3 ] ·在實施備份的全過程中,數據庫必須要作備份而不能作其它工作。也就是說,在冷備份過程中,數據庫必須是關閉狀態。
* d# l/ N' k) \ ·若磁盤空間有限,只能拷貝到磁帶等其它外部存儲設備上,速度會很慢。
) ?; ~ [( k! g0 }0 O( B ·不能按表或按用戶恢復。
, z% w1 h) O/ S/ F 如果可能的話(主要看效率),應將信息備份到磁盤上,然后啟動數據庫(使用戶可以工作)并將所備份的信息拷貝到磁帶上(拷貝的同時,數據庫也可以工作)。冷備份中必須拷貝的文件包括:
! [8 ]% J8 J% F$ s& F* _! t6 ~, U" I ·所有數據文件
! |3 Q! [) z" k' e, B ^# u ·所有控制文件
* Q0 a G9 b1 i1 }% L6 E ·所有聯機REDO LOG文件
9 c: d. p1 g+ N( v- [- Z ·Init.ora文件(可選)
* H7 V! Z h, r7 ?, B3 n$ }5 { 值得注意的是冷備份必須在數據庫關閉的情況下進行,當數據庫處于打開狀態時,執行數據庫文件系統備份是無效的
0 w+ |! d% t* r9 e* Y) M' F! U 下面是做冷備份的完整例子:
J4 y9 K7 Z+ q { (1) 關閉數據庫$sqldba lmode=y
+ r3 i h: ?1 B8 k6 D+ p4 ~ SQLDBA >connect internal;
9 v* S) y. V) ^4 } SQLDBA >shutdown normal;
8 Q6 i% c# X2 v (2) 用拷貝命令備份全部的時間文件、重做日志文件、控制文件、初始化參數文件
' ~/ i( c8 t! m4 I. T% ^4 i SQLDBA >! cp < file > < backup directory >
: k5 R$ X5 i r8 T (3) 重啟Oracle數據庫
( E" R: K, ]6 O5 O D $sqldba lmode=y
" I* g" I9 P$ i/ F& Y SQLDBA >connect internal;
' ]2 ]& G' }0 b4 @1 M! e- G SQLDBA >startup;
_5 @4 b1 Y9 B: B* C6 b8 f, y! _8 f <3>熱備份
1 L/ ?' M) `7 \ 熱備份是在數據庫運行的情況下,采用archivelog mode方式備份數據的方法。所以,如果你有昨天夜里的一個冷備份而且又有今天的熱備份文件,在發生問題時,就可以利用這些資料恢復更多的信息。熱備份要求數據庫在Archivelog方式下操作,并需要大量的檔案空間。一旦數據庫運行在archivelog狀態下,就可以做備份了。熱備份的命令文件由三部分組成:
+ Q0 H! @" m+ `: _) M& L 1.數據文件一個表空間一個表空間地備份。
4 C8 |, p7 p1 v; [1 O, p% E! T (1)設置表空間為備份狀態
* h6 A l {% \* g: ^/ J (2)備份表空間的數據文件
4 U5 W- b, l7 e* I/ n7 C' k (3)恢復表空間為正常狀態
+ Z! A' _1 z& e 2.備份歸檔log文件。
% K( H2 z# ~, U* s (1)臨時停止歸檔進程
, M: v& B& k6 J( a. v4 K- ^ (2)log下那些在archive redo log目標目錄中的文件
1 y9 h3 R/ v" F' A3 v4 m y0 P9 P* a (3)重新啟動archive進程
4 P O8 I6 t# `: E' b (4)備份歸檔的redo log 文件
; F& @+ V! O4 V: m U" X7 E, `, `- F 3.用alter database backup controlfile命令來備份拷貝文件
( x3 v" i+ l9 H 熱備份的優點是: