使用Oracle的PROFILE對用戶資源限制和密碼限制


轉至:https://blog.csdn.net/zhuomingwang/article/details/6444240?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control

1.用戶創建語句PROFILE選項
如果大家細心的話,在創建用戶的語法中有這么一個選項“PROFILE profile”。
下面是Oracle 11gR2官方文檔中關於創建用戶的語法描述(較之10g的文檔可讀性加強了,當然功能也同樣有所增加):
CREATE USER user
   IDENTIFIED { BY password
              | EXTERNALLY [ AS 'certificate_DN'  |  AS 'kerberos_principal_name' ]
              | GLOBALLY [ AS '[ directory_DN ]' ]
              }
   [ DEFAULT TABLESPACE tablespace
   | TEMPORARY TABLESPACE
        { tablespace | tablespace_group_name }
   | { QUOTA { size_clause | UNLIMITED } ON tablespace }...
   | PROFILE profile
   | PASSWORD EXPIRE
   | ACCOUNT { LOCK | UNLOCK }
     | ENABLE EDITIONS
     ]...
  ] ;


2.提問:PROFILE選項是做什么用的呢?
回答:簡要的說,PROFILE在Oracle數據庫對數據庫用戶能夠使用的資源做進一步的限制的一種手段,
如對連接到某個用戶的session或sql所能使用的CPU資源進行控制,又如控制Oracle用戶的密碼管理策略等等……

3.查看系統的默認PROFILE
1)通過dba_profiles視圖查看一下系統中默認都有哪些PROFILE
數據庫創建以后,系統中只會存在一個名為DEFAULT的默認PROFILE,在用戶創建之后,如果不做特殊指定,
每個用戶的PROFILE都會默認的使用個默認的PROFILE。
sys@ora10g> select distinct profile from dba_profiles;

PROFILE
----------
DEFAULT

2)全面查看一下這個PROFILE都包含哪些限制定義

sys@ora10g> select * from dba_profiles;

PROFILE    RESOURCE_NAME                    RESOURCE LIMIT
---------- -------------------------------- -------- -----------------
DEFAULT    COMPOSITE_LIMIT                  KERNEL   UNLIMITED
DEFAULT    SESSIONS_PER_USER                KERNEL   UNLIMITED
DEFAULT    CPU_PER_SESSION                  KERNEL   UNLIMITED
DEFAULT    CPU_PER_CALL                     KERNEL   UNLIMITED
DEFAULT    LOGICAL_READS_PER_SESSION        KERNEL   UNLIMITED
DEFAULT    LOGICAL_READS_PER_CALL           KERNEL   UNLIMITED
DEFAULT    IDLE_TIME                        KERNEL   UNLIMITED
DEFAULT    CONNECT_TIME                     KERNEL   UNLIMITED
DEFAULT    PRIVATE_SGA                      KERNEL   UNLIMITED
DEFAULT    FAILED_LOGIN_ATTEMPTS            PASSWORD 10
DEFAULT    PASSWORD_LIFE_TIME               PASSWORD UNLIMITED
DEFAULT    PASSWORD_REUSE_TIME              PASSWORD UNLIMITED
DEFAULT    PASSWORD_REUSE_MAX               PASSWORD UNLIMITED
DEFAULT    PASSWORD_VERIFY_FUNCTION         PASSWORD NULL
DEFAULT    PASSWORD_LOCK_TIME               PASSWORD UNLIMITED
DEFAULT    PASSWORD_GRACE_TIME              PASSWORD UNLIMITED

16 rows selected.

3)結論
通過上面的查看,可以得到這個系統默認的PROFILE “DEFAULT”的配置信息只對密碼的錯誤嘗試次數做了限制
(最多可以錯誤輸錯10次密碼),如果我們啟用了PROFILE(下面有介紹如何啟用和停止PROFILE),默認的限制只有這些。
如果想要改變限制條件,有兩種方法:第一種方法是可以對這個默認的PROFILE做個性化的調整;
第二種方法是再重新定制一個新的PROFILE滿足新的需求。

4.對創建PROFILE的標准語法做一下“解剖麻雀”(更多細節可以參考Oracle的官方文檔)
1)創建PROFILE的語法如下:
CREATE PROFILE profile
   LIMIT { resource_parameters 對資源的限制
         | password_parameters 對密碼的限制
         }...
