程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle數據安全面面觀(三)

Oracle數據安全面面觀(三)

編輯:Oracle數據庫基礎

三、Oralce數據庫中用戶管理問題及一些建議

在這裡,其實作為一個差不多點的數據庫管理員都很清楚,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,它是破壞數據庫系統的攻擊點之一。如果這時候你還依然認為,即使有人利用這個沒有修改的口令登錄進數據庫也造成不了什麼損失的話,我就不得不提醒你:該用戶具有UNLIMITED TABLESPACE的系統權限,它可以寫一個小的腳本,然後惡意將系統用垃圾數據填滿,這樣數據庫系統也就無法運行,並將直接導致最終的癱瘓。目前很多數據庫系統都要求7×24的工作,如果出現了系統用垃圾數據填滿的情況,那麼,等數據庫系統恢復時,恐怕不可挽回的損失已經造成了。

可是除了DBSNMP還有很多其他的用戶,怎麼辦呢?讓我們先看一下目前普遍存在於Oracle數據庫中的用戶管理問題:

1. 權限過大:對Oracle數據庫編程和浏覽的一般用戶常常具有DBA (數據庫管理員權限),能對數據庫系統做任何修改或刪除。

2. 安全性差:很多Oracle用戶缺省存儲位置都在系統表空間,這樣不僅影響系統的正常工作,而且不同用戶的數據信息互相影響、透明、保密性差。隨著數據的不斷加入,有可能使整個數據庫系統崩潰。

3. 密碼有規律:在Oracle調試初期形成的用戶名和密碼一致的不良習慣保留到現在;系統用戶SYS和SYSTEM的密碼也眾所皆知。

知道了這些普遍的“毛病”,我們怎麼做呢?下面是一些建議:

1. Oracle DBA(數據庫管理員)的規范

(1). SUN Solaris操作系統下ORACLE用戶密碼應嚴格保密,絕不該把密碼設成Oracle;並指定專門的數據庫管理員定期修改。

(2). Oracle初始化建立的SYS和SYSTEM系統管理員用戶密碼應由原來MANAGER改成別的不易被記憶的字符串。

(3). Oracle WEB SERVER的管理端口具備DBA浏覽數據庫的能力,因此其管理者ADMIN的密碼也應保密,不該把密碼設成MANAGER;並指定專門的數據庫管理員定期修改。

(4). ORACLE DBA最好在SUN SPARC服務器控制台上用窗口式界面實現管理。前提是ORACLE用戶啟動服務器,然後在窗口式命令行下輸入SVRMGRM,即啟動了Oracle SERVER MANAGER菜單式管理;用SYSDBA身份登錄後,就可做數據庫系統維護工作了

2. SQL*PLUS編程用戶的規范

(1). 存儲結構的規范

考慮到用SQL*PLUS編程可實現各行各業、各公司、各部門多種多樣的應用需求,我們的SQL*PLUS編程用戶也應該朝這個方向規范:不同種類的應用必須有不同的用戶;不同種類的應用必須有不同的存儲位置,包括物理文件、缺省表空間、臨時表空間的創建和規劃:當准備編寫某一較大規模(從Oracle數據量和面向用戶量考慮)應用程序時,首先應該創建一個邏輯的存儲位置-表空間,同時定義物理文件的存放路徑和所占硬盤的大小。

<1>物理文件缺省的存放路徑在/oracle_home/dbs下,在命令行下用UNIX指令df -k 可查看硬盤資源分區的使用情況。如果Oracle_home使用率達90‰以上,而且有一個或多個較為空閒的硬盤資源分區可以利用,我們最好把物理文件缺省的存放路徑改到較為空閒的硬盤資源分區路徑下。在此路徑下我們可以這樣規劃資源物理文件的存儲:

xxx表空間 
xxx行業/ xxx公司/ xxx 部門/ xxx 服務.dbf 
DEMO表空間 
default_datafile_home1/col /elec/sys4/demo1.dbf 
default_datafile_home1/col /elec/sys4/demo2.dbf 
公司系統四部摹擬演示系統物理文件 
HUMAN表空間 
default_datafile_home1/col/elec/human/human.dbf 
公司人事部人事管理系統物理文件 
BOOK表空間 
default_datafile_home1/col/elec/book/book.dbf 
公司資料室圖書管理系統物理文件 
QUESTION表空間 
default_datafile_home1/col/elec/client/question.dbf 
公司客戶服務部問題庫系統物理文件 
PC表空間 
default_datafile_home1/col/chaoxun/clIEnt/pc.dbf 
公司PC機售後服務系統物理文件 
……表空間 
default_datafile_home2/…………………………… 
等等

