本標準適用於Unix/Linux操作系統下的Oracle數據庫系統,版本爲8i、9i、10g。
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=。 1.Oracle 9i、10g:缺省值是False 2.Oracle 8i:缺省值是True,需要改成False 3.如果用戶必須需要該權限,賦予其權限SELECT ANY DICTIONARY 驗證:SQL> show parameter O7_DICTIONARY_ACCESSIBILITY NAMETYPEVALUE ------------------------------------ ---------- ------------------------------ O7_DICTIONARY_ACCESSIBILITYbooleanFALSE |
加固目的 | 設置正確識別客戶端用戶,並限制操作系統用戶數量(包括管理員權限、root權限、普通用戶權限等) |
加固方法 | 1.使用文本方式,打開數據庫配置文件init<sid>.ora;設置參數REMOTE_OS_AUTHENT值爲FALSE(SAP 系統不可設置爲False) 設置(需重啓數據庫): alter system set remote_os_authent=false scope=spfile; 驗證: SQL> show parameter remote_os_authent NAMETYPEVALUE ------------------------------------ ---------- ------------------------------ remote_os_authentbooleanFALSE |
加固目的 | 通過設置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.ORA和LISTENER.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)) |
加固目的 | 配置密碼文件的使用方式 |
加固方法 | 使用文本方式,打開數據庫配置文件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_VIEW、DBSNMP、SYSMAN帳號或修改密碼。(如果要使用DBConsole ,DBSNMP 、SYSMAN不能鎖定,請修改密碼) DIP、EXFSYS、OUTLN、TSMSYS、WMSYS默認已鎖定,請驗證。 |
加固目的 | 1.應該只提供最小權限給用戶(包括SYSTEM和OBJECT權限) 2.從PUBLIC組中撤回不必要的權限或角色。(如:UTL_SMTP、UTL_TCP、UTL_HTTP、UTL_FILE、DBMS_RANDON、DBMS_SQL、DBMS_SYS_SQL、DBMS_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”。如果忘記修改該用戶的口令,任何人都可以通過該用戶存取數據庫系統。其他有威脅的帳號還有:CTXSYS,MDSYS,ORDPLUGINS,ORDSYS,OUTLN等。 |
加固方法 | 鎖定該賬號,或者更換密碼 |
11SYS用戶
加固目的 | Oracle數據庫系統安裝後,自動創建一個叫做SYS的數據庫管理員用戶,當該用戶sysdba方式連接數據庫時,便具有全部系統權限,因而對它的保護尤爲重要。 |
加固方法 | 更換SYS用戶密碼,符合密碼複雜度要求; 新建一個DBA用戶,作爲日常管理使用。 |
加固目的 | 在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; |
加固目的 | ORACLE數據庫具有對其內部所有發生的活動的審計能力,審計日誌一般放在sys.aud$表中,也可以寫入操作系統的審計跟蹤文件中。可審計的活動有三種類型:登錄嘗試、數據庫活動和對象存取,缺省情況下,數據庫不啓動審計,要求管理員配置數據庫後才能啓動審計。 |
加固方法 | 使用文本方式,打開數據庫配置文件init<sid>.ora;更改以下參數配置AUDIT_TRAIL=True。 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監聽listener作ip訪問限制
修改(需重啓監聽)
$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_limit爲TRUE 限定資源參數(resourceparameters)設置有效;不管resource_limit 的值爲TRUE 或FALSE密碼參數(passwordparameters)設置始終有效。
alter system set resource_limit=true scope=both;
常用資源參數(除非應用程序有明確的資源規劃,一般不需修改):CPU_PER_SESSION、CPU_PER_CALL、LOGICAL_READS_PER_SESSION、LOGICAL_READS_PER_CALL、IDLE_TIME、CONNECT_TIME、PRIVATE_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端口訪問。XDB的HTTP 和FTP 服務存在多個緩衝區溢出問題,遠程***者可以利用這些漏洞對服務進行拒絕服務***,精心提交字符串數據可能以服務進程權限在系統上執行任意指令。
show parameter dispatchers如爲空,表示無該服務。
去掉相應的數據庫的初始化參數中的如下行:
dispatchers='(PROTOCOL=TCP)(SERVICE={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_TCP、DBMS_RANDOM 包
utl_tcp包允許 Oracle 用戶通過 TCP 建立連接,從而從網絡上得到可執行文件。這個包的使用權限應該受到限制。
DBMS_RANDOM包可被用來加密存儲的數據。通常,大多數用戶不應該具有加密數據的權限,因爲如果沒有安全的生成、保存和管理密鑰的話被加密的數據將不可恢復。
revoke EXECUTE on sys.utl_tcp from PUBLIC;
revoke EXECUTE on sys.dbms_random from PUBLIC;