;


修改參數的值ALTER PROFILE <profile_name> LIMIT <profile_item_name> <value>;;
例如:alter profile default limit password_life_time 1;

2)對數據庫資源做限制時,下面是全部可用的參數:

RESOURCE_LIMIT=TRUE is required for resource limiting portions of the profile. 
Password limiting functionality is not affected by this parameter.

SELECT name, value
FROM gv$parameter
WHERE name = 'resource_limit';

ALTER SYSTEM SET resource_limit=TRUE SCOPE=spfile;
startup force;

SELECT name, value
FROM gv$parameter
WHERE name = 'resource_limit';


{ { SESSIONS_PER_USER 每個用戶名所允許的並行會話數
  | CPU_PER_SESSION   一個會話一共可以使用的CPU時間,單位是百分之一秒
  | CPU_PER_CALL      一次SQL調用(解析、執行和獲取)允許使用的CPU時間
  | CONNECT_TIME      限制會話連接時間,單位是分鍾
  | IDLE_TIME         允許空閑會話的時間,單位是分鍾
  | LOGICAL_READS_PER_SESSION 限制會話對數據塊的讀取,單位是塊
  | LOGICAL_READS_PER_CALL    限制SQL調用對數據塊的讀取,單位是塊
  | COMPOSITE_LIMIT   “組合打法”
  }
  { integer | UNLIMITED | DEFAULT }
| PRIVATE_SGA   限制會話在SGA中Shared Pool中私有空間的分配
  { size_clause | UNLIMITED | DEFAULT }
}

 
3)對密碼做限制時,下面是全部可用的參數:
{ { FAILED_LOGIN_ATTEMPTS 帳戶被鎖定之前可以錯誤嘗試的次數
  | PASSWORD_LIFE_TIME    密碼可以被使用的天數,單位是天,默認值180天
  | PASSWORD_REUSE_TIME   密碼可重用的間隔時間(結合PASSWORD_REUSE_MAX)
  | PASSWORD_REUSE_MAX    密碼的最大改變次數(結合PASSWORD_REUSE_TIME)
  | PASSWORD_LOCK_TIME    超過錯誤嘗試次數后,用戶被鎖定的天數,默認1天
  | PASSWORD_GRACE_TIME   當密碼過期之后還有多少天可以使用原密碼
  }
  { expr | UNLIMITED | DEFAULT }
| PASSWORD_VERIFY_FUNCTION
  { function | NULL | DEFAULT }
}

5.OK,語法已經了然於胸,那么我們來實際創建一個PROFILE(這里的名字我們稱其為:sec_profile),
在感性認識的同時一同探索一下在這個過程中會遇到的一些有趣現象。
1)嘗試創建一個混合型的PROFILE(包含資源限制和密碼限制)

sys@ora10g> CREATE PROFILE sec_profile LIMIT
  2     SESSIONS_PER_USER          UNLIMITED
  3     CPU_PER_SESSION            UNLIMITED
  4     CPU_PER_CALL               6000
  5     CONNECT_TIME               60
  6     LOGICAL_READS_PER_SESSION  DEFAULT
  7     LOGICAL_READS_PER_CALL     6000
  8     COMPOSITE_LIMIT            6000000
  9     PRIVATE_SGA                66K
 10     FAILED_LOGIN_ATTEMPTS      6
 11     PASSWORD_LIFE_TIME         60
 12     PASSWORD_REUSE_TIME        60
 13     PASSWORD_REUSE_MAX         5
 14     PASSWORD_LOCK_TIME         1/24
 15     PASSWORD_GRACE_TIME        10   
 16     PASSWORD_VERIFY_FUNCTION   verify_function
 17  /
CREATE PROFILE sec_profile LIMIT
*
ERROR at line 1:
ORA-07443: function VERIFY_FUNCTION not found

2)報錯原因
為什么會報錯?錯誤提示很清楚,VERIFY_FUNCTION這個函數不存在。既然知道不存在,那我們如何創建它呢?
回答:
VERIFY_FUNCTION函數是通過utlpwdmg.sql腳本創建的,該腳本所在的目錄是$ORACLE_HOME/rdbms/admin/

3)創建密碼復雜性檢驗函數VERIFY_FUNCTION
我們使用utlpwdmg.sql腳本創建以下這個VERIFY_FUNCTION密碼復雜度校驗函數
sys@ora10g> @?/rdbms/admin/utlpwdmg.sql

