保護資料庫的安全(一)

victorymoshui發表於2011-05-30

1、調整預設的安全設定

1.1、預設的使用者

檢視資料庫的使用者和狀態,可以查詢DBA_USERS檢視。

SQL> select username,account_status from dba_users;

1.2、PUBLIC許可權

Oracle中存在一個名為PUBLIC的偽使用者。只要用PUBLIC授予某個許可權,那麼所有使用者都會被授予這個許可權。

SQL> select count(*) from dba_tab_privs where grantee = 'PUBLIC';
 
  COUNT(*)
----------
      1991
 
SQL> select table_name from dba_tab_privs where  grantee = 'PUBLIC'
  2  and privilege = 'EXECUTE' and table_name like 'UTL%';
 
TABLE_NAME
------------------------------
UTL_RAW
UTL_TCP
UTL_INADDR
UTL_SMTP
UTL_HTTP
UTL_URL
UTL_ENCODE
UTL_GDK
UTL_COMPRESS
UTL_I18N
UTL_LMS
 
TABLE_NAME
------------------------------
UTL_NLA_ARRAY_DBL
UTL_NLA_ARRAY_FLT
UTL_NLA_ARRAY_INT
UTL_NLA
UTL_REF
UTL_COLL
UTL_MATCH
UTL_FILE
 
19 rows selected.

針對上面列出的,我們來看下某些使用起來比較危險的程式包:

  • UTL_FILE:這個程式包允許使用者讀寫作業系統使用者可訪問的、執行Oracle程式的任務檔案和目錄,這些檔案與目錄包括所有的資料庫檔案以及ORACLE_HOME目錄。
  • UTL_TCP:這個程式包允許使用者為了連線網路中所有可訪問的地址而開啟服務機器上的TCP埠。
  • UTL_SMTP:使用UTL_TCP呼叫編寫的這個程式包允許使用者傳送郵件訊息。UTL_SMTP程式包受UTL_SMTP_SERVER例項引數限制,該引數給出了輸出郵件伺服器的地址。
  • UTL_HTTP:這個程式包同樣使用UTL_TCP呼叫進行編寫,並且允許傳送HTTP訊息和接收響應,結果是將資料庫轉換為Web瀏覽器。

記住:預設情況下,登入資料庫的任何使用者都能使用上述程式包。

雖然應用軟體可以為PUBLIC使用者授予執行UTL程式包的許可權,但我們應當取消PUBLIC使用者的這個許可權。

SQL> revoke execute on utl_file from public;
 
Revoke succeeded.

2、對安全性至關重要的例項引數

提醒:這裡說的引數都是靜態的,被修改後必須重啟例項才會有效。

2.1、UTL_FILE_DIR例項引數

UTL_FILE_DIR例項引數預設為NULL,因此不是一個安全性問題。但在設定這個引數時,要特別小心。UTL_FILE_DIR引數允許PL/SQL通過UTL_FILE補充程式包來訪問伺服器的系統。UTL_FILE程式包具有開啟並讀寫檔案的過程,唯一的限制是Oracle擁有者必須能夠訪問所列出的目錄。

使用這個例項引數的難點:因為在例項層次上進行設定,所以無法允許某些使用者訪問一些目錄以及其他使用者訪問另外一些目錄。對UTL_FILE程式包具有執行許可權的所有使用者有權訪問UTL_FILE_DIR引數中列出的所有目錄。

UTL_FILE_DIR引數接受一個用逗號分隔的目錄列表,並且是靜態的(引數可以包含萬用字元,不要將其設定為“*”)。

SQL> alter system set utl_file_dir = '/ora01/tmp', '/dp_dir/dp' 
  2  scope = spfile;

2.2、REMOTE_OS_AUTHENT與OS_AUTHEN_PREFIX例項引數

REMOTE_OS_AUTHENT例項引數預設為FALSE。這個引數控制某個使用者是否能夠在不需要給出口令的情況下從遠端計算機上連線資料庫。

通常用下面語法建立使用者:

SQL> create user jon identified externally;

這樣,身份驗證操作就委託給伺服器的作業系統完成。

