> 文档中心 > Oracle database 21c 新特性:密码逐步切换策略

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/pdb1alter user testuser1 identified by newpasswd1;

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

conn testuser1/testuser1@//localhost:1521/pdb1Connected.SQL>conn testuser1/newpasswd1@//localhost:1521/pdb1Connected.SQL>

相关视图

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

conn sys/SysPassword1@//localhost:1521/pdb1 as sysdbaselect account_status,to_char(password_change_date, 'dd-mon-yyyy hh24:mi:ss') as password_change_datefrom   dba_userswhere  username = 'TESTUSER1';ACCOUNT_STATUS PASSWORD_CHANGE_DATE-------------------------------- -----------------------------OPEN & IN ROLLOVER      21-nov-2021 19:22:43SQL>

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

column resource_name format a25column limit format a10select resource_name,limitfrom   dba_profileswhere  profile = 'PW_ROLLOVER_TIME_PROF'and    resource_name = 'PASSWORD_ROLLOVER_TIME';RESOURCE_NAME    LIMIT------------------------- ----------PASSWORD_ROLLOVER_TIME    1.5SQL>

禁用密码逐步切换功能

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

conn sys/SysPassword1@//localhost:1521/pdb1 as sysdbaalter 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 deniedWarning: You are no longer connected to ORACLE.SQL>

注意事项

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

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

conn sys/SysPassword1@//localhost:1521/pdb1 as sysdbaalter profile pw_rollover_time_prof limit  password_rollover_time 1.5;conn testuser1/newpasswd1@//localhost:1521/pdb1alter user testuser1 identified by newpasswd2;

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

conn testuser1/newpasswd1@//localhost:1521/pdb1Connected.SQL>conn testuser1/newpasswd2@//localhost:1521/pdb1Connected.SQL>

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

conn sys/SysPassword1@//localhost:1521/pdb1 as sysdbaalter 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/pdb1Connected.SQL>conn testuser1/newpasswd2@//localhost:1521/pdb1Connected.SQL>

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