Function created.


Profile altered.

4)utlpwdmg.sql腳本中的小秘密
細心的您在執行utlpwdmg.sql腳本的過程中一定發現了有一個“Profile altered”的提示,難道這個腳本修改了某個PROFILE信息么?
正如您所料,它修改了系統的默認PROFILE “DEFAULT”,再次查看一下現在的DEFAULT的定義信息:

sys@ora10g> select * from dba_profiles;

PROFILE    RESOURCE_NAME                    RESOURCE LIMIT
---------- -------------------------------- -------- -----------------
DEFAULT    COMPOSITE_LIMIT                  KERNEL   UNLIMITED
DEFAULT    SESSIONS_PER_USER                KERNEL   UNLIMITED
DEFAULT    CPU_PER_SESSION                  KERNEL   UNLIMITED
DEFAULT    CPU_PER_CALL                     KERNEL   UNLIMITED
DEFAULT    LOGICAL_READS_PER_SESSION        KERNEL   UNLIMITED
DEFAULT    LOGICAL_READS_PER_CALL           KERNEL   UNLIMITED
DEFAULT    IDLE_TIME                        KERNEL   UNLIMITED
DEFAULT    CONNECT_TIME                     KERNEL   UNLIMITED
DEFAULT    PRIVATE_SGA                      KERNEL   UNLIMITED
DEFAULT    FAILED_LOGIN_ATTEMPTS            PASSWORD 3
DEFAULT    PASSWORD_LIFE_TIME               PASSWORD 60
DEFAULT    PASSWORD_REUSE_TIME              PASSWORD 1800
DEFAULT    PASSWORD_REUSE_MAX               PASSWORD UNLIMITED
DEFAULT    PASSWORD_VERIFY_FUNCTION         PASSWORD VERIFY_FUNCTION
DEFAULT    PASSWORD_LOCK_TIME               PASSWORD .0006
DEFAULT    PASSWORD_GRACE_TIME              PASSWORD 10

16 rows selected.

與系統創建時的DEFAULT PROFILE相比較,之前只有10次密碼輸入錯誤的限制,執行完成這個函數創建之后,
我們發現系統默認的PROFILE已經對系統有了一個非常嚴格的約束。
也就是說現在系統上的每一個用戶在默認情況下都多了這些密碼方面的限制。

5)驗證一下新默認的PROFILE “DEFAULT”關於錯誤密碼輸入次數的限制
我們模擬一下錯誤輸錯密碼三次后的效果,可以看到,在第四次輸入后,sec用戶被鎖定了。

sys@ora10g> conn sec/a
ERROR:
ORA-01017: invalid username/password; logon denied


Warning: You are no longer connected to ORACLE.
sys@ora10g> conn sec/a
ERROR:
ORA-01017: invalid username/password; logon denied


sys@ora10g> conn sec/a
ERROR:
ORA-01017: invalid username/password; logon denied


sys@ora10g> conn sec/a
ERROR:
ORA-28000: the account is locked

6)使用dba_users視圖比較一下用戶的前后狀態
用戶sec已經因錯誤密碼輸入次數超過3此導致用戶被鎖定了,進一步比較一下用戶的狀態。

sys@ora10g> col USERNAME for a10
sys@ora10g> col ACCOUNT_STATUS for a20
sys@ora10g> col PROFILE for a10
sys@ora10g> select USERNAME,ACCOUNT_STATUS,LOCK_DATE,EXPIRY_DATE from dba_users where username = 'SEC';

USERNAME   ACCOUNT_STATUS       LOCK_DATE           EXPIRY_DATE
---------- -------------------- ------------------- -------------------
SEC        OPEN

sys@ora10g> select USERNAME,ACCOUNT_STATUS,LOCK_DATE,EXPIRY_DATE from dba_users where username = 'SEC';

USERNAME   ACCOUNT_STATUS       LOCK_DATE           EXPIRY_DATE
---------- -------------------- ------------------- -------------------
SEC        LOCKED(TIMED)        2009-10-11 16:05:03 2009-12-09 08:46:36

7)既然默認的PROFILE發生了變化,那么就會面臨一個實際問題,如何恢復成原始狀態呢?這里給出一個比較簡單的方法,
就是使用ALTER PROFILE命令修改成原來的模樣

