oracle安全加固

本標準適用於Unix/Linux操作系統下的Oracle數據庫系統,版本爲8i9i10g

1安全補丁的更新

加固目的

及時更新數據庫的安全補丁,減少數據庫系統可能受到的***。

加固方法

查看http://metalink.oracle.com,下載並安裝相關的安全補丁。

參考Oracle廠商建議,僅對已發現的特定漏洞或缺陷安裝相應補丁。

2$ORACLE_HOME/bin目錄權限保護

加固目的

確保對$ORACLE_HOME/bin目錄的訪問權限儘可能少

加固方法

運行命令:

chown  –R oracle:dba $ORACLE_HOME/bin

驗證ls –l $ORACLE_HOME/bin 確保該目錄下的文件屬主爲oracle用戶,且其他用戶沒有寫權限。

3Oracle 數據字典的保護

加固目的

設置保護後,可防止其他用戶(具有‘ANY’ system privileges)使用數據字典時,具有相同的‘ANY’權限。

加固方法

使用文本方式,打開數據庫配置文件init<sid>.ora;更改以下參數O7_DICTIONARY_ACCESSIBILITY=。

1Oracle 9i10g缺省值是False

2Oracle 8i:缺省值是True,需要改成False

3.如果用戶必須需要該權限,賦予其權限SELECT ANY DICTIONARY

驗證:SQL>  show parameter O7_DICTIONARY_ACCESSIBILITY

NAMETYPEVALUE

------------------------------------  ---------- ------------------------------

O7_DICTIONARY_ACCESSIBILITYbooleanFALSE

4加強訪問控制

加固目的

設置正確識別客戶端用戶,並限制操作系統用戶數量(包括管理員權限、root權限、普通用戶權限等)

加固方法

1.使用文本方式,打開數據庫配置文件init<sid>.ora;設置參數REMOTE_OS_AUTHENT值爲FALSE(SAP 系統不可設置爲False)

2.在數據庫的賬戶管理中刪除不必要的操作系統賬號

設置(需重啓數據庫)

alter system set remote_os_authent=false scope=spfile;

驗證:

SQL> show parameter remote_os_authent

NAMETYPEVALUE

------------------------------------  ---------- ------------------------------

remote_os_authentbooleanFALSE

5監聽程序的管理

加固目的

通過設置listener.ora文件中的參數ADMIN_RESTRICTIONS_listener_name來防止遠程對監聽程序的非授權管理。

加固方法

listener.ora文件中,設置ADMIN_RESTRICTIONS_(listener_name)=ON

LISTENER加訪問密碼:(only 9i)

$ORACLE_HOME/network/admin/listener.ora

PASSWORDS_LISTENER  =

10g : (監聽默認爲本地操作系統帳號認證,即禁止遠程管理)

驗證:

Lsnrctl  status,查看輸出

SecurityON: Local OS Authentication


6關閉Extproc功能

加固目的

由於extproc存在安全問題允許用戶不進行身份認證就可以調用系統函數,因此,如果不需要該功能必須關閉。

加固方法

修改TNSNAMES.ORALISTENER.ORA文件,刪除以下條目

licache_extproc

lPLSExtproc

lExtproc

tnsnames.ora  :

#EXTPROC_CONNECTION_DATA  =

#(DESCRIPTION =

#(ADDRESS_LIST =

#(ADDRESS = (PROTOCOL = IPC)(KEY =  EXTPROC0))

#)

#(CONNECT_DATA =

#(SID = PLSExtProc)

#(PRESENTATION = RO)

#)

#)


listener.ora  :

#(SID_DESC =

#(SID_NAME = PLSExtProc)

#(ORACLE_HOME = /opt/oracle/product/10.2.0/db_1)

#(PROGRAM = extproc)

#)


#(ADDRESS = (PROTOCOL = IPC)(KEY =  EXTPROC0))


7密碼文件管理

加固目的

配置密碼文件的使用方式

加固方法

使用文本方式,打開數據庫配置文件init<sid>.ora;設置參數REMOTE_LOGIN_PASSWORD_FILE=NONE.(  只能使用OS)

None: 使得oracle不使用密碼文件,只能使用OS認證,不允許通過不安全網絡進行遠程管理。

Exclusive: 可以使用唯一的密碼文件,但只限一個數據庫。密碼文件中可以包括除了sys用戶的其他用戶。