無論本地的還是遠端的外部身份驗證都涉及到OS_AUTHEN_PREFIX例項引數。該引數有個預設值OPS$。這裡我們要清空這個預設值。不然,Oracle的使用者名稱就是OPS$jon了。

SQL> create user jon identified externally;
 
User created.
 
SQL> grant create session to jon;
 
Grant succeeded.
 
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> exit

在Oracle建了新的使用者後,我們就要在作業系統也建立使用者。

$ vi $ORACLE_HOME/dbs/initora.ora
####################################
# 最後一行加上
####################################
REMOTE_OS_AUTHENT=true
OS_AUTHENT_PREFIX=""
 
$ su - root
口令:
# /usr/sbin/useradd jon -m -g oinstall -G dba
# rm /home/jon/.bash_profile 
rm:是否刪除 一般檔案 “/home/jon/.bash_profile”? y
# cp /home/oracle/.bash_profile /home/jon
# source /home/jon/.bash_profile
$ su - oracle
口令
$ sqlplus / as sysdba
 
SQL> create spfile from pfile;
 
File created.
 
SQL> startup
 
SQL> exit
 
SQL> exit
 
$ su - jon
口令:
$ sqlplus /
 
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Sep 28 22:00:22 2008
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

啟用遠端作業系統身份驗證通常被認為是一種不好的做法。

2.3、O7_DICTIONARY_ACCESSIBILITY例項引數

O7_DICTIONARY_ACCESSIBILITY例項引數控制使用ANY關鍵字授予物件許可權的效果。預設FALSE。

SQL> grant select any talbe to jon;

授權檢視資料庫中所有表。

O7_DICTIONARY_ACCESSIBILITY例項引數為FALSE,ANY許可權不被授予給SYS擁有的物件,從而保護資料字典,此時JON無法檢視SYS擁有的物件。如果為TRUE,則反之,可以檢視。

提示:我們可以考慮為有些使用者授予SELECT ANY DICTIONARY許可權,這樣使用者可以檢視資料字典以及動態效能檢視。

2.4、REMOTE_LOGIN_PASSWORDFILE例項引數

遠端的REMOTE_LOGIN_PASSWORDFILE例項引數控制具有SYSDBA許可權的使用者是否能夠通過網路連線例項。這個引數在預設值NONE的時候,得到SYSDBA連線的唯一方法是作為擁有Oracle軟體的作業系統組的成員登入伺服器的作業系統。

將REMOTE_LOGIN_PASSWORDFILE例項引數設定為EXCLUSIVE或SHARED時,使用者可以通過下列的不同方法得到SYSDBA連線:即使沒有作為Oracle軟體擁有組的成員登入伺服器或者需要通過網路進行連線,但是隻要知道相應的口令,一樣能作為SYSDBA連線例項。這個口令以加密形式嵌入$ORACLE_HOME/dbs(Windows是%ORACLE_HOME%/database)系統檔案。設定值為SHARED意味著同一個Oracle主目錄內執行的所有例項共享一個公有的口令檔案,對於所有例項公有的SYS使用者來說,這個主目錄內只有一個口令。設定值為EXCLUSIVE意味著例項會尋找一個其名稱包含例項名的檔案(Windows系統PWD.ora,Linux系統orapw)。

3、口令配置檔案

3.1、口令配置檔案的限制

每個使用者(甚至是SYS)都被指派一個配置檔案,檔案的名稱預設情況為DEFALULT。

SQL> select profile, resource_name from dba_profiles
  2  where profile = 'DEFAULT';
 
PROFILE                        RESOURCE_NAME
------------------------------ --------------------------------
DEFAULT                        COMPOSITE_LIMIT
DEFAULT                        SESSIONS_PER_USER
DEFAULT                        CPU_PER_SESSION
DEFAULT                        CPU_PER_CALL
DEFAULT                        LOGICAL_READS_PER_SESSION
DEFAULT                        LOGICAL_READS_PER_CALL
DEFAULT                        IDLE_TIME
DEFAULT                        CONNECT_TIME
DEFAULT                        PRIVATE_SGA
DEFAULT                        FAILED_LOGIN_ATTEMPTS
DEFAULT                        PASSWORD_LIFE_TIME
 