說明:其中default_datafile_home1指Oracle_home/dbs;

default_datafile_home2指較為空閒的硬盤資源分區路徑。

<2>物理文件的大小根據應用系統的數據量、數據對象、程序包的多少來定。一般用於模擬演示的小系統,表空間初始的物理文件為2M即能滿足要求,如果信息量滿,還可以增加物理文件,擴充表空間(每次擴充大小也可暫定為2M);一般實際運行的應用系統可適當增加表空間初始的物理文件大小,但也不要一次分配太大(因為不易回收空間,卻易擴充空間),這也需要根據具體情況具體分析:信息量大、需長時間保存的應用在條件允許情況下,表空間可以大到幾百M甚至上G;信息量小、短期經常刷新的應用,表空間可以控制在2M以下。

<3>表空間的名稱應該采用同系統應用相似的英文字符或字符縮寫,表空間所對應的一個或多個物理文件名也應有相關性。不同用戶所處的缺省表空間不同,存儲的信息就不能互相訪問。這比把所有用戶信息都儲存在系統表空間,安全性大大提高了。如果用Oracle WEB SERVER管理端口創建的用戶,其缺省和臨時表空間一定是系統表空間,DBA切記要改變用戶的缺省表空間。臨時表空間存放臨時數據段,處理一些排序、合並等中間操作,根據實際應用的需求可以把它們放在專門創建的表空間裡;如果系統表空間大,也可以把它們放在系統表空間。用戶創建的數據索引最好和數據文件分開存放在不同表空間,以減少數據爭用和提高響應速度。

(2). 密碼和用戶名的規范

有相當數量的ORACLE用戶名和密碼一致,這是個很不安全的因素。我們建議Oracle用戶名和密碼一定不要一樣,密碼最好在五,六位字符以上。不同用戶間不應該使用相同的密碼。用戶名的定義可根據實際應用的英文名來設,而依據編程人員的姓名定義的用戶名實際上不規范,可在日後的工作中結合上述有關存儲結構規范的說明逐步改進。

(3). 特殊要求用戶的規范

在Oracle數據庫使用過程中,還會遇到一些有特殊要求的用戶:非編程人員需要對某個表有查詢、增加、刪除、修改的權利。DBA應創建一個這樣的用戶,先確定用戶名和密碼,再規定相關應用所在的缺省表空間(包含某個表)和臨時表空間,最後TABLE屬主給其授權:賦予CONNECT角色SELECT、INSERT、DELETE、UPDATE ON THE TABLE的對象級權限,這可根據實際需求自由取捨。

舉例:給新用戶授授予對象級權限(命令行方式):

假設新用戶NEW2需要有查詢、刪除、修改DCD用戶的表EMP。

%svrmgrl 
SVRMGR>connect internal; 以系統管理員登錄 
SVRMGR>create user new2 identifIEd by new2345 default tablespace app; 
SVRMGR>connect dcd/dcdpwd; 以dcd用戶登錄 
SVRMGR>grant connect to new2; 
SVRMGR>grant select on emp to new2; 
SVRMGR>grant delete on emp to new2; 
SVRMGR>grant update on emp to new2;

說了這麼多關於用戶的問題,那麼接下來我們就詳細說一下關於密碼文件的使用以及維護——在Oracle數據庫系統中,用戶如果要以特權用戶身份(INTERNAL/SYSDBA/SYSOPER)登錄Oracle數據庫可以有兩種身份驗證的方法:使用與操作系統集成的身份驗證和使用Oracle數據庫的密碼文件進行身份驗證。因此,管理好密碼文件,對於控制授權用戶從遠端或本機登錄Oracle數據庫系統並執行數據庫管理工作,具有重要的意義。

Oracle數據庫的密碼文件存放有超級用戶INTERNAL/SYS的口令及其他特權用戶的用戶名/口令,它一般存放在Oracle_HOME\DATABASE目錄下。

