Oracle19C關於參數sec_case_sensitive_logon控制密碼大小寫敏感問題
該參數在Oracle11G開始推出,目的是為了控制密碼大小寫敏感問題,可以無需重啟數據庫實例的情況下設置后直接生效。
如果sec_case_sensitive_logon=true表示區分大小寫,這個是默認值。sec_case_sensitive_logon=false表示不區分大小寫。
但是,在12C以后逐漸廢棄該參數,不過為了兼容依舊可以使用,直到19C情況同樣如此。
更高版本的沒有做過測試,情況未知。
PS:不考慮user$.spare4的修改實驗,對於數據字典表或者系統基表之類的DML在沒有Oracle官方技術支持下不建議用於生產庫。出於研究鑽研的目的的話可以在自己虛擬機等環境做實驗。
值得注意一點的就是,sec_case_sensitive_logon=false和SQLNET.ALLOWED_LOGON_VERSION_SERVER=12或者SQLNET.ALLOWED_LOGON_VERSION_SERVER=12a不兼容。這是因為用於此模式的更安全的密碼版本僅支持區分大小寫的密碼檢查。
從密碼版本看,需要密碼版本包含10G。
是的,密碼也是有版本的,視圖dba_users就有字段password_versions可以查詢。
密碼版本的值有10G,11G,12C,由SQLNET.ALLOWED_LOGON_VERSION_SERVER控制。
10G
指早期不區分大小寫的 Oracle 密碼版本,11G
指基於 SHA-1 的密碼版本,12C
指基於 SHA-2 的 SHA-512 密碼版本。
注意密碼版本和平時說的DataBase版本不是一個概念。
另外,引用官檔的一段話如下:點擊這里看原文
如果 SQLNET.ALLOWED_LOGON_VERSION_SERVER 參數設置為 12 或 12a,請確保 SEC_CASE_SENSITIVE_LOGON 參數未設置為 FALSE。這是因為用於此模式的更安全的密碼版本僅支持區分大小寫的密碼檢查。
出於兼容性原因,當 SQLNET.ALLOWED_LOGON_VERSION_SERVER 設置為 12 或 12a 時,Oracle 數據庫不會阻止對 SEC_CASE_SENSITIVE_LOGON 使用 FALSE。
當 SQLNET.ALLOWED_LOGON_VERSION_SERVER 設置為 12 或 12a 時,將 SEC_CASE_SENSITIVE_LOGON 設置為 FALSE 會導致所有帳戶無法訪問。
如果 SQLNET.ALLOWED_LOGON_VERSION_SERVER 設置為 11 或更低的值,那么 Oracle 建議您將 SEC_CASE_SENSITIVE_LOGON 設置為 TRUE,因為在 Oracle Database 12c 中獨占模式下使用的更安全的密碼版本(當 SQLNET.ALLOWED_LOGON_VERSION_SERVER 為 12 或 12a 時)不區分大小寫的密碼匹配。
盲目將sec_case_sensitive_logon設置為false會導致登錄報ORA-01017錯誤。
以19C數據庫為例子,默認情況下產生的密碼版本值為“11G 12C”,這是因為默認的SQLNET.ALLOWED_LOGON_VERSION_SERVER=12。
SQL> select BANNER_FULL from v$version; BANNER_FULL -------------------------------------------------------------------------------- Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> select distinct password_versions from dba_users; PASSWORD_VERSIONS ----------------- 11G 12C SQL> show pdbs CON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ---------- 2 PDB$SEED READ ONLY NO 3 PDB READ WRITE NO SQL> alter session set container=pdb; Session altered. SQL> create user zkm identified by oracle; User created. SQL> select password_versions from dba_users where username='ZKM'; PASSWORD_VERSIONS ----------------- 11G 12C
將sec_case_sensitive_logon設置為false后,
SQL> grant resource,connect to zkm; Grant succeeded. SQL> exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 [oracle@oracle19c ~]$ sqlplus zkm/oracle@oracle19c/pdb ----此時可以正常登錄 SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 11 09:32:49 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> exit [oracle@oracle19c ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 11 09:33:14 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> alter system set sec_case_sensitive_logon=false sid='*' scope=both; System altered. SQL> alter session set container=pdb; Session altered. SQL> show parameter case NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ sec_case_sensitive_logon boolean FALSE SQL> exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 [oracle@oracle19c ~]$ sqlplus zkm/oracle@oracle19c/pdb SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 11 09:34:07 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. ERROR: ORA-01017: invalid username/password; logon denied Enter user-name:
需要在數據庫版本12C以后不區分密碼大小寫,即sec_case_sensitive_logon=false生效,需要使得用戶的密碼版本包含10G這個身份驗證協議。
前邊提到過,密碼版本通過SQLNET.ALLOWED_LOGON_VERSION_SERVER控制,下邊是SQLNET.ALLOWED_LOGON_VERSION_SERVER的值對Password Version的影響表:
SQLNET.ALLOWED_LOGON_VERSION_SERVER設置 | 8 | 11 | 12 | 12a |
---|---|---|---|---|
服務器以獨占模式運行? |
不 |
不 |
是的 |
是的 |
生成10G密碼版本? |
是的 |
是的 |
不 |
不 |
生成11G密碼版本? |
是的 |
是的 |
是的 |
不 |
生成12C密碼版本? |
是的 |
是的 |
是的 |
是的 |
這里引用Oracle19C官方文檔的一段話:原文點擊這里
默認情況下,Oracle 數據庫使用不允許不區分大小寫的密碼的獨占模式來管理密碼版本。
在默認安裝中,該
SQLNET.ALLOWED_LOGON_VERSION_SERVER
參數設置12
為啟用獨占模式。獨占模式要求基於密碼的身份驗證協議對要進行身份驗證的帳戶使用區分大小寫的密碼版本 (11G
或12C
) 之一。獨占模式不使用
10G
早期版本中使用的密碼版本。升級到 Oracle Database 12 c 第2 版 (12.2) 后,使用10G
密碼版本的帳戶將無法訪問。出現這種情況是因為服務器默認以獨占模式運行,獨占模式無法使用舊10G
密碼版本對客戶端進行身份驗證。服務器沒有用於驗證客戶端的密碼版本。版本 10 g 中的用戶帳戶使用
10G
密碼版本。因此,您應該找到使用10G
密碼版本的用戶帳戶,然后為這些帳戶重置密碼。這將根據SQLNET.ALLOWED_LOGON_VERSION_SERVER
參數的設置生成適當的密碼版本,如下所示:
SQLNET.ALLOWED_LOGON_VERSION_SERVER=8
產生這三個密碼版本10G
,11G
和12C
。
SQLNET.ALLOWED_LOGON_VERSION_SERVER=12
生成11G
和12C
密碼版本,並刪除10G
密碼版本。
SQLNET.ALLOWED_LOGON_VERSION_SERVER=12a
僅生成12C
密碼版本。
因此,需要在oracle用戶下創建或修改文件sqlnet.ora的ALLOWED_LOGON_VERSION_SERVER值為11或者8(推薦為8),如下:
vi $ORACLE_HOME/network/admin/sqlnet.ora SQLNET.ALLOWED_LOGON_VERSION_SERVER=11
再次驗證:
[oracle@oracle19c admin]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 11 10:32:03 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> alter session set container=pdb; Session altered. SQL> create user value11 identified by oracle; User created. SQL> select password_versions from dba_users where username='VALUE11'; PASSWORD_VERSIONS ----------------- 10G 11G 12C SQL> grant resource,connect to value11; Grant succeeded. SQL> alter session set container=cdb$root; Session altered. SQL> alter system set sec_case_sensitive_logon=false sid='*' scope=both; System altered. SQL> exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 [oracle@oracle19c admin]$ sqlplus value11/oracle@oracle19c/pdb SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 11 10:33:51 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> exit Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 [oracle@oracle19c admin]$ sqlplus value11/OrAcLe@oracle19c/pdb --使用大小寫混合的密碼成功登錄 SQL*Plus: Release 19.0.0.0.0 - Production on Thu Nov 11 10:37:36 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Last Successful login time: Thu Nov 11 2021 10:33:51 +08:00 Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL>
關於密碼大小寫的至此。
關於低版本客戶端連接高版本客戶端有一個非常常見的錯誤ORA-28040: No matching authentication protocol。
這里的概念有些混亂,比如SQLNET.ALLOWED_LOGON_VERSION_SERVER影響着dba_users.password_versions的值,同時也表示設置連接到 Oracle 數據庫實例時允許的最低身份驗證協議。
而SQLNET.ALLOWED_LOGON_VERSION_CLIENT表示設置客戶端允許的最低身份驗證協議,以及當服務器充當客戶端時,例如通過數據庫鏈接進行連接,以及連接到 Oracle 數據庫實例時。這個就搞不懂了。
參考文檔
官方文檔-管理密碼區分大小寫
官方文檔-SQLNET.ALLOWED_LOGON_VERSION_SERVER
11gR1 New Feature Case-Sensitive Passwords and Strong User Authentication (文檔 ID 429465.1)