在過去,更改資料庫密碼,總是會迫使應用程序必須暫時中止服務,

因為帳號的新舊密碼,總是無法共存一段時間,變更密碼後,帳號的舊密碼就立即停用,

而新密碼就馬上生效,這對業務持續的應用程序來說,中止服務只為了變更密碼,總會帶來一些困擾,

因此,在Oracle 19c 19.12的版本後,在Profile中導入了一個新的參數"PASSWORD_ROLLOVER_TIME",

來提供帳號新舊密碼的共存時間,提供了相對應的語法與view資訊,

除了CREATE PROFILE和ALTER PROFILE語句中的新子句PASSWORD_ROLLOVER_TIME之外,

ALTER USER語句還有一個新子句EXPIRE PASSWORD ROLLOVER PERIOD。

DBA_USERS和USER_USERS資料字典視圖的ACCOUNT_STATUS列具有幾個新狀態,

這些狀態指示值來顯示過渡狀態,

另外,通過查看Unified_audit_trail視圖的AUTHENTICATION_TYPE 列,

可以跟踪用戶以檢查他們使用的是舊密碼還是新密碼。


限制
無法為以下類型的連接啟用逐步數據庫密碼翻轉:
Oracle Real Application Security 用戶的直接登錄
基於 Kerberos、證書或 RADIUS 的外部身份驗證連接
集中管理的用戶 (CMU) 連接
使用外部密碼文件的管理連接
主數據庫和備用數據庫之間的 Oracle Data Guard 連接

 

要創建新的用戶配置文件:
SQL> CREATE PROFILE pwprofile LIMIT PASSWORD_ROLLOVER_TIME 1/24;

Profile created.

要更改現有用戶配置文件:
SQL> ALTER PROFILE existingProfile LIMIT PASSWORD_ROLLOVER_TIME 1;
 
Profile altered.

創建一個分配了新配置文件的新用戶:
SQL> CREATE USER newUser IDENTIFIED BY UserPassW__11 PROFILE pwprofile;
 
User created.
 
SQL> GRANT CREATE SESSION TO newUser;
 
Grant succeeded.

將配置文件分配給現有用戶:
SQL> ALTER USER existingUser PROFILE pwprofile;
 
User altered.

使用新創建的用戶登錄:
SQL> connect newUser/UserPassW__11@orclpdb
Connected.

更改用戶的密碼:
SQL> ALTER USER newUser IDENTIFIED BY UserPassW__22;
 
User altered

在 PASSWORD_ROLLOVER_TIME 定義的密碼翻轉週期內使用舊密碼或新密碼登錄都有效,
在我們的示例中為一小時:
SQL> connect newUser/UserPassW__11@orclpdb
Connected.
 
SQL> connect newUser/UserPassW__22@orclpdb
Connected.

查詢用戶的賬戶狀態:
SQL> SELECT account_status FROM dba_users WHERE username = 'NEWUSER';
 
ACCOUNT_STATUS
--------------------------------
OPEN & IN ROLLOVER

如果您在滾動期內再次更改密碼,則只有最新密碼和原始密碼(第一次更改前)有效。

提前結束滾動期:
SQL> ALTER USER newUser EXPIRE PASSWORD ROLLOVER PERIOD;
 
User altered.

現在,只有使用新密碼才能成功登錄:
SQL> connect newUser/UserPassW__11@orclpdb
ERROR:
ORA-01017: invalid username/password; logon denied
 
SQL> connect newUser/UserPassW__22@orclpdb
Connected.


帳戶狀態更改為 OPEN:
SQL> SELECT account_status FROM dba_users WHERE username = 'NEWUSER';
 
ACCOUNT_STATUS
--------------------------------
OPEN


通過查看Unified_audit_trail視圖的 AUTHENTICATION_TYPE 列,可以跟踪用戶以檢查他們使用的是舊密碼還是新密碼:
SQL> select * from unified_audit_trail where action_name='LOGON' and authentication_type like '%VERIFIER=12C-OLD%' and event_timestamp>systimestamp-1;
 
AUTHENTICATION_TYPE
----------------------------------------------------------
...(LOGON_INFO=((VERIFIER=12C-OLD)(CLIENT_CAPABILITIES=...
 
SQL> select * from unified_audit_trail where action_name='LOGON' and authentication_type like '%VERIFIER=12C-NEW%' and event_timestamp>systimestamp-1;
 
AUTHENTICATION_TYPE
----------------------------------------------------------
...(LOGON_INFO=((VERIFIER=12C-NEW)(CLIENT_CAPABILITIES=...


ref:
https://docs.oracle.com/en/database/oracle/oracle-database/21/dbseg/configuring-authentication.html#GUID-ACBA8DAE-C5B4-4811-A31D-53B97C50249B

https://database-heartbeat.com/2021/07/27/having-two-valid-database-user-passwords-at-the-same-time/

https://docs.oracle.com/en/database/oracle/oracle-database/19/newft/gradual-database-password-rollover-applications.html

arrow
arrow
    文章標籤
    oracle
    全站熱搜

    噗噗噗的潛水珽 發表在 痞客邦 留言(0) 人氣()