sys@ora10g> ALTER PROFILE DEFAULT LIMIT
  2   COMPOSITE_LIMIT             UNLIMITED
  3   SESSIONS_PER_USER           UNLIMITED
  4   CPU_PER_SESSION             UNLIMITED
  5   CPU_PER_CALL                UNLIMITED
  6   LOGICAL_READS_PER_SESSION   UNLIMITED
  7   LOGICAL_READS_PER_CALL      UNLIMITED
  8   IDLE_TIME                   UNLIMITED
  9   CONNECT_TIME                UNLIMITED
 10   PRIVATE_SGA                 UNLIMITED
 11   FAILED_LOGIN_ATTEMPTS       10
 12   PASSWORD_LIFE_TIME          UNLIMITED
 13   PASSWORD_REUSE_TIME         UNLIMITED
 14   PASSWORD_REUSE_MAX          UNLIMITED
 15   PASSWORD_VERIFY_FUNCTION    NULL
 16   PASSWORD_LOCK_TIME          UNLIMITED
 17   PASSWORD_GRACE_TIME         UNLIMITED
 18  /

Profile altered.

8)最后我們重新創建一下這個實驗PROFILE:sec_profile,可以預測,這次一定會成功滴~~~

sys@ora10g> CREATE PROFILE sec_profile LIMIT
  2     SESSIONS_PER_USER          UNLIMITED
  3     CPU_PER_SESSION            UNLIMITED
  4     CPU_PER_CALL               6000
  5     CONNECT_TIME               60
  6     LOGICAL_READS_PER_SESSION  DEFAULT
  7     LOGICAL_READS_PER_CALL     6000
  8     COMPOSITE_LIMIT            6000000
  9     PRIVATE_SGA                66K
 10     FAILED_LOGIN_ATTEMPTS      6
 11     PASSWORD_LIFE_TIME         60
 12     PASSWORD_REUSE_TIME        60
 13     PASSWORD_REUSE_MAX         5
 14     PASSWORD_LOCK_TIME         1/24
 15     PASSWORD_GRACE_TIME        10  
 16     PASSWORD_VERIFY_FUNCTION   verify_function
 17  /

Profile created.

創建成功鳥~~
在這個實驗中,我們使用了PROFILE幾乎所有的參數,惟一沒有包含的參數是IDLE_TIME,
目的僅僅是為了說明一個細節:如果該PROFILE被授權給用戶后,這個被省略的IDLE_TIME參數將繼承默認PROFILE “DEFALT”中的定義。

對上面我們創建的PROFILE逐行做一下詮釋,以便加深理解:
第 2行:對用戶的並發連接會話數不做限制
第 3行:對於連接到用戶的每一個session的CPU時間的使用不做限制
第 4行:一次調用消耗的CPU時間不能超過60秒(不超過一分鍾)
第 5行:連接到用戶的每次會話時間不能超過60分鍾(不超過一個小時)
第 6行:一次會話使用的物理讀與邏輯讀數據塊總量與DEFAULT profile中定義保持一致
第 7行:一次調用使用的物理讀與邏輯讀數據塊總量不超過6000個數據塊
第 8行:一次會話總的資源消耗不超過6000000個服務單元(service units)
第 9行:一次會話在SGA中不能分配超過66K的空間
第10行:帳戶被鎖定之前允許6次的錯誤嘗試
第11行:超過此生命周期后密碼作廢
第12行:密碼重用時間60天
第13行:密碼重用之前密碼需要完成5次改變
第14行:超過錯誤嘗試次數后,用戶將被鎖定1小時
第15行:當密碼過期之后原密碼還可以使用10天
第16行:使用密碼復雜度校驗函數verify_function對密碼做檢查

再單獨深入解釋一下第12行和13行組合搭配之后的含義:也就是說只有完成了5次的密碼修改后並且已經超過60天后,
之前的密碼才能夠再一次被使用。

9)通過dba_profiles視圖再一次查看一下此時系統中存在的PROFILE的信息

sys@ora10g> col PROFILE for a12
sys@ora10g> col RESOURCE_NAME for a25
sys@ora10g> col LIMIT for a15
sys@ora10g> select * from dba_profiles order by 1,2;

