轉至: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 --