<1>密碼文件的創建:

在使用Oracle Instance Manager創建一數據庫實例的時侯,在ORACLE_HOME\DATABASE目錄下還自動創建了一個與之對應的密碼文件,文件名為PWDSID.ORA,其中SID代表相應的Oracle數據庫系統標識符。此密碼文件是進行初始數據庫管理工作的基礎。在此之後,管理員也可以根據需要,使用工具ORAPWD.EXE手工創建密碼文件,命令格式如下:

C:\>ORAPWD FILE=<FILENAME> PASSWORD =<PASSWord> ENTRIES=

各命令參數的含義為:

FILENAME:密碼文件名;

PASSWord:設置INTERNAL/SYS帳號的口令;

MAX_USERS:密碼文件中可以存放的最大用戶數,對應於允許以SYSDBA/SYSOPER權限登錄數據庫的最大用戶數。由於在以後的維護中,若用戶數超出了此限制,則需要重建密碼文件,所以此參數可以根據需要設置得大一些。

有了密碼文件之後,需要設置初始化參數REMOTE_LOGIN_PASSWordFILE來控制密碼文件的使用狀態。

<2>設置初始化參數REMOTE_LOGIN_PASSWordFILE:

在Oracle數據庫實例的初始化參數文件中,此參數控制著密碼文件的使用及其狀態。它可以有以下幾個選項:

NONE:指示Oracle系統不使用密碼文件,特權用戶的登錄通過操作系統進行身份驗證;

EXCLUSIVE:指示只有一個數據庫實例可以使用此密碼文件。只有在此設置下的密碼文件可以包含有除INTERNAL/SYS以外的用戶信息,即允許將系統權限SYSOPER/SYSDBA授予除INTERNAL/SYS以外的其他用戶。

SHARED:指示可有多個數據庫實例使用此密碼文件。在此設置下只有INTERNAL/SYS帳號能被密碼文件識別,即使文件中存有其他用戶的信息,也不允許他們以SYSOPER/SYSDBA的權限登錄。此設置為缺省值。

在REMOTE_LOGIN_PASSWordFILE參數設置為EXCLUSIVE、SHARED情況下,Oracle系統搜索密碼文件的次序為:在系統注冊庫中查找ORA_SID_PWFILE參數值(它為密碼文件的全路徑名);若未找到,則查找ORA_PWFILE參數值;若仍未找到,則使用缺省值ORACLE_HOME\DATABASE\PWDSID.ORA;其中的SID代表相應的Oracle數據庫系統標識符。

<3>向密碼文件中增加、刪除用戶:

當初始化參數REMOTE_LOGIN_PASSWordFILE設置為EXCLUSIVE時,系統允許除INTERNAL/SYS以外的其他用戶以管理員身份從遠端或本機登錄到Oracle數據庫系統,執行數據庫管理工作;這些用戶名必須存在於密碼文件中,系統才能識別他們。由於不管是在創建數據庫實例時自動創建的密碼文件,還是使用工具ORAPWD.EXE手工創建的密碼文件,都只包含INTERNAL/SYS用戶的信息;為此,在實際操作中,可能需要向密碼文件添加或刪除其他用戶帳號。

由於僅被授予SYSOPER/SYSDBA系統權限的用戶才存在於密碼文件中,所以當向某一用戶授予或收回SYSOPER/SYSDBA系統權限時,他們的帳號也將相應地被加入到密碼文件或從密碼文件中刪除。由此,向密碼文件中增加或刪除某一用戶,實際上也就是對某一用戶授予或收回SYSOPER/SYSDBA系統權限。

要進行此項授權操作,需使用SYSDBA權限(或INTERNAL帳號)連入數據庫,且初始化參數REMOTE_LOGIN_PASSWordFILE的設置必須為EXCLUSIVE。具體操作步驟如下:

a. 創建相應的密碼文件;

b. 設置初始化參數REMOTE_LOGIN_PASSWordFILE=EXCLUSIVE;

c. 使用SYSDBA權限登錄: CONNECT SYS/internal_user_passsWord AS SYSDBA;

d. 啟動數據庫實例並打開數據庫;