PROFILE      RESOURCE_NAME             RESOURCE LIMIT
------------ ------------------------- -------- ---------------
DEFAULT      COMPOSITE_LIMIT           KERNEL   UNLIMITED
DEFAULT      CONNECT_TIME              KERNEL   UNLIMITED
DEFAULT      CPU_PER_CALL              KERNEL   UNLIMITED
DEFAULT      CPU_PER_SESSION           KERNEL   UNLIMITED
DEFAULT      FAILED_LOGIN_ATTEMPTS     PASSWORD 3
DEFAULT      IDLE_TIME                 KERNEL   UNLIMITED
DEFAULT      LOGICAL_READS_PER_CALL    KERNEL   UNLIMITED
DEFAULT      LOGICAL_READS_PER_SESSION KERNEL   UNLIMITED
DEFAULT      PASSWORD_GRACE_TIME       PASSWORD 10
DEFAULT      PASSWORD_LIFE_TIME        PASSWORD 60
DEFAULT      PASSWORD_LOCK_TIME        PASSWORD .0006
DEFAULT      PASSWORD_REUSE_MAX        PASSWORD UNLIMITED
DEFAULT      PASSWORD_REUSE_TIME       PASSWORD 1800
DEFAULT      PASSWORD_VERIFY_FUNCTION  PASSWORD VERIFY_FUNCTION
DEFAULT      PRIVATE_SGA               KERNEL   UNLIMITED
DEFAULT      SESSIONS_PER_USER         KERNEL   UNLIMITED
SEC_PROFILE  COMPOSITE_LIMIT           KERNEL   5000000
SEC_PROFILE  CONNECT_TIME              KERNEL   45
SEC_PROFILE  CPU_PER_CALL              KERNEL   3000
SEC_PROFILE  CPU_PER_SESSION           KERNEL   UNLIMITED
SEC_PROFILE  FAILED_LOGIN_ATTEMPTS     PASSWORD 5
SEC_PROFILE  IDLE_TIME                 KERNEL   DEFAULT
SEC_PROFILE  LOGICAL_READS_PER_CALL    KERNEL   1000
SEC_PROFILE  LOGICAL_READS_PER_SESSION KERNEL   DEFAULT
SEC_PROFILE  PASSWORD_GRACE_TIME       PASSWORD 10
SEC_PROFILE  PASSWORD_LIFE_TIME        PASSWORD 60
SEC_PROFILE  PASSWORD_LOCK_TIME        PASSWORD .0416
SEC_PROFILE  PASSWORD_REUSE_MAX        PASSWORD 5
SEC_PROFILE  PASSWORD_REUSE_TIME       PASSWORD 60
SEC_PROFILE  PASSWORD_VERIFY_FUNCTION  PASSWORD VERIFY_FUNCTION
SEC_PROFILE  PRIVATE_SGA               KERNEL   15360
SEC_PROFILE  SESSIONS_PER_USER         KERNEL   UNLIMITED

32 rows selected.

10)刪除PROFILE
既然有創建,就一定對應着刪除,刪除方法很簡單,語法如下:
DROP PROFILE profile [ CASCADE ] ;

如果創建的PROFILE已經授權給了具體的用戶,則需要使用CASCADE選項級聯的收回相應的限制信息,
在收回這些限制信息之后將會以系統默認的PROFILE對該用戶進行限制。
刪除示例如下:

sys@ora10g> drop profile SEC_PROFILE cascade;

Profile dropped.

如果該PROFILE已經授權給具體的用戶,使用不帶有cascade選項的刪除命令將得到如下的報錯信息:

sys@ora10g> drop profile SEC_PROFILE;
drop profile SEC_PROFILE
*
ERROR at line 1:
ORA-02382: profile SEC_PROFILE has users assigned, cannot drop without CASCADE

6.關於PROFILE內容何時生效的一點注意事項
這里討論需要談到一個系統參數,它就是resource_limit。

如果要開啟“資源限制”的話,這個參數必須是“TRUE”的狀態

sys@ora10g> show parameter resource_limit

NAME            TYPE                 VALUE
--------------- -------------------- ----------------------
resource_limit  boolean              FALSE

