1. 程式人生 > >Oracle 11g 新特性 -- 安全性增強 說明

Oracle 11g 新特性 -- 安全性增強 說明

一.密碼安全

為了遵守各種安全性和隱私規定,必須使用更安全的口令。如果口令非常短或僅包含有限的字元,則對於強力攻擊就很脆弱,而包含較多不同字元的較長口令就很難被猜出或獲得。

在Oracle Database 11g中,口令的處理方式與早期版本中的處理方式有所不同:

(1)  口令區分大小寫。口令中使用的大寫字元和小寫字元現在是不同的字元。

(2)  口令可以包含未用引號括起來的多位元組字元。如果口令包含除$、_ 或# 外的任何特殊字元,則必須用引號括起來。

(3)  口令始終通過雜湊演算法傳遞,然後作為使用者身份證明進行儲存。使用者提供口令時,系統會對其進行雜湊運算,然後將其與儲存的身份證明進行比較。在Oracle Database

(4)  11g 中,雜湊演算法是早期版本資料庫中使用的公共演算法SHA-1。SHA-1 是一種使用160 位金鑰的較強演算法。

(5)  口令始終使用salt。如果輸入內容相同,雜湊函式將始終生成相同的輸出。Salt是新增到輸入中的唯一(隨機)值,用於確保輸出身份證明是唯一的。

OracleDatabase 11g 中的口令:

(1)  區分大小寫

(2)  包含更多的字元

(3)  使用更安全的雜湊演算法

(4)  在雜湊演算法中使用salt

使用者名稱仍是Oracle 識別符號(最多30個字元,不區分大小寫)。

之前整理的Blog:

Oracle10g/11g 密碼策略 使用者口令 大小寫敏感 說明

二.自動安全配置

Oracle Database11g 使用由Internet 安全中心(CIS) 基準推薦的特定安全功能安裝和建立資料庫。與10gR2 的預設安裝相比,CIS 推薦的配置更安全,而且開放程度足以使大多數應用程式都能成功執行。許多客戶已採用了此基準。CIS 基準的一些建議可能與一些應用程式不相容。

2.1 Profile安全預設配置

使用DatabaseConfiguration Assistant (DBCA) 建立自定義資料庫時,可以指定Oracle Database11g 的預設安全配置。預設情況下,如果使用者使用不正確的口令多次嘗試連線Oracle 例項,則在第三次嘗試後該例項將延遲每次登入。這種保護措施適用於從不同的IP地址或多個客戶機進行的連線嘗試。稍後,它將逐漸增加使用者可以嘗試其它口令的時間間隔,最長時間大約為十秒。

建立資料庫時,將啟用具有如下設定的預設口令概要檔案:

PASSWORD_LIFE_TIME 180

PASSWORD_GRACE_TIME 7

PASSWORD_REUSE_TIME UNLIMITED

PASSWORD_REUSE_MAX UNLIMITED

FAILED_LOGIN_ATTEMPTS 10

PASSWORD_LOCK_TIME 1

Oracle Database 10g 資料庫升級後,只有使用ALTER USER… 命令更改口令後,口令才會區分大小寫。

建立資料庫時,預設情況下口令區分大小寫。

Oracle 使用者 profile 屬性

預設情況下:

• 啟用預設口令概要檔案

• 如果連續10 次登入失敗,則鎖定該帳戶

在升級過程中:

• 口令不區分大小寫(除非進行更改)

• 使用ALTER USER 命令時口令區分大小寫

建立時:

• 口令區分大小寫

2.2 密碼複雜性檢查

在前面提到要求密碼的複雜度,但是實際上我們也可以定製自己的密碼安全要求。在2.1 節的profile中有一個選項:

PASSWORD_VERIFY_FUNCTION NULL

    這裡沒有啟用密碼驗證函式。我們可以直接使用Oracle自帶的指令碼建立我們的密碼驗證函式。 也可以根據自己的需求來修改指令碼,在建立函式。

    預設建立口令驗證函式的指令碼:@?/rdbms/admin/utlpwdmg.sql

指令碼較長,最後已附錄貼出來。   

    在Orcle 11g的版本中,該指令碼會建立2個函式:verify_function 和 verify_function_11G。

如果profile中命名的口令複雜性檢查功能中存在錯誤或此功能不存在,則不能更改口令,也不能建立使用者。解決方法是在概要檔案中將PASSWORD_VERIFY_FUNCTION 設定為NULL,直到問題得到解決。