e. 創建相應用戶帳號,對其授權(包括SYSOPER和SYSDBA):授予權限:GRANT SYSDBA TO user_name;

f. 收回權限:REVOKE SYSDBA FROM user_name;

現在這些用戶可以以管理員身份登錄數據庫系統了。

<4>使用密碼文件登錄:

有了密碼文件後,用戶就可以使用密碼文件以SYSOPER/SYSDBA權限登錄Oracle數據庫實例了,注意初始化參數REMOTE_LOGIN_PASSWordFILE應設置為EXCLUSIVE或SHARED。任何用戶以SYSOPER/SYSDBA的權限登錄後,將位於SYS用戶的Schema之下,以下為兩個登錄的例子:

a. 以管理員身份登錄:

假設用戶scott已被授予SYSDBA權限,則他可以使用以下命令登錄:

CONNECT scott/tiger AS SYSDBA

b. 以INTERNAL身份登錄:

CONNECT INTERNAL/INTERNAL_PASSWord

<5>密碼文件的維護:

a. 查看密碼文件中的成員:

可以通過查詢視圖V$PWFILE_USERS來獲取擁有SYSOPER/SYSDBA系統權限的用戶的信息,表中SYSOPER/SYSDBA列的取值TRUE/FALSE表示此用戶是否擁有相應的權限。這些用戶也就是相應地存在於密碼文件中的成員。

b. 擴展密碼文件的用戶數量:

當向密碼文件添加的帳號數目超過創建密碼文件時所定的限制(即ORAPWD.EXE工具的MAX_USERS參數)時,為擴展密碼文件的用戶數限制,需重建密碼文件,具體步驟如下:

a) 查詢視圖V$PWFILE_USERS,記錄下擁有SYSOPER/SYSDBA系統權限的用戶信息;

b) 關閉數據庫;

c) 刪除密碼文件;

d) 用ORAPWD.EXE新建一密碼文件;

e) 將步驟a中獲取的用戶添加到密碼文件中。

c. 修改密碼文件的狀態:

密碼文件的狀態信息存放於此文件中,當它被創建時,它的缺省狀態為SHARED。可以通過改變初始化參數REMOTE_LOGIN_PASSWordFILE的設置改變密碼文件的狀態。當啟動數據庫事例時,Oracle系統從初始化參數文件中讀取REMOTE_LOGIN_PASSWordFILE參數的設置;當加載數據庫時,系統將此參數與口令文件的狀態進行比較,如果不同,則更新密碼文件的狀態。若計劃允許從多台客戶機上啟動數據庫實例,由於各客戶機上必須有初始化參數文件,所以應確保各客戶機上的初始化參數文件的一致性,以避免意外地改變了密碼文件的狀態,造成數據庫登陸的失敗。

d. 修改密碼文件的存儲位置:

密碼文件的存放位置可以根據需要進行移動,但作此修改後,應相應修改系統注冊庫有關指向密碼文件存放位置的參數或環境變量的設置。

e. 刪除密碼文件:

在刪除密碼文件前,應確保當前運行的各數據庫實例的初始化參數REMOTE_LOGIN_PASSWordFILE皆設置為NONE。在刪除密碼文件後,若想要以管理員身份連入數據庫的話,則必須使用操作系統驗證的方法進行登錄。

但是管理員都覺得乏味,因為在管理員中流行一種很簡單的加密辦法--就是經常,很頻繁地修改自己的密碼。可是,每次修改都跟打一次仗似的--因為更新程序並不是每個人都願意做的事情。

那麼有沒有什麼簡單點的辦法呢?請往下看:

模型:Oracle7.3;開發工具:Develope2000。收費系統(在數據庫中的名稱是SFYY),其ClIEnt端分散在市區的數個營業點,通過城域網與主機(小型 機)相連。

過程:

·在收費小型機Oracle系統的system用戶(DBA)下,創建新用戶test:

create user test 
identifIEd by carton 
default tablespace datASPace1 
quota 100K

·對test用戶授以權限:

grant create session to test; 
grant resource to test;

·在test用戶下建立一個存儲函數mmtranslate,它其實是一個加密程序。下面是一個簡單的例子:

function mmtranslate(m varchar2) 
return varchar2 
as 
i number(2); 
kk varchar2(10); 
begin 
kk:=′′; 
i:=1; 
loop 
if i<=length(m) then 
if instr(′1234567890′,substr(m,i,1),1,1)>0 then 
kk:=kk  chr(100+to_number(substr(m,i,1))); 
elseif instr(‘wxyz‘,substr(m,i,1),1,1)>0 then 
kk:=kk  chr(-8+ascii(substr(m,i,1))); 
else 
kk:=kk  chr(4+ascii(substr(m,i,1))); 
end if; 
else 
exit; 
end if; 
i:=i+1; 
end loop; 
return kk; 
exception 
when others then 
return ′-1′; 
end;

·在test用戶下建表mmtest並插入記錄:

create table mmtest 
(usnamevarchar2(6),------用戶名稱 
mimavarchar2(6)------加密前的密碼); 
insert into mmtest values( ‘sfyy‘,‘eds2‘); 
commit;

·執行以下語句

SQL>select mmtranslate(‘eds2‘) from dual; 
MMTRANSLATE(‘EDS2‘)

利用DBA權限更改sfyy的密碼為上面語句的執行結果:

alter user sffy 
identifIEd by ihwf;

·修改應用程序,對於開發環境是Develope2000的程序來說,主要是修改主程序的on-lo gon觸發器:

declare 
mm varchar2(6); 
begin 
logon(‘test‘,‘carton‘); 
select mima into mm from mmtest where usname=‘sfyy‘; 
mm:=mmtranslate(mm); 
logout; 
logon(‘sfyy‘,mm); 
end;

然後再利用觸發器WHEN-NEW-FROM-INSTANCE執行Callfrom或Newform等命令,進入業務處理程序。這個主程序應當僅僅由管理員來掌握,編譯之後將執行文件下發 到各收費點的ClIEn端。

·在System用戶下,利用Oracle提供的pupbld.sql,建立表Productuserprofile,執行下面這樣的命令,限制在非開發狀態Sql命令的使用,例如

insert into productuserprofile 
(product,userid,attribute,charvalue) values 
(‘SQL*Plus‘,‘TEST‘,‘CONNECT‘,‘DISABLED‘); 
insert into productuserprofile 
(product,userid,attribute,charvalue) values 
(‘SQL*Plus‘,‘SFYY‘,‘DELETE‘,‘DISABLED‘);

這樣,在SQL狀態下,根本無法連接到TEST用戶,而在sfyy用戶下,delete命令將不能執行。當然,DBA可以改變這些設置。

這個僅僅是屬於一種“應用技巧”,但是足可以把那些每天忙於更新系統的管理員舒服好幾天了。但是另一方面,還要加強對源程序的管理,在ClIEnt端只存放執行程序。加強審計,發現異常現象,及時處理。這樣才可以做到更高一層的“安全”。

下面主要向大家介紹一個REM對GHXXB制立數據庫觸發子密碼的加密程序,當INSERT OR UPDATE GHXXB時觸發。

drop trigger scjmmm; 
create or replace trigger scjmmm 
before insert or update of mm On ghxxb For each Row 
Begin 
:new.mm:=ENCRYPT(:new.mm,:NEW.GH,TO_CHAR(SYSDATE,‘SS‘)); 
End; 
/ 
---------------------------密碼的加密程序ENCRYPT---------------------- 
Create or Replace 
Function ENCRYPT (Inpass In Varchar2,IN_GH In Varchar2,IN_SS In Varchar2) 
Return Varchar2 Is 
bcs varchar2(20); 
bcs1 number; 
cs number; 
jg number; 
m_gh VARCHAR2(4); 
m_mm VARCHAR2(20); 
Begin 
m_gh:=IN_GH; 
m_mm:=INPASS; 
cs:=TO_NUMBER(IN_SS); 
If cs<=1 then cs:=77 ;end if; 
bcs:=substr(to_char(ascii(substr(m_gh,1,1))),1,2); 
If bcs<‘1‘ then bcs:=‘7‘ ;end if; 
m_gh:=substr(m_gh,2); 
Loop EXIT WHEN nvl(length(m_gh),0)=0 ; 
bcs:=bcs  substr(to_char(ascii(substr(m_gh,1,1))),-1,1); 
m_gh:=substr(m_gh,2); 
End loop; 
Loop EXIT WHEN nvl(length(m_mm),0)=0 ; 
bcs:=bcs  substr(to_char(ascii(substr(m_mm,1,1))),-1,1); 
m_mm:=substr(m_mm,2); 
End loop; 
bcs1:=to_number(bcs); 
jg:=cs*bcs1; 
Loop EXIT WHEN length(to_char(jg))>13; 
jg:=jg*cs ; 
End loop; 
RETURN(IN_SS  substr(to_char(jg),1,14)); 
End; 
/