Shared: 可以在多個數據庫上使用共享的密碼文件。但是密碼文件中只能包含sys用戶。

設置:(需重啓數據庫)

alter  system set remote_login_passwordfile=none scope=spfile;

驗證:

SQL> show parameter  remote_login_passwordfile


NAMETYPEVALUE

------------------------------------  ---------- ------------------------------

remote_login_passwordfilestringNONE

8用戶賬號管理

加固目的

爲了安全考慮,應用鎖定Oracle當中不需要的用戶;或改變缺省用戶的密碼。

加固方法

鎖定不需要的用戶,使用SQL語句:ALTER USER user PASSWORD EXPIRE;

注意鎖定MGMT_VIEWDBSNMPSYSMAN帳號或修改密碼。(如果要使用DBConsole DBSNMP SYSMAN不能鎖定,請修改密碼)

DIPEXFSYSOUTLNTSMSYSWMSYS默認已鎖定,請驗證。

9最小權限使用規則

加固目的

1.應該只提供最小權限給用戶(包括SYSTEMOBJECT權限)

2.PUBLIC組中撤回不必要的權限或角色。(如:UTL_SMTPUTL_TCPUTL_HTTPUTL_FILEDBMS_RANDONDBMS_SQLDBMS_SYS_SQLDBMS_BACKUP_RESTORE

加固方法

撤銷不需要的權限和角色,使用SQL語句

REVOKE  EXECUTE ON SYS.UTL_HTTP FROM PUBLIC;

REVOKE  EXECUTE ON SYS.UTL_FILE FROM PUBLIC;

REVOKE  EXECUTE ON SYS.UTL_SMTP FROM PUBLIC;

REVOKE  SELECT ON ALL_USERS FROM PUBLIC;

驗證:

OEM管理器中,安全性->用戶->PUBLIC->已授予的對象權限

col pp format a35

SELECT s.privilege||' ON  '||s.owner||'.'||NVL(l.longname, s.table_name) pp, s.grantable FROM

sys.dba_tab_privs s, javasnm l WHERE  s.table_name = l.short(+) AND s.grantee='PUBLIC'

and s.privilege = 'EXECUTE' and  s.table_name like 'UTL%';

10DBSNMP用戶的保護

加固目的

Oracle數據庫系統如果採用典型安裝後,自動創建一個叫做DBSNMP的用戶,該用戶允許Oracle系統的智能代理(intelligent Agent),該用戶的缺省密碼也是“DBSNMP”。如果忘記修改該用戶的口令,任何人都可以通過該用戶存取數據庫系統。其他有威脅的帳號還有:CTXSYSMDSYSORDPLUGINSORDSYSOUTLN等。


加固方法

鎖定該賬號,或者更換密碼

11SYS用戶

加固目的

Oracle數據庫系統安裝後,自動創建一個叫做SYS的數據庫管理員用戶,當該用戶sysdba方式連接數據庫時,便具有全部系統權限,因而對它的保護尤爲重要。

加固方法

更換SYS用戶密碼,符合密碼複雜度要求

新建一個DBA用戶,作爲日常管理使用。

12密碼策略

加固目的

Oracle,我們可以通過修改用戶概要文件來設置密碼的安全策略,可以自定義密碼的複雜度。在概要文件中有以下參數是和密碼安全有關心的:

FAILED_LOGIN_ATTEMPTS:最大錯誤登錄次數

PASSWORD_GRACE_TIME:口令失效後鎖定時間

PASSWORD_LIFE_TIME:口令有效時間

PASSWORD_LOCK_TIME:登錄超過有效次數鎖定時間

PASSWORD_REUSE_MAX:口令歷史記錄保留次數

PASSWORD_REUSE_TIME:口令歷史記錄保留時間

PASSWORD_VERIFY_FUNCTION:口令複雜度審計函數

加固方法

解釋:

PASSWORD_LIFE_TIME:口令有效時間

口令使用期限(應用系統帳號暫不修改)。

password_grace_time  指的是在你的密碼已經過期以後, 第一次登錄時間開始往後統計, 使系統可以使用的日期限度.

PASSWORD_REUSE_TIME是重用密碼的最小時間間隔,單位是天。可以給出整數或分數,如1/1440表示1分鐘(出於效率的考慮,oracle不會每分鐘都去進行檢查,一般來說,有5分鐘左右的誤差,因此如果這個數小於1/144則沒有多大的意義)。

PASSWORD_REUSE_MAX是重用密碼前更換密碼的最小次數。

ALTER  PROFILE default LIMIT FAILED_LOGIN_ATTEMPTS 60;

ALTER  PROFILE default LIMIT PASSWORD_LOCK_TIME 0.5;


修改Oracle提供的驗證函數文件$ORACLE_HOME/rdbms/admin/utlpwdmg.sql

其中IF length(password) < 4 一行改爲< 8,並將最後一段修改爲

ALTER  PROFILE DEFAULT LIMIT

FAILED_LOGIN_ATTEMPTS 60

PASSWORD_LOCK_TIME 30/1440

PASSWORD_VERIFY_FUNCTION  verify_function;


執行start utlpwdmg.sql

設置後,密碼複雜度必須包含字母、數字、標點(密碼不區分大小寫),最小長度爲8

最大錯誤登錄次數爲60次,賬號鎖定時間爲30分鐘


驗證:OEM-》安全性-》概要文件

select * from dba_profiles;


創建驗證函數:

CREATE OR  REPLACE FUNCTION verify_function

(username  varchar2,

password varchar2,

old_password varchar2)

RETURN boolean IS

n boolean;

m integer;

differ integer;

isdigit boolean;

ischarboolean;

ispunct boolean;

digitarray varchar2(20);

punctarray varchar2(25);

chararray varchar2(52);


BEGIN

digitarray:= '0123456789';

chararray:=  'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

punctarray:='!"#$%&()``*+,-/:;<=>?_';


-- Check if the password is same as the  username

IF NLS_LOWER(password) =  NLS_LOWER(username) THEN

raise_application_error(-20001,  'Password same as or similar to user');

END IF;


-- Check for the minimum length of the  password

IF length(password) < 8 THEN

raise_application_error(-20002, 'Password  length less than 8');

END IF;


-- Check if the password is too simple. A  dictionary of words may be

-- maintained and a check may be made so  as not to allow the words

-- that are too simple for the password.

IF NLS_LOWER(password) IN ('welcome',  'database', 'account', 'user', 'password', 'oracle', 'computer', 'abcd') THEN

raise_application_error(-20002,  'Password too simple');

END IF;


-- Check if the password contains at least  one letter, one digit and one

-- punctuation mark.

-- 1. Check for the digit

isdigit:=FALSE;

m := length(password);

FOR i IN 1..10 LOOP

FOR j IN 1..m LOOP

IF substr(password,j,1) =  substr(digitarray,i,1) THEN

isdigit:=TRUE;

GOTO findchar;

END IF;

END LOOP;

END LOOP;

IF isdigit = FALSE THEN

raise_application_error(-20003,  'Password should contain at least one digit, one character and one  punctuation');

END IF;

-- 2. Check for the character

<<findchar>>

ischar:=FALSE;

FOR i IN 1..length(chararray) LOOP

FOR j IN 1..m LOOP

IF substr(password,j,1) =  substr(chararray,i,1) THEN

ischar:=TRUE;

GOTO findpunct;

END IF;

END LOOP;

END LOOP;

IF ischar = FALSE THEN

raise_application_error(-20003,  'Password should contain at least one \

digit, one character and one  punctuation');

END IF;

-- 3. Check for the punctuation

<<findpunct>>

ispunct:=FALSE;

FOR i IN 1..length(punctarray) LOOP

FOR j IN 1..m LOOP

IF substr(password,j,1) =  substr(punctarray,i,1) THEN

ispunct:=TRUE;

GOTO endsearch;

END IF;

END LOOP;

END LOOP;

IF ispunct = FALSE THEN

raise_application_error(-20003,  'Password should contain at least one \

digit, one character and one  punctuation');

END IF;


<<endsearch>>

-- Check if the password differs from the  previous password by at least

-- 3 letters

IF old_password IS NOT NULL THEN

differ := length(old_password) -  length(password);


IF abs(differ) < 3 THEN

IF length(password) <  length(old_password) THEN

m := length(password);

ELSE

m := length(old_password);

END IF;


differ := abs(differ);

FOR i IN 1..m LOOP

IF substr(password,i,1) !=  substr(old_password,i,1) THEN

differ := differ + 1;

END IF;

END LOOP;


IF differ < 3 THEN

raise_application_error(-20004,  'Password should differ by at \

least 3 characters');

END IF;

END IF;

END IF;

-- Everything is fine; return TRUE ;

RETURN(TRUE);

END;

/


ALTER PROFILE  DEFAULT LIMIT

FAILED_LOGIN_ATTEMPTS  60

PASSWORD_LOCK_TIME  30/1440

PASSWORD_VERIFY_FUNCTION  verify_function;



13數據庫操作審計

加固目的

ORACLE數據庫具有對其內部所有發生的活動的審計能力,審計日誌一般放在sys.aud$表中,也可以寫入操作系統的審計跟蹤文件中。可審計的活動有三種類型:登錄嘗試、數據庫活動和對象存取,缺省情況下,數據庫不啓動審計,要求管理員配置數據庫後才能啓動審計。

加固方法

使用文本方式,打開數據庫配置文件init<sid>.ora;更改以下參數配置AUDIT_TRAILTrue

alter system set audit_trail='OS' scope=spfile;

alter  system set Audit_sys_operations=true scope=spfile;

默認爲false,當設置爲true時,所有sys用戶(包括以sysdba,sysoper身份登錄的用戶)的操作都會被記錄


驗證:

SQL> show parameter audit


NAMETYPEVALUE

------------------------------------  ---------- ------------------------------

audit_sys_operationsbooleanTRUE

audit_trailstringOS



TRANSACTION_AUDITING :

the transaction layer generates a special  redo record which contains session and user information.These records might  be useful if using a redo log analysis tool.

AUDIT_FILE_DEST指定了當審外部審記文件目標存儲路徑,其缺省值是$ORACLE_HOME/rdbms/audit

http://hi.baidu.com/ipeipei/blog/item/2b3759825da6d4a20cf4d271.html

http://blog.csdn.net/ruixj/archive/2007/04/17/1568095.aspx


audit_file_deststring/opt/oracle/admin/cognos/adump


監聽器日誌錯誤登錄

/opt/oracle/product/10.2.0/db_1/network/log/listener.log

14本地緩存區溢出防護

加固目的

'oracle'程序存在本地緩衝區溢出。在傳遞命令行參數給'oracle'程序時缺少充分的邊界緩衝區檢查,可導致以'oracle'進程權限在系統上執行任意代碼,需要進行有效加固。

加固方法

以系統管理員權限登錄操作系統,進入Oracle安裝目錄

運行:chmod o-x oracle加強對Oracle文件的可執行控制

驗證非oracle帳號對該文件沒有讀取、運行權限

ll $ORACLE_HOME/bin/oracle

-rwsr-s---1 oracle dba 110758976 2008-01-23/opt/oracle/product/10.2.0/db_1/bin/oracle

chmod o-x $ORACLE_HOME/bin/oracle


15監聽listenerip訪問限制

修改(需重啓監聽)

$ORACLE_HOME/network/admin/sqlnet.ora :

tcp.validnode_checking=yes

tcp.invited_nodes=(localhost,本機ip, 應用服務器ip,管理機ip)

注:對二層結構的應用,不需設置該選項。


16修改默認的監聽端口

修改(需重啓監聽)

$ORACLE_HOME/network/admin/listener.ora:

(ADDRESS = (PROTOCOL = TCP)(HOST= 127.0.0.1)(PORT = 1521))

修改PORT的值爲新的監聽端口->

(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 3521))


確認:

lsnrctl status


17日誌目錄

SQL> showparameter dump


NAMETYPEVALUE

--------------------------------- ------------------------------

background_core_dumpstringpartial

background_dump_deststring/opt/oracle/admin/portaldb/bdump

core_dump_deststring/opt/oracle/admin/portaldb/cdump

max_dump_file_sizestringUNLIMITED

shadow_core_dumpstringpartial

user_dump_deststring/opt/oracle/admin/portaldb/udump


SQL> showparameter audit

NAMETYPEVALUE

--------------------------------- ------------------------------

audit_file_deststring/opt/oracle/admin/portaldb/adump


18啓用資源限制

Profile 分兩部分(資源參數和密碼參數)resource_limitTRUE 限定資源參數(resourceparameters)設置有效;不管resource_limit 的值爲TRUE FALSE密碼參數(passwordparameters)設置始終有效。

alter system set resource_limit=true scope=both;


常用資源參數(除非應用程序有明確的資源規劃,一般不需修改)CPU_PER_SESSIONCPU_PER_CALLLOGICAL_READS_PER_SESSIONLOGICAL_READS_PER_CALLIDLE_TIMECONNECT_TIMEPRIVATE_SGA


19監聽器跟蹤級別

可根據需要設定監聽級別,開啓跟蹤會對性能有所影響。

監聽器跟蹤級別有四個狀態:OFF - 未啓用跟蹤功能,是默認值。USER- 用戶級別,標識用戶導致的錯誤條件。ADMIN- 數據庫管理員級別,標識特定的安裝問題。SUPPORT- 客戶支持人員級別,跟蹤文件可能會變得很大。建議在進行網絡問題診斷時開啓跟蹤功能。

LSNRCTL> set trc_directory/network/trace

LSNRCTL> set trc_file .trc

LSNRCTL> set trc_level <級別>

LSNRCTL> save_config

20XDB服務

Oracle XDB Oracle XML 數據庫,OracleXDB 數據可以通過基於HTTP 服務的8080端口或者基於FTP 服務的2100端口訪問。XDBHTTP FTP 服務存在多個緩衝區溢出問題,遠程***者可以利用這些漏洞對服務進行拒絕服務***,精心提交字符串數據可能以服務進程權限在系統上執行任意指令。

show parameter dispatchers如爲空,表示無該服務。

去掉相應的數據庫的初始化參數中的如下行:

dispatchers='PROTOCOL=TCPSERVICE={sid}XDB'

說明:sid 爲數據庫的實例名,再重啓數據庫。

21SYS.DBMS_DEFER_SYS.DELETE_TRAN存在 SQL 注入漏洞

DELETE_TRAN DESTINATION 參數的處理存在問題,可能導致SQL 注入***。***者利用該漏洞可以提升權限,還可以以系統管理員權限執行SQL 命令。

查看哪些用戶有執行權限:

col pp format a35

SELECT s.privilege||' ON'||s.owner||'.'||NVL(l.longname, s.table_name) pp, s.grantable, s.grantee FROM

sys.dba_tab_privs s, javasnm l WHEREs.table_name = l.short(+)

and s.privilege = 'EXECUTE' ands.table_name like 'DBMS_DEFER_SYS%';

回收權限:

REVOKE EXECUTE ON SYS. DBMS_DEFER_SYS FROM DBA;

REVOKE EXECUTE ON SYS. DBMS_DEFER_SYS FROM WMSYS;


22DBMS_AQELM緩衝區溢出漏洞

由於沒有對其傳入參數進行緩衝區邊界檢查,當傳入超長字符串時,就會引起緩衝區溢出。***者利用此漏洞可以在服務器上執行任意代碼。默認情況下,屬於AQ_ADMINISTRATOR_ROLE 角色的用戶纔有 DBMS_AQELM 包的執行權限。

SELECT s.privilege||' ON'||s.owner||'.'||NVL(l.longname, s.table_name) pp, s.grantable, s.grantee FROM

sys.dba_tab_privs s, javasnm lWHERE s.table_name = l.short(+)

and s.privilege = 'EXECUTE' ands.table_name like 'DBMS_AQELM%';

回收權限:

REVOKE EXECUTE ON SYS. DBMS_AQELM FROM AQ_ADMINISTRATOR_ROLE;

REVOKE EXECUTE ON SYS. DBMS_AQELM FROM EXECUTE_CATALOG_ROLE;

REVOKE EXECUTE ON SYS. DBMS_AQELM FROM SYSTEM;


23UTL_TCPDBMS_RANDOM

utl_tcp包允許 Oracle 用戶通過 TCP 建立連接,從而從網絡上得到可執行文件。這個包的使用權限應該受到限制。
DBMS_RANDOM包可被用來加密存儲的數據。通常,大多數用戶不應該具有加密數據的權限,因爲如果沒有安全的生成、保存和管理密鑰的話被加密的數據將不可恢復。

revoke EXECUTE on sys.utl_tcp from PUBLIC;

revoke EXECUTE on sys.dbms_random from PUBLIC;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章