修改sec_case_sensitive_logon参数,导致ORA-01017,用户无法通过密码登录数据库
1. 一套19.19的数据库,设置了一些数据库参数(alter system set sec_case_sensitive_logon=false scope=both sid='*';)后,发现刚刚创建的数据库用户,无法登录数据库。
SQL> create user mm identified by mm; User created.
SQL> grant dba to mm; Grant succeeded.
SQL> create user test identified by test; User created.
SQL> grant dba to test; Grant succeeded.
SQL> conn test/test ERROR: ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE. SQL> |
这是由于Oracle 12.2中新的基于密码的鉴权独占模式(默认已经生效)与不区分大小写的密码配置冲突,导致12.2及以后的版本中,所有的数据库用户都无法通过密码认证的方式登录数据库。升级到12.2后,如果sec_case_sensitive_logon实例初始化参数设置为FALSE,则可能导致所有帐户无法通过密码访问数据库,因为在12.2中默认是基于密码的鉴权独占模式。
2.“密码的鉴权独占模式” 和 “使用不区分大小写的密码” 这两个设置同时生效时,会造成所有用户无法通过密码连接数据库。
设置1:
服务器配置为使用不区分大小写的密码。也即将数据库参数sec_case_sensitive_logon设置成FALSE。
设置2:
服务器配置为基于密码的鉴权独占模式。密码的鉴权独占模式,由SQLNET.ORA文件中的SQLNET.ALLOWED_LOGON_VERSION_SERVER参数进行控制,当SQLNET.ALLOWED_LOGON_VERSION_SERVER参数值未修改成11或者更小的值,或者在SQLNET.ORA文件中没有SQLNET.ALLOWED_LOGON_VERSION_SERVER参数时(未设置该参数时,则该参数值为数据库的版本),则表示密码的鉴权独占模式已经开启。
3. 解决方案:
为了解决参数设置之间的冲突,导致数据库用户无法登录数据库的故障,在数据库升级到12.2及以上的版本时,先执行如下方案之一。
方案1:
删除sec_case_sensitive_logon参数,或者将sec_case_sensitive_logon 参数设置成TRUE。该参数是一个废弃的参数,也许以后的版本中,该参数将不会存在。
方案2:
将SQLNET.ORA文件中的SQLNET.ALLOWED_LOGON_VERSION_SERVER参数设置成一个相对宽松的值。例如:SQLNET.ALLOWED_LOGON_VERSION_SERVER=10,如果使用此选项,还需要再次更改用户密码,以便DBA_USERS视图中的PASSWORD_VERSIONS列将得到一个10G的值。
4. 测试验证
4.1 模拟故障
SQL> select username, created , account_status, password_versions from dba_users order by 2
USERNAME CREATED ACCOUNT_STATUS PASSWORD_VERSIONS ------------------------------ ------------------- -------------------------------- ----------------- SYS 2019-04-17 00:56:32 OPEN 11G 12C SYSTEM 2019-04-17 00:56:33 OPEN 11G 12C ...... MM 2023-07-02 20:47:57 OPEN 11G 12C TEST 2023-07-02 20:48:16 OPEN 11G 12C
37 rows selected.
SQL> conn test/test ERROR: ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE. |
4.2 配置方案2
cat >> $ORACLE_HOME/network/admin/sqlnet.ora <<EOF
SQLNET.ALLOWED_LOGON_VERSION_SERVER=10
SQLNET.ALLOWED_LOGON_VERSION_CLIENT=8
EOF
4.3 验证
SQL> conn / as sysdba Connected. SQL> alter user test identified by test;
User altered.
SQL> SQL> select username, created , account_status, password_versions from dba_users;
USERNAME CREATED ACCOUNT_STATUS PASSWORD_VERSIONS ------------------------------ ------------------- -------------------------------- ----------------- SYS 2019-04-17 00:56:32 OPEN 11G 12C SYSTEM 2019-04-17 00:56:33 OPEN 11G 12C ...... TEST 2023-06-29 18:07:31 OPEN 10G 11G 12C
37 rows selected.
SQL> conn test/test Connected. SQL>
|
可以看出,通过选项2,可以解决这个故障。
5. sec_case_sensitive_logon参数在新的数据库版本中已经废弃,针对该故障,建议使用方案1,也即还原sec_case_sensitive_logon参数的值。