總結上面的東西,我們僅僅是從自身做起,知道了怎麼維護Oracle數據庫安全這個話題的“皮毛”。可是,對於這個似乎永遠也說不完的話題,我們光知道怎麼從內部“防御”就夠了嗎?不要忘了,在外面,還有一群虎視耽耽的“hacker”在盯著你的數據庫--因為這裡面有他們想要的東西。

四、Oracle數據庫安全的外部保證

我們的目標是:盡可能地堵住潛在的各種漏洞,防止非法用戶利用它們侵入數據庫系統,從而達到“沒有蛀牙”。對於數據庫數據的安全問題,數據庫管理員可以參考有關系統雙機熱備份功能以及數據庫的備份和恢復的資料。

以下就數據庫系統被非法用戶入侵這個問題作進一步的闡述。

1. 組和安全性:在操作系統下建立用戶組也是保證數據庫安全性的一種有效方法。Oracle程序為了安全性目的一般分為兩類:一類所有的用戶都可執行,另一類只DBA可執行。在Unix環境下組設置的配置文件是/etc/group,關於這個文件如何配置,請參閱Unix的有關手冊,以下是保證安全性的幾種方法:

(1). 在安裝Oracle Server前,創建數據庫管理員組(DBA)而且分配root和Oracle軟件擁有者的用戶ID給這個組。DBA能執行的程序只有710權限。在安裝過程中SQL*DBA系統權限命令被自動分配給DBA組。

(2). 允許一部分Unix用戶有限制地訪問Oracle服務器系統,增加一個由授權用戶組成的Oracle組,確保給Oracle服務器實用例程Oracle組ID,公用的可執行程序,比如SQL*Plus,SQL*forms等,應該可被這組執行,然後給這個實用例程710權限,它將允許同組用戶執行,而其他用戶不能。

