Oracle database 21c 新特性:密码逐步切换策略

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle database 21c 新特性:密码逐步切换策略相关的知识,希望对你有一定的参考价值。

大家好,我是只谈技术不剪发的 Tony 老师。

定期修改数据库用户密码可能会导致应用程序的中断。通常我们需要计划停机时间,修改数据库用户密码,接着修改应用服务器中的连接信息,最后重新启动应用程序。

不过,从 Oracle 21c 开始,我们可以定义一个密码切换的过渡时间,在这个时间段内可以同时使用旧密码和新密码连接数据库。这意味着我们可以修改数据库密码,但是应用程序不需要断开并重新建立连接。该特性不仅在 Oracle 21c 中可用,同时也向前移植到了 Oracle 19c(19.12 补丁更新)中。

创建测试用户

首先,使用特权用户连接数据库并创建一个测试用户:

conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba

--drop user testuser1 cascade;

create user testuser1 identified by testuser1 quota unlimited on users;
grant connect, resource to testuser1;

创建密码逐步切换配置

创建一个信息的配置项,将 PASSWORD_ROLLOVER_TIME 设置为 1 天,然后将它和测试用户关联:

-- drop profile pw_rollover_time_prof;

create profile pw_rollover_time_prof limit
  password_rollover_time 1;

alter user testuser1 profile pw_rollover_time_prof;

我们也可以使用 ALTER PROFILE 命令修改已有配置项中的 PASSWORD_ROLLOVER_TIME 限制。以下示例将过渡时间修改为 1.5 天:

alter profile pw_rollover_time_prof limit
  password_rollover_time 1.5;

PASSWORD_ROLLOVER_TIME 允许的最小值为 1小时(1、24),最大值为 60 天。

测试连接

我们使用测试用户连接数据库并重置密码:

conn testuser1/testuser1@//localhost:1521/pdb1

alter user testuser1 identified by newpasswd1;

在接下来的 1.5 天内,我们可用同时使用旧密码和新密码连接数据库。

conn testuser1/testuser1@//localhost:1521/pdb1
Connected.
SQL>

conn testuser1/newpasswd1@//localhost:1521/pdb1
Connected.
SQL>

相关视图

DBA_USERS 视图中增加了一个 PASSWORD_CHANGE_DATE 字段,以及标识用户是否处于切换密码的过渡状态的 ACCOUNT_STATUS 字段。以下查询返回了账号 TESTUSER1 的状态:

conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba

select account_status,
       to_char(password_change_date, 'dd-mon-yyyy hh24:mi:ss') as password_change_date
from   dba_users
where  username = 'TESTUSER1';

ACCOUNT_STATUS                   PASSWORD_CHANGE_DATE
-------------------------------- -----------------------------
OPEN & IN ROLLOVER               21-nov-2021 19:22:43

SQL>

PASSWORD_ROLLOVER_TIME 的值可用通过 DBA_PROFILES 视图查看:

column resource_name format a25
column limit format a10

select resource_name,
       limit
from   dba_profiles
where  profile = 'PW_ROLLOVER_TIME_PROF'
and    resource_name = 'PASSWORD_ROLLOVER_TIME';

RESOURCE_NAME             LIMIT
------------------------- ----------
PASSWORD_ROLLOVER_TIME    1.5

SQL>

禁用密码逐步切换功能

如果将 PASSWORD_ROLLOVER_TIME 设置为 0,可用禁用密码逐步切换功能。在以下示例中,我们将该值设置为 0,然后就无法使用旧密码登录数据库:

conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba

alter profile pw_rollover_time_prof limit
  password_rollover_time 0;

conn testuser1/testuser1@//localhost:1521/pdb1
  USER          = testuser1
  URL           = jdbc:oracle:oci8:@//localhost:1521/pdb1
  Error Message = no ocijdbc21 in java.library.path
  USER          = testuser1
  URL           = jdbc:oracle:thin:@//localhost:1521/pdb1
  Error Message = ORA-01017: invalid username/password; logon denied

Warning: You are no longer connected to ORACLE.
SQL>

注意事项

如果我们需要在紧急情况下禁用密码逐步切换功能并重新设置该功能,必须确保在这两个操作之间执行一次登录操作,否则结果可能不是我们预期的行为。

我们首先重置过渡时间并再次修改密码。

conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba

alter profile pw_rollover_time_prof limit
  password_rollover_time 1.5;

conn testuser1/newpasswd1@//localhost:1521/pdb1

alter user testuser1 identified by newpasswd2;

此时,我们可以使用任意一个新密码登录。

conn testuser1/newpasswd1@//localhost:1521/pdb1
Connected.
SQL>

conn testuser1/newpasswd2@//localhost:1521/pdb1
Connected.
SQL>

将 PASSWORD_ROLLOVER_TIME 设置为 0 后立即将它改回 1.5 天,期间没有新的连接。

conn sys/SysPassword1@//localhost:1521/pdb1 as sysdba

alter profile pw_rollover_time_prof limit
  password_rollover_time 0;

alter profile pw_rollover_time_prof limit
  password_rollover_time 1.5;

由于这两个修改操作之间没有新的连接,我们仍然可以使用任何一个密码登录。

conn testuser1/newpasswd1@//localhost:1521/pdb1
Connected.
SQL>

conn testuser1/newpasswd2@//localhost:1521/pdb1
Connected.
SQL>

如果觉得文章有用,欢迎关注❤️、评论📝、点赞👍!

以上是关于Oracle database 21c 新特性:密码逐步切换策略的主要内容,如果未能解决你的问题,请参考以下文章

[译] Oracle Database 21c 中的 Attention 日志

移植到Oracle 19c中的21c功能

移植到Oracle 19c中的21c功能

Oracle Database 21c 分析函数增强

Oracle Database 21c 分析函数增强

[译] Data Guard:Oracle Database 21c 中的 PREPARE DATABASE FOR DATA GUARD 命令