修改sec_case_sensitive_logon参数,导致ORA-01017,用户无法通过密码登录数据库

发布时间 2023-07-03 07:37:25作者: 石云华

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参数的值。