PROFILE                        RESOURCE_NAME
------------------------------ --------------------------------
DEFAULT                        PASSWORD_REUSE_TIME
DEFAULT                        PASSWORD_REUSE_MAX
DEFAULT                        PASSWORD_VERIFY_FUNCTION
DEFAULT                        PASSWORD_LOCK_TIME
DEFAULT                        PASSWORD_GRACE_TIME
 
16 rows selected.

安全性相關的口令限制:

  • FAILED_LOGIN_ATTEMPTS:連續使用不正確口令請求連線的次數達到這個限制所指定的次數之後,帳戶會被鎖定。
  • PASSWORD_LOCK_TIME:指定達到FAILED_LOGIN_ATTEMPTS限制後帳戶被鎖定的天數。例如:(30/1440)等價於30分鐘。
  • PASS_LIFE_TIME:指定提示使用者修改口令之前需要經過的天數。
  • PASSWORD_GRACE_TIME:指定達到PASS_LIFE_TIME限制值後可以維持成功登入的天數。
  • PASSWORD_REUSE_TIME:指定可以重用某個口令之前所經過的天數。這個限制阻止使用者修改口令時,修改同樣口令來回避PASS_LIFE_TIME限制的設定。
  • PASSWORD_REUSE_MAX:某個口令可以被重用的次數。
  • PASSWORD_VERIFY_FUNCTION:這個限制是一個在修改口令時會執行復雜度檢查。

除了用配置檔案可以自動終止口令和鎖定帳戶,還可以通過SQL命令來提示使用者。

在下次登入時,修改口令:

SQL> alter user test password expire;
 
User altered.

鎖定帳戶:

SQL> alter user test account lock;
 
User altered.

3.2、口令驗證功能

口令配置檔案包含對某個PL/SQL函式(口令驗證函式)的引用。使用配置檔案修改使用者的口令或通過管理員修改使用者的口令,那麼就會執行該函式。這個函式必須駐留在SYS模式中,並接受下列3個實參:使用者名稱、新的口令以及舊的口令。該函式返回值為TRUE或FALSE,如果是FALSE,則拒絕修改口令。

Oracle標準安裝過程提供了一個示例函式。為了建立這個函式,必須以SYS進行連線執行一個指令碼。

SQL> @?/rdbms/admin/utlpwdmg.sql
 
Function created.
 
Profile altered.

所建立的口令驗證對新的口令執行下列檢查,沒有通過任何檢查的情況下拒絕修改口令:

  • 新口令與使用者名稱不能相同。不區分大小寫,比較之前,使用者名稱與口令都會被轉換為小寫字母。
  • 新口令至少必須具有4個字元。
  • 針對一個包含6個常用口令的硬編碼列表,檢查同樣會被轉換為小寫字母的新口令。
  • 檢查新口令,從而確保其至少包含一個數字、一個大寫或小寫字母以及一個標點符號。
  • 新口令至少包含3個與舊口令不同的字母,或者至少比舊口令多3個字元。

3.3、建立、指派以及修改口令配置檔案

因為所有使用者都被自動指派給名為DEFAULT的配置檔案,所以實現安全策略的最快方法是更改DEFAULT配置檔案。之後,所有使用者都可以在其進行下一次登入時獲取所做的變化。前面的UTLPWDMG.SQL指令碼完成了上述功能,這指令碼最後一條命令如下:

ALTER PROFILE DEFAULT LIMIT
PASSWORD_LIFE_TIME 60
PASSWORD_GRACE_TIME 10
PASSWORD_REUSE_TIME 1800
PASSWORD_REUSE_MAX UNLIMITED
FAILED_LOGIN_ATTEMPTS 3
PASSWORD_LOCK_TIME 1/1440
PASSWORD_VERIFY_FUNCTION verify_function;

執行這條命令的結果是:在6天之後提示所有使用者修改口令,並且允許使用者在隨後的10天內完成修改,否則將鎖定帳戶;在1800天的時間內,口令無法重用;連續3次輸入錯誤的口令,賬戶會被鎖定一分鐘;任何被修改的口令都將通過一個名為SYS.VERIFY_FUNCTION的函式進行檢查。


原文引自:http://www.dbablog.org/index.php/archives/612

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

相關文章