這里有一個小細節不得不提:
之所以稱這個參數為resource_limit(資源限制)而沒有稱作“profile_limit”,是因為這個參數只對PROFILE中的資源限制部分起作用,
如果是默認的FALSE狀態,表示PROFILE定義中的資源限制條件不起作用,只有該參數為TRUE時,資源限制的定義才生效。
不過,關於PROFILE中密碼限制的條件則與這個參數無關,無論這個參數設置為什么值,有關密碼限制的條件都會默認生效,
從這個細節上可以看出來Oracle對用戶密碼的重視程度。

因此關於PROFILE的生效情況結論是:
1)用戶所有擁有的PROFILE中有關密碼的限制永遠生效,不受限制。
2)用戶所有擁有的PROFILE中有關資源的限制與resource_limit參數的設置有關,當為TRUE時生效,當為FALSE時(默認值是FALSE)無效。

7.一切都OK了,最后我們來演示一下將新創建的PROFILE sec_profile指定給具體用戶sec的操作

sys@ora10g> alter user sec profile sec_profile;

User altered.

sys@ora10g> select USERNAME,PROFILE from dba_users where USERNAME = 'SEC';
                                                                          
USERNAME   PROFILE                                                       
---------- ------------                                                  
SEC        SEC_PROFILE    

8.【附】密碼驗證函數VERIFY_FUNCTION的創建腳本內容utlpwdmg.sql,供參考。

ora10g@secDB /home/oracle$ cat $ORACLE_HOME/rdbms/admin/utlpwdmg.sql
Rem
Rem $Header: utlpwdmg.sql 31-aug-2000.11:00:47 nireland Exp $
Rem
Rem utlpwdmg.sql
Rem
Rem  Copyright (c) Oracle Corporation 1996, 2000. All Rights Reserved.
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    nireland    08/31/00 - Improve check for username=password. #1390553
Rem    nireland    06/28/00 - Fix null old password test. #1341892
Rem    asurpur     04/17/97 - Fix for bug479763
Rem    asurpur     12/12/96 - Changing the name of password_verify_function
Rem    asurpur     05/30/96 - New script. for default password management
Rem    asurpur     05/30/96 - Created
Rem

-- This script. sets the default password resource parameters
-- This script. needs to be run to enable the password features.
-- However the default resource parameters can be changed based
-- on the need.
-- A default password complexity function is also provided.
-- This function makes the minimum complexity checks like
-- the minimum length of the password, password not same as the
-- username, etc. The user may enhance this function according to
-- the need.
-- This function must be created in SYS schema.
-- connect sys/<password> as sysdba before running the script

CREATE OR REPLACE FUNCTION verify_function
(username varchar2,
  password varchar2,
  old_password varchar2)
  RETURN boolean IS
   n boolean;
   m integer;
   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
   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) < 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.
   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;
/

-- This script. alters the default parameters for Password Management
-- This means that all the users on the system have Password Management
-- enabled and set to the following values unless another profile is
-- created with parameter values set to different value or UNLIMITED
-- is created and assigned to the user.

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;

仔細閱讀上面的腳本,您可以得到關於verify_function函數的密碼復雜性校驗規則如下:
1)密碼最小長度為4個字符
2)密碼不能和用戶名相同
3)密碼要包含至少一個字符、一個數字和一個特殊字符
4)密碼需要至少有3個字符與之前的口令不相同

9.小結
通過PROFILE對用戶的資源和登錄密碼的限制方法使用起來還是很貼心的,畢竟Oracle提供了這樣一種便捷的管理手段,
對付數據庫方面的一般性審計還是游刃有余的,即使這些規則仍然不能滿足需求,Oracle也提供了添加和修改的接口,
以便按需定制,當然會有一定的開發周期和成本。

Oracle對數據庫的安全性方面提供了非常多的手段來保證,如審計和權限控制等優秀手段。對於一個商業數據庫的安全性審計是非常重要的,
如果后台的數據庫存在安全隱患,可以說必定會帶來一場浩劫,只是早晚的事情。如果您是一名維護DBA,
一定要從數據庫的安全性上多多動腦筋,不要等待問題出現了才恍然大悟:哇塞,原來Oracle同學早就有補救的措施啦!

BTW:關於權限控制的策略在使用前一定要做好充分的測試,確保對每一條限制規則理解透徹,不然會帶來不必要的麻煩,
另外一個經驗就是:將每一步的限制規則記錄到一個特定的數據庫維護手冊中,方便查詢,
                  同時也便於知識的傳承,利己利人,“好事兩樁”。

-- The End --


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM