Oracle19C关于参数sec_case_sensitive_logon控制密码大小写敏感问题
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)