verify_function_11g功能將檢查口令是否至少包含八個字元、是否至少包含一個數字和一個字母字元,以及是否至少有三個字元與以前口令不同。

該函式還確認此口令不是以下項:使用者名稱或附加了1 到100 之間任何數字的使用者名稱、反向的使用者名稱、伺服器名或附加了1 到100 之間數字的伺服器名,或者一組眾所周知的常用口令,如“welcome1”、“database1”、“oracle123”或“oracle(附加了1 到100 之間的數字)”等。

用sysdba許可權的使用者執行這個指令碼後,然後修改profile,啟用密碼驗證:

--建立函式:

SQL> CONNECT / as SYSDBA

SQL> @?/rdbms/admin/utlpwdmg.sql

--修改profile

ALTER PROFILE DEFAULT

LIMIT

PASSWORD_VERIFY_FUNCTIONverify_function_11g;

2.3 審計

(1)檢查審計日誌:

預設情況下,在OracleDatabase 11g 中將為對安全性非常重要的特定許可權啟用審計。審計線索預設記錄在資料庫AUD$ 表中,AUDIT_TRAIL 引數設定為DB。對於大多數站點而言,這些審計不會對資料庫效能造成太大影響。Oracle建議使用作業系統審計線索檔案。

注意:

Oracle 11g的審計記錄表SYS.AUD$是放在SYSTEM 表空間。 而且增長巨快。 會佔用當量的空間。當SYSTEM表空間因磁碟空間而無法擴充套件時將導致這部分審計記錄無法生成,這將最終導致普通使用者的新會話將無法正常建立,普通使用者將無法登陸資料庫。

如果啟用了審計,就要定期的轉移審計的歷史記錄,或者直接truncate 審計表,最好是把審計表遷移到其他的表空間。

具體參考:

Oracle 11g 預設審計選項 說明

(2)歸檔審計記錄:

要保留審計記錄,請使用Oracle資料泵匯出實用程式將其匯出,或者使用SELECT 語句將一組審計記錄捕獲到單獨的表中。

(3)刪除歸檔審計記錄:

在檢查並歸檔審計記錄後,會從SYS.AUD$ 表中將其刪除。審計記錄將佔用SYSTEM 表空間中的空間。如果SYSTEM 表空間無法增長,則無法為審計記錄提供更多空間,此時會針對每條審計語句生成錯誤。由於CREATE SESSION 是已審計的許可權之一,所以不能建立新的會話(除非使用者以SYSDBA身份連線)。可使用QUERY 選項指定帶有日期範圍或SCN 範圍的WHERE 子句,通過匯出實用程式歸檔審計表。然後,使用相同的WHERE 子句從審計表中刪除這些記錄。

當AUDIT_TRAIL=OS 時,會在由AUDIT_FILE_DEST 指定的目錄中為每條審計記錄建立單獨的檔案。可以複製特定時間之前的所有檔案,然後刪除它們。

注:SYSTEM 表空間是使用autoextend on 選項建立的。因此SYSTEM 表空間可以根據需要增長,直到用盡磁碟上的可用空間。

系統會按照訪問針對成功和失敗的操作稽核所有使用者的以下許可權:

CREATE EXTERNAL JOB

CREATE ANY JOB

GRANT ANY OBJECT PRIVILEGE

EXEMPT ACCESS POLICY

CREATE ANY LIBRARY

GRANT ANY PRIVILEGE

DROP PROFILE

ALTER PROFILE

DROP ANY PROCEDURE

ALTER ANY PROCEDURE

CREATE ANY PROCEDURE

ALTER DATABASE

GRANT ANY ROLE

CREATE PUBLIC DATABASE LINK

DROP ANY TABLE

ALTER ANY TABLE

CREATE ANY TABLE

DROP USER

ALTER USER

CREATE USER

CREATE SESSION

AUDIT SYSTEM

ALTER SYSTEM

SYSTEM AUDIT

ROLE

2.4 調整安全性

2.4.1 調整安全性設定

使用DBCA 工具建立資料庫時,可以選擇以下安全性設定:

a)  保留11g 的預設增強安全設定(建議)。這些設定包括啟用審計和新的預設口令概要檔案。

b)  還原到11g 之前的預設安全設定。要禁用特定類別的增強設定以實現相容性,請選擇以下設定:

        i.     將審計設定還原為11g 之前的預設設定

      ii.     將口令概要檔案設定還原為11g 之前的預設設定

也可以使用DBCA 在建立資料庫後更改這些設定。在11g 的預設安全設定下,有些應用程式可能無法正常執行。

應始終設定安全的軟體許可權。它不受使用者選擇的“Security Settings(安全設定)”選項所影響。

2.4.2 設定安全性引數

Oracle Database11g 增加了一組新引數以加強資料庫的預設安全性。這些引數是系統範圍的靜態引數。

(1)使用區分大小寫的口令以加強安全性

新引數SEC_CASE_SENSITIVE_LOGON使您可以設定區分大小寫的使用者口令。Oracle 建議保留預設設定TRUE。將此引數設定為FALSE 可指定不區分大小寫的口令以實現向後相容性。

ALTER SYSTEM SETSEC_CASE_SENSITIVE_LOGON = FALSE

注:禁用區分大小寫會使口令在強力攻擊面前變得更脆弱。

(2)防止拒絕服務(DoS) 攻擊

SEC_PROTOCOL_ERROR_FURTHER_ACTION引數:指定了要對客戶機連線執行的操作:繼續、斷開連線或延遲接受請求。

SEC_PROTOCOL_ERROR_TRACE_ACTION引數:指定了監視操作:NONE、TRACE、LOG 或ALERT。

(3)防止強力攻擊

新的初始化引數SEC_MAX_FAILED_LOGIN_ATTEMPTS的預設設定為10,表示在連線嘗試達到指定次數後會自動斷開連線。即使未啟用口令概要檔案,也會強制實施此引數。

此引數可以防止程式連線到資料庫,然後成百上千次地嘗試口令以通過驗證。

附錄:utlpwdmg.sql 指令碼:

[oracle@dave admin]$ cat utlpwdmg.sql

Rem

Rem $Header: utlpwdmg.sql02-aug-2006.08:18:05 asurpur Exp $

Rem

Rem utlpwdmg.sql

Rem

Rem Copyright (c) 2006, Oracle. All rightsreserved. 

Rem

Rem   NAME

Rem     utlpwdmg.sql - script for Default Password Resource Limits

Rem

Rem   DESCRIPTION

Rem     This is a script for enabling the password management features

Rem     by setting the default password resource limits.

Rem

Rem   NOTES

Rem     This file contains a function for minimum checking of password

Rem     complexity. This is more of a sample function that the customer

Rem     can use to develop the function for actual complexity checks that the

Rem     customer wants to make on the new password.

Rem

Rem   MODIFIED   (MM/DD/YY)

Rem   asurpur     05/30/06 - fix -5246666 beef up password complexity check

Rem   nireland    08/31/00 - Improvecheck for username=password. #1390553

Rem   nireland    06/28/00 - Fix nullold password test. #1341892

Rem   asurpur     04/17/97 - Fix forbug479763

Rem   asurpur     12/12/96 - Changingthe name of password_verify_function

Rem   asurpur     05/30/96 - New scriptfor default password management

Rem   asurpur     05/30/96 - Created

Rem

-- This script sets the default passwordresource parameters

-- This script needs to be run to enablethe password features.

-- However the default resource parameterscan be changed based

-- on the need.

-- A default password complexity functionis also provided.

-- This function makes the minimumcomplexity checks like

-- the minimum length of the password,password not same as the

-- username, etc. The user may enhance thisfunction according to

-- the need.

-- This function must be created in SYSschema.

-- connect sys/<password> as sysdbabefore running the script

CREATE OR REPLACE FUNCTIONverify_function_11G

(username varchar2,

 password varchar2,

 old_password varchar2)

 RETURN boolean IS

   nboolean;

   minteger;

  differ integer;

  isdigit boolean;

  ischar  boolean;

  ispunct boolean;

  db_name varchar2(40);

  digitarray varchar2(20);

  punctarray varchar2(25);

   chararray varchar2(52);

  i_char varchar2(10);

  simple_password varchar2(10);

  reverse_user varchar2(32);

BEGIN

  digitarray:= '0123456789';

  chararray:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

   --Check for the minimum length of the password

   IFlength(password) < 8 THEN

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

  END IF;

   --Check if the password is same as the username or username(1-100)

   IFNLS_LOWER(password) = NLS_LOWER(username) THEN

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

  END IF;

  FOR i IN 1..100 LOOP

     i_char := to_char(i);

     if NLS_LOWER(username)|| i_char = NLS_LOWER(password) THEN

       raise_application_error(-20005, 'Password same as or similar to username ');

     END IF;

   END LOOP;

   --Check if the password is same as the username reversed

  FOR i in REVERSE 1..length(username) LOOP

    reverse_user := reverse_user || substr(username, i, 1);

  END LOOP;

   IFNLS_LOWER(password) = NLS_LOWER(reverse_user) THEN

    raise_application_error(-20003, 'Password same as username reversed');

  END IF;

   --Check if the password is the same as server name and or servername(1-100)

  select name into db_name from sys.v$database;

   ifNLS_LOWER(db_name) = NLS_LOWER(password) THEN

     raise_application_error(-20004, 'Password same as or similar to servername');

  END IF;

  FOR i IN 1..100 LOOP

     i_char := to_char(i);

     if NLS_LOWER(db_name)|| i_char = NLS_LOWER(password) THEN

       raise_application_error(-20005, 'Password same as or similar to servername ');

     END IF;

   END LOOP;

   --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.

   IFNLS_LOWER(password) IN ('welcome1', 'database1', 'account1', 'user1234','password1', 'oracle123', 'computer1', 'abcdefg1', 'change_on_install') THEN

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

  END IF;

   --Check if the password is the same as oracle (1-100)

   simple_password := 'oracle';

    FORi IN 1..100 LOOP

     i_char := to_char(i);

     if simple_password || i_char = NLS_LOWER(password) THEN

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

     END IF;

   END LOOP;

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

   --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;

   IFisdigit = FALSE THEN

     raise_application_error(-20008, 'Password must contain at least onedigit, one character');

  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 endsearch;

        END IF;

     END LOOP;

  END LOOP;

   IFischar = FALSE THEN

      raise_application_error(-20009, 'Passwordmust contain at least one \

              digit, and one character');

  END IF;

  <<endsearch>>

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

   --3 letters

   IFold_password IS NOT NULL THEN

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

    differ := abs(differ);

    IF differ < 3 THEN

      IF length(password) < length(old_password) THEN

        m := length(password);

      ELSE

        m := length(old_password);

      END IF;

      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(-20011, 'Password should differ from the \

           old password by at least 3 characters');

      END IF;

    END IF;

  END IF;

   --Everything is fine; return TRUE ;  

  RETURN(TRUE);

END;

/

-- This script alters the default parametersfor Password Management

-- This means that all the users on thesystem have Password Management

-- enabled and set to the following valuesunless another profile is

-- created with parameter values set todifferent value or UNLIMITED

-- is created and assigned to the user.

ALTER PROFILE DEFAULT LIMIT

PASSWORD_LIFE_TIME 180

PASSWORD_GRACE_TIME 7

PASSWORD_REUSE_TIME UNLIMITED

PASSWORD_REUSE_MAX UNLIMITED

FAILED_LOGIN_ATTEMPTS 10

PASSWORD_LOCK_TIME 1

PASSWORD_VERIFY_FUNCTIONverify_function_11G;

-- Below is the older version of the script

-- This script sets the default passwordresource parameters

-- This script needs to be run to enablethe password features.

-- However the default resource parameterscan be changed based

-- on the need.

-- A default password complexity functionis also provided.

-- This function makes the minimumcomplexity checks like

-- the minimum length of the password,password not same as the

-- username, etc. The user may enhance thisfunction according to

-- the need.

-- This function must be created in SYSschema.

-- connect sys/<password> as sysdbabefore running the script

CREATE OR REPLACE FUNCTION verify_function

(username varchar2,

 password varchar2,

 old_password varchar2)

 RETURN boolean IS

   nboolean;

   minteger;

  differ integer;

  isdigit boolean;

  ischar  boolean;

  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

   IFNLS_LOWER(password) = NLS_LOWER(username) THEN

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

   ENDIF;

   --Check for the minimum length of the password

   IFlength(password) < 4 THEN

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

  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.

   IFNLS_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;

   IFisdigit = FALSE THEN

     raise_application_error(-20003, 'Password should contain at least onedigit, 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;

   IFischar = FALSE THEN

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

              digit, one character and onepunctuation');

  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;

   IFispunct = FALSE THEN

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

              digit, one character and onepunctuation');

  END IF;

  <<endsearch>>

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

   --3 letters

   IFold_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;

/

-- This script alters the defaultparameters for Password Management

-- This means that all the users on thesystem have Password Management

-- enabled and set to the following valuesunless another profile is

-- created with parameter values set todifferent value or UNLIMITED

-- is created and assigned to the user.

-- Enable this if you want older version ofthe Password Profile parameters

-- 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_FUNCTIONverify_function;

[oracle@dave admin]$

注: 內容引自Oracle 11g OCP 教材。

QQ:492913789

Email:[email protected]