oracle中prad函数_等保测评2.0:Oracle身份鉴别
一、說明
本篇文章主要說一說oracle數據庫中身份鑒別控制點中測評項a的相關內容和理解。
二、測評項a
a)應對登錄的用戶進行身份標識和鑒別,身份標識具有唯一性,身份鑒別信息具有復雜度要求并定期更換;
三、測評項a要求1
應對登錄的用戶進行身份標識和鑒別
oracle使用用戶名對登錄用戶進行身份標識,這沒啥好說的。oracle在身份鑒別這一塊,擁有密碼文件驗證和操作系統驗證兩種方式。
密碼文件驗證的話,是需要登錄用戶輸入用戶名、口令的,但是操作系統驗證則不需要。
對于數據庫特殊賬戶的操作系統驗證,僅由sqlnet.ora文件中的SQLNET.AUTHENTICATION_SERVICES進行控制。
這里大家如果不想麻煩的話,其實也沒有必要把SQLNET.AUTHENTICATION_SERVICES參數的值在linux和windows系統中代表的意義都搞清楚,測評的時候直接測試即可。
以centos系統為例子,也就是測評的時候先登錄oracle數據庫服務器的oracle賬戶,如果被測評方不清楚oracle賬戶的口令,也可以登錄到root賬戶,然后使用“su - oracle”命令切換過去。
其實這里需要登錄的是屬于oinstall用戶組的用戶,但是一般情況下沒人會去改默認配置,默認安裝情況下操作系統的oracle用戶會屬于oinstall用戶組。
登錄oracle賬戶成功后,使用sqlplus / as sysdba命令去登錄oracle數據庫,這里就是使用數據庫特殊賬戶的操作系統驗證方式去驗證。
如果能登錄成功則說明開啟了這種驗證方式,不能則說明沒開啟。
如果開啟了,那么這個要求項它就不能滿足了,頂多是部分符合,因為這種方式登錄數據庫特殊賬戶不需要用戶名、密碼(雖然只能在本地登錄,且登錄的操作系統賬戶需要隸屬于oinstall用戶組),是一個比較大的安全隱患。
還有一種針對數據庫普通賬戶的操作系統驗證方式,這種驗證方式對于登錄的操作系統賬戶沒有啥要求。
先去查看remote_os_authent和os_authent_prefix參數,它們的默認值分別是FALSE和ops$。
如果remote_os_authent是FALSE,那么是否開啟這種驗證方式還是由SQLNET.AUTHENTICATION_SERVICES決定。
如果開啟了,假定os_authent_prefix的值是ops$,假定操作系統中存在一個cv的賬戶。
那么只要oracle數據庫中建立一個名為ops$cv的賬戶并給與基礎權限(連接權限等),用戶在登錄操作系統中的cv后,可以直接使用sqlplus /或sqlplus / as normal(兩個命令是一個意思),以普通賬戶的身份登錄ops$cv賬戶(當然這里需在cv賬戶的環境變量里配置一下好方便的使用sqlplus命令)。
同樣的,如果開啟了這種驗證方式,那么也就頂多是部分符合了。
如果remote_os_authent為TRUE,那不用看了,數據庫普通賬戶的操作系統驗證方式肯定開啟了,并且數據庫普通賬戶的遠程操作系統驗證方式也開啟了。
還是用上面的數據舉例子,假定os_authent_prefix的值是ops$,假定遠程終端存在一個cv的操作系統賬戶,那么在遠程終端那也可以用空用戶名、空口令的方式登錄ops$cv賬戶,更不安全了。
至于空口令,在oracle中似乎不能設置空口令,我反正沒有嘗試成功……
四、測評項a要求2
身份標識具有唯一性
即用戶名不會重復,oracle自動實現,默認符合。
五、測評項a要求3
身份鑒別信息具有復雜度要求
這個要從兩個方面看,我個人覺得兩個方面都符合才能算達到要求。
第一個方面即實際的口令是否具有一定的復雜度,也即口令至少8位,且包含大寫字母、小寫字母、數字、特殊字符這四類字符種的三種,且口令不包含簡單排列規律,如admin!@#123此類弱口令。
第二個方面就是在oracle中是否設置了口令復雜度策略,這里要看的就是配置表中的PASSWORD_VERIFY_FUNCTION字段的值:
select * from dba_profiles;這里插一句嘴,說一說配置表的規則,用戶是可以自定義多個配置給不同的用戶使用。
比如這里的PASSWORD_VERIFY_FUNCTION的Profile字段值為Default,某用戶要使用Default的相關配置,就要設置DBA_USERS表中的Profile字段值為Default。
默認情況下,用戶使用的都是Default:
select username,profile from DBA_USERS好,咱們說一說PASSWORD_VERIFY_FUNCTION字段是什么意思,該字段的值應該為oracle中某函數對象的名字,當創建、更改用戶口令時會調用到該函數對口令進行校驗,默認情況下這里的值是null,也即不使用任何函數對口令進行校驗。
在初級教材中,讓我們去查看utlpwdmg.sql中的相關信息,其實是不準確的。
因為utlpwdmg.sql并不是函數本身,它只是創建函數的一段語句而已。
實際上在oracle11g中,運行utlpwdmg.sql會創建兩個函數,一個是新版本的口令校驗函數,一個是老版本的,在里面還會對配置表進行修改,讓PASSWORD_VERIFY_FUNCTION的值為新版本的口令校驗函數的名字。
這個是utlpwdmg.sql文件中新版本的口令校驗函數FUNCTION verify_function_11G的定義語句:
CREATE OR REPLACE FUNCTION verify_function_11G(username varchar2, password varchar2, old_password varchar2) RETURN boolean IS n boolean; m integer; 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 IF length(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) IF NLS_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 user name '); 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; IF NLS_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; if NLS_LOWER(db_name) = NLS_LOWER(password) THEN raise_application_error(-20004, 'Password same as or similar to server name'); 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 server name '); 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. IF NLS_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'; FOR i 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; IF isdigit = FALSE THEN raise_application_error(-20008, 'Password must contain at least one digit, one character'); END IF; -- 2\. Check for the character <> 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; IF ischar = FALSE THEN raise_application_error(-20009, 'Password must contain at least one \ digit, and one character'); END IF; <> -- 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); 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;/然后在這里,對配置文件進行了修改,設置PASSWORD_VERIFY_FUNCTION的值為verify_function_11G:
-- 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 LIMITPASSWORD_LIFE_TIME 180PASSWORD_GRACE_TIME 7PASSWORD_REUSE_TIME UNLIMITEDPASSWORD_REUSE_MAX UNLIMITEDFAILED_LOGIN_ATTEMPTS 10PASSWORD_LOCK_TIME 1PASSWORD_VERIFY_FUNCTION verify_function_11G;這個是老版本的校驗函數FUNCTION verify_function的定義語句:
-- Below is the older version of the script-- 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/ as sysdba before running the scriptCREATE 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 <> 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 <> 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; <> -- 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;/所以,實際上想要知道現在實際使用的校驗函數的內容,就應該直接在數據庫中查看校驗函數的內容,而不是去查看utlpwdmg.sql文件。
在這里,使用的是verify_function_11G,由于其內容我沒有修改過,所以和utlpwdmg.sql中所定義的是一樣的:
至于其中的內容嘛,注釋寫得很清楚的,我就從上到下大概說明下:
檢查口令的最小長度,如果小于8就返回錯誤,所以口令的最小長度是9
-- Check for the minimum length of the password IF length(password) < 8 THEN raise_application_error(-20001, 'Password length less than 8'); END IF;檢查被創建或被更改口令的賬戶的用戶名是否和新的口令一樣,如果一樣返回錯誤
檢查新的口令是是否等于用戶名后面加上1到100的數字,比如用戶名時user,那么口令如果是user0到user100中的任何一個,也會返回錯誤。
-- Check if the password is same as the username or username(1-100) IF NLS_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 user name '); END IF; END LOOP;這里是檢查口令是否等于倒序的用戶名,或者與其相似,比如用戶名是user,則口令不能是r、re、res、resu中的任何一個
-- 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; IF NLS_LOWER(password) = NLS_LOWER(reverse_user) THEN raise_application_error(-20003, 'Password same as username reversed'); END IF;這里檢查口令是否和數據庫名相等,以及是否和數據庫名0到數據庫名100相等。
我這里是默認的數據庫名:ORCL
-- Check if the password is the same as server name and or servername(1-100) select name into db_name from sys.v$database; if NLS_LOWER(db_name) = NLS_LOWER(password) THEN raise_application_error(-20004, 'Password same as or similar to server name'); 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 server name '); 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. IF NLS_LOWER(password) IN ('welcome1', 'database1', 'account1', 'user1234', 'password1', 'oracle123', 'computer1', 'abcdefg1', 'change_on_install') THEN raise_application_error(-20006, 'Password too simple'); END IF;檢查口令是否是oracle1到oracle100中的一個,不過這里口令可以等于oracle,不知道為啥這里是否等于oracle的校驗
-- Check if the password is the same as oracle (1-100) simple_password := 'oracle'; FOR i 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;檢查口令是否包含至少一個數字和一個字母(同時包含才可以通過校驗)
由于這里字母數組的定義是:chararray:= ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’;
所以指的是至少一個大寫或小寫字母。
-- 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; IF isdigit = FALSE THEN raise_application_error(-20008, 'Password must contain at least one digit, one character'); END IF; -- 2\. Check for the character <> 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; IF ischar = FALSE THEN raise_application_error(-20009, 'Password must contain at least one \ digit, and one character'); END IF;檢查口令和舊口令的相似程度:
假設新口令是user,舊口令是admin
新口令長度和舊口令長度的差值大于等于3的話,直接通過校驗。
這里的差值是1,所以需要進行校驗。
循環的次數為長度小的那一邊的口令的長度,也就是user字符串的長度4。
順序取字符串來對比:
u不等于a,differ的值加1,為1
s不等于d,differ加1,為2
最后循環4次結束,differ為4,
如果最后differ小于3,則未通過校驗,大于等3,則通過校驗。
-- 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); 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;最后,如果通過了所有的校驗(中途沒有返回錯誤),就直接返回true:
-- Everything is fine; return TRUE ; RETURN(TRUE);從整個默認的新版的校驗函數看來,主要就是口令長度不低于9位,需要同時包含數字、字母(大小寫皆可),感覺稍微差了那么一點。
理論上比較好的應該是口令長度不低于8位(這里是9位當然更好了),同時包含數字、大寫字母、小寫字母、特殊字符其中的3種字符。
另外,不知道為什么,SYS賬戶的口令的更改,不受到這個校驗函數的限制。
登錄SYS按道理來說使用的是密碼文件或操作系統的驗證,所以不知道在USER$中SYS賬戶的PASSWORD字段的值有什么用,雖然也會跟著口令的更改而更改就是了。
六、測評項a要求4
并定期更換
一方面查看實際的更換時間:
select name,PTIME from USER$另一方面查看相關的策略,先看和口令過期直接相關的兩個參數:
PASSWORD_LIFE_TIME和PASSWORD_GRACE_TIME
這里的時間單位是天,我這里自己修改過,默認情況下PASSWORD_LIFE_TIME的值是180,PASSWORD_GRACE_TIME的值是7。
PASSWORD_LIFE_TIME代表口令過期時間,而PASSWORD_GRACE_TIME則代表口令過期后的寬恕時間。
口令過期但還未超過寬恕期時,登錄時會提醒你口令在多久后過期(這里的過期是指超過寬恕期),詢問你是否修改口令,可以不修改,然后正常登錄賬戶。
但是超過寬恕期再登錄,就無法登錄上去了。
oracle在這里的邏輯是這樣的,需要通過用戶的登錄來改變用戶的狀態。
舉個例子,假如PASSWORD_LIFE_TIME的值是1,PASSWORD_GRACE_TIME的值是也是1。
我在2020年4月7日10點整,創建了一個賬戶,在DBA_USERS表中,該賬戶的CREATED(創建時間)就是2020年4月7日10點,ACCOUNT_STATUS(賬戶狀態)是OPEN,在USER$表中該賬戶的PTIME(口令修改時間)也是2020年4月7日10點整。
在DBA_USERS表中,該賬戶的EXPIRY_DATE是PTIME+PASSWORD_LIFE_TIME的值,也就是2020年4月8日10點整。
(注意,在USER$表中也有一個EXPTIME字段,但是好像這個字段有時候不是實時的,需要用戶的登錄才會更新,比如現在,該字段就是一個空字符串)
那么,在到達2020年4月8日10點整后,這個賬戶的ACCOUNT_STATUS是不會自動變成EXPIRED(GRACE)(口令過期但還處于寬恕期內),只要你不登錄這個賬戶,那么該賬戶會一直處于OPEN狀態。哪怕是過了兩天,也就是超過PASSWORD_LIFE_TIME+PASSWORD_GRACE_TIME的值,仍然是OPEN狀態。
在2020年4月8日10點整后,登錄該賬戶,會更新賬戶的ACCOUNT_STATUS,更新成EXPIRED(GRACE),而EXPIRY_DATE也會更新,更新為登錄時間點+PASSWORD_GRACE_TIME的值。
同樣的,如果在這之后一直不登錄賬戶,則超過寬恕期后,賬戶的狀態還是EXPIRED(GRACE),只有等你嘗試登錄這個賬戶時,才會更新狀態值為EXPIRED,當然這個時候你也登錄不上了。
所以根據賬戶狀態值不同,EXPIRY_DATE代表的意思有所不同,狀態值為OPEN,則代表過期時間是什么時間。狀態值為EXPIRED(GRACE),則代表寬恕期結束是什么時間。
另外,更新PASSWORD_LIFE_TIME值,也會實時的更新賬戶的EXPIRY_DATE值,但是僅對處于OPEN狀態的賬戶有效。
如某賬戶為OPEN狀態,其EXPIRY_DATE值為2020年4月8日10點,此時將PASSWORD_LIFE_TIME更改為2,則EXPIRY_DATE值就變成2020年4月9日10點了。
但是如果該賬戶是處于EXPIRED(GRACE)狀態,修改PASSWORD_LIFE_TIME或PASSWORD_GRACE_TIME對它都是沒用的。
不知道為什么,SYS賬戶不受到口令過期的限制,我測試的時候確實是這樣。
可能是因為它屬于特殊賬戶?畢竟判斷是否過期也要去先讀取數據庫,而SYS賬戶可以在數據庫未開啟的時候連接它。
與口令過期間接相關的兩個參數:PASSWORD_REUSE_TIME和PASSWORD_REUSE_MAX
PASSWORD_REUSE_TIME:指定了口令在多少天內不能重用,單位為1天。
PASSWORD_REUSE_MAX:指定了當前口令在被重用之前需要更改幾次。
這里的重用是針對每個賬戶的自己的口令,如果不設置這兩個參數,設置賬戶新口令的時候就可以使用當前的口令,那么口令過期就不存在意義了。
這里光看說明是看是不太容易理解的,試一試就明白了:
在PASSWORD_REUSE_TIME、PASSWORD_REUSE_MAX均為默認值UNLIMITED的時候,修改口令的時候可以隨意重用,用當前的口令當新口令也都可以。
這里會突然想到verify_function_11G,如果新口令和舊口令一樣的話,應該通不過校驗的才對。
經過實驗,不知道是為什么old_password是空字符串,壓根就沒有傳值進來,所以實際上直接跳過了舊口令和新口令的對比校驗……
當PASSWORD_REUSE_TIME、PASSWORD_REUSE_MAX均非默認值UNLIMITED的時候,則需要兩個條件都滿足才可以更改口令。
如PASSWORD_REUSE_TIME從UNLIMITED變成1,以及PASSWORD_REUSE_MAX從UNLIMITED變成1開始,oracle開始記錄使用過的口令。
如某賬戶,這個時候依次設置新口令a、b、c、d、e,此時的口令是e,在1天內,該賬戶設置新口令的話,使用a、b、c、d、e中的任何一個都不可以。
超過1天后,a、b、c、d均可作為新口令,但是e不可以,因為PASSWORD_REUSE_MAX的值是1,相當于從e往前數,有1個口令不能被當做新口令,那就是e自己了。如果PASSWORD_REUSE_MAX的值是2,那么e、d均不可以作為新口令。
而如果PASSWORD_REUSE_TIME為unlimited、PASSWORD_REUSE_MAX為某個數值,或者PASSWORD_REUSE_TIME為某個數值,PASSWORD_REUSE_MAX為unlimited的時候,賬戶使用的口令都不能當做新口令進行設置。
所以為了滿足定期更換的要求,PASSWORD_REUSE_TIME、PASSWORD_REUSE_MAX都應該設置為非unlimited的值。
最后,不知道為什么,SYS賬戶也不受到這兩個參數的限制,可以隨意重用口令。
*本文作者:起于凡而非于凡,轉載請注明來自FreeBuf.COM
精彩推薦
總結
以上是生活随笔為你收集整理的oracle中prad函数_等保测评2.0:Oracle身份鉴别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 箱梁终张拉后弹性上拱度计算_高速铁路预应
- 下一篇: mysql 取最后一次登陆,获得最后一次