(3). 給那些不會影響數據庫安全性的程序的權限為711。(注:在我們的系統中為了安裝和調試的方便,Oracle數據庫中的兩個具有DBA權限的用戶Sys和System的缺省密碼是manager。為了您數據庫系統的安全,我們強烈建議您改掉這兩個用戶的密碼,具體操作如下:

在SQL*DBA下鍵入:

alter user sys indentifIEd by passWord;

alter user system indentifIEd by passWord;

其中passWord為您為用戶設置的密碼。

2. Oracle服務器實用例程的安全性:

以下是保護Oracle服務器不被非法用戶使用的幾條建議:

(1). 確保$ORACLE_HOME/bin目錄下的所有程序的擁有權歸Oracle軟件擁有者所有;

(2). 給所有用戶實用便程(sqiplus、sqiforms、exp、imp等)711權限,使服務器上所有的用戶都可訪問Oracle服務器;

(3). 給所有的DBA實用例程(比如SQL*DBA)700權限。Oracle服務器和Unix組當訪問本地的服務時,您可以通過在操作系統下把Oracle服務器的角色映射到Unix組的方式來使用Unix管理服務器的安全性,這種方法適應於本地訪問。

在Unix中指定Oracle服務器角色的格式如下:

ora_sid_role[_d|a]

其中sid是您Oracle數據庫的Oracle_sid;

role是Oracle服務器中角色的名字;

d(可選)表示這個角色是缺省值;

a(可選)表示這個角色帶有WITH ADMIN選項,您只可以把這個角色授予其他角色,不能是其他用戶。

以下是在/etc/group文件中設置的例子:

ora_test_osoper_d:NONE:1:jim,narry,scott 
ora_test_osdba_a:NONE:3:pat 
ora_test_role1:NONE:4:bob,jane,tom,mary,jim 
bin: NONE:5:root,Oracle,dba 
root:NONE:7:root

詞組“ora_test_osoper_d”表示組的名字;詞組“NONE”表示這個組的密碼;數字1表示這個組的ID;接下來的是這個組的成員。前兩行是Oracle服務器角色的例子,使用test作為sid,osoper和osdba作為Oracle服務器角色的名字。osoper是分配給用戶的缺省角色,osdba帶有WITH ADMIN選項。為了使這些數據庫角色起作用,您必須shutdown您的數據庫系統,設置Oracle數據庫參數文件initOracle_SID.ora中os_roles參數為True,然後重新啟動您的數據庫。如果您想讓這些角色有connect internal權限,運行orapwd為這些角色設置密碼。當您嘗試connect internal時,您鍵入的密碼表示了角色所對應的權限。

3. SQL*DBA命令的安全性:

如果您沒有SQL*PLUS應用程序,您也可以使用SQL*DBA作SQL查權限相關的命令。因為這些命令被授予了特殊的系統權限,只能分配給Oracle軟件擁有者和DBA組的用戶,。

(1). startup

(2). shutdown

(3). connect internal

4. 數據庫文件的安全性:

Oracle軟件的擁有者應該這些數據庫文件($Oracle_HOME/dbs/*.dbf)設置這些文件的使用權限為0600:文件的擁有者可讀可寫,同組的和其他組的用戶沒有寫的權限。

Oracle軟件的擁有者應該擁有包含數據庫文件的目錄,為了增加安全性,建議收回同組和其他組用戶對這些文件的可讀權限。

5. 網絡安全性:

當處理網絡安全性時,以下是額外要考慮的幾個問題。

(1). 在網絡上使用密碼在網上的遠端用戶可以通過加密或不加密方式鍵入密碼,當您用不加密方式鍵入密碼時,您的密碼很有可能被非法用戶截獲,導致破壞了系統的安全性。

(2). 網絡上的DBA權限控制您可以通過下列兩種方式對網絡上的DBA權限進行控制:

<1>設置成拒絕遠程DBA訪問;

<2>通過orapwd給DBA設置特殊的密碼。

6. 建立安全性策略:

系統安全性策略

(1). 管理數據庫用戶:數據庫用戶是訪問Oracle數據庫信息的途徑,因此,應該很好地維護管理數據庫用戶的安全性。按照數據庫系統的大小和管理數據庫用戶所需的工作量,數據庫安全性管理者可能只是擁有create,alter,或drop數據庫用戶的一個特殊用戶,或者是擁有這些權限的一組用戶,應注意的是,只有那些值得信任的個人才應該有管理數據庫用戶的權限。

(2). 用戶身份確認:數據庫用戶可以通過操作系統,網絡服務,或數據庫進行身份確認,通過主機操作系統進行用戶身份認證的優點有:

<1>用戶能更快,更方便地聯入數據庫;

<2>通過操作系統對用戶身份確認進行集中控制:如果操作系統與數據庫用戶信息一致,Oracle無須存儲和管理用戶名以及密碼;

<3>用戶進入數據庫和操作系統審計信息一致。

(3). 操作系統安全性

<1>數據庫管理員必須有create和delete文件的操作系統權限;

<2>一般數據庫用戶不應該有create或delete與數據庫相關文件的操作系統權限;

<3>如果操作系統能為數據庫用戶分配角色,那麼安全性管理者必須有修改操作系統帳戶安全性區域的操作系統權限。

7. 數據的安全性策略:

數據的生考慮應基於數據的重要性。如果數據不是很重要,那麼數據的安全性策略可以稍稍放松一些。然而,如果數據很重要,那麼應該有一謹慎的安全性策略,用它來維護對數據對象訪問的有效控制。

8. 用戶安全性策略:

(1). 一般用戶的安全性:

<1>密碼的安全性:如果用戶是通過數據庫進行用戶身份的確認,那麼建議使用密碼加密的方式與數據庫進行連接。這種方式的設置方法如下:

在客戶端的Oracle.ini文件中設置ora_encrypt_login數為true;

在服務器端的initOracle_SID.ora文件中設置dbling_encypt_login參數為true。

<2>權限管理:對於那些用戶很多,應用程序和數據對象很豐富的數據庫,應充分利用“角色”這個機制所帶的方便性對權限進行有效管理。對於復雜的系統環境,“角色”能大大地簡化權限的理。

(2). 終端用戶的安全性:

您必須針對終端用戶制定安全性策略。例如,對於一個有很多用戶的大規模數據庫,安全性管理者可以決定用戶組分類為這些用戶組創建用戶角色,把所需的權限和應用程序角色授予每一個用戶角色,以及為用戶分配相應的用戶角色。當處理特殊的應用要求時,安全性管理者也必須明確地把一些特定的權限要求授予給用戶。您可以使用“角色”對終端用戶進行權限管理。

9. 數據庫管理者安全性策略:

(1). 保護作為sys和system用戶的連接:

當數據庫創建好以後,立即更改有管理權限的sys和system用戶的密碼,防止非法用戶訪問數據庫。當作為sys和system用戶連入數據庫後,用戶有強大的權限用各種方式對數據庫進行改動。

(2). 保護管理者與數據庫的連接:

應該只有數據庫管理者能用管理權限連入數據庫,當以sysdba或startup,shutdown,和recover或數據庫對象(例如create,drop,和delete等)進行沒有任何限制的操作。

(3). 使用角色對管理者權限進行管理

10. 應用程序開發者的安全性策略:

(1). 應用程序開發者和他們的權限數據庫應用程序開發者是唯一一類需要特殊權限組完成自己工作的數據庫用戶。開發者需要諸如create table,create,procedure等系統權限,然而,為了限制開發者對數據庫的操作,只應該把一些特定的系統權限授予開發者。

(2). 應用程序開發者的環境:

<1>程序開發者不應與終端用戶競爭數據庫資源;

<2>用程序開發者不能損害數據庫其他應用產品。

(3). free和controlled應用程序開發應用程序開發者有一下兩種權限:

<1>free development

應用程序開發者允許創建新的模式對象,包括table、index、procedure、package等,它允許應用程序開發者開發獨立於其他對象的應用程序。

<2>controlled development

應用程序開發者不允許創建新的模式對象。所有需要table,indes procedure等都由數據庫管理者創建,它保證了數據庫管理者能完全控制數據空間的使用以及訪問數據庫信息的途徑。但有時應用程序開發者也需這兩種權限的混和。

(4). 應用程序開發者的角色和權限數據庫安全性管理者能創建角色來管理典型的應用程序開發者的權限要求。

<1>create系統權限常常授予給應用程序開發者,以至於他們能創建他的數據對象。

<2>數據對象角色幾乎不會授予給應用程序開發者使用的角色。

(5). 加強應用程序開發者的空間限制作為數據庫安全性管理者,您應該特別地為每個應用程序開發者設置以下的一些限制:

<1>開發者可以創建table或index的表空間;

<2>在每一個表空間中,開發者所擁有的空間份額。應用程序管理者的安全在有許多數據庫應用程序的數據庫系統中,您可能需要一應用程序管理者,應用程序管理者應負責起以下的任務:

a. 為每一個應用程序創建角色以及管理每一個應用程序的角色;

b. 創建和管理數據庫應用程序使用的數據對象;

c. 需要的話,維護和更新應用程序代碼和Oracle的存儲過程和程序包。

我相信有了以上的這些建議,作為一個Oracle的管理者絕對可以做好他本職的工作了。可是,我們再怎麼努力,都始終得面對這樣一個現實,那就是Oracle畢竟是其他人開發的,而我們卻在使用。所以,Oracle到底有多少漏洞--我想這個不是你和我所能解決的。不過既然作為一篇討論Oracle數據安全的文章,我認為有必要把漏洞這一塊也寫進去,畢竟這也是“安全”必不可少的一部分。所以:

【Oracle漏洞舉例】:

·Oracle9iAS Web Cache遠程拒絕服務攻擊漏洞

·Oracle 8.1.6的oidldapd中的漏洞

·Oracle 9iAS OracleJSP 洩漏JSP文件信息漏洞

·Linux Oracle 8.1.5漏洞

想必我沒有理由再往下舉了,因為讀者肯定已經從其他有效的途徑得到了關於Oracle漏洞的最新情報。我這裡就不再贅述了。

總而言之一句話——Oracle數據安全是一個博大而又精深的話題;如果你沒有耐心,就永遠不會得到它的精髓之所在。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved