• 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    创建密码逐步切换配置

    创建一个信息的配置项,将 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    alter profile pw_rollover_time_prof limit
      password_rollover_time 1.5;
    
    • 1
    • 2

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

    测试连接

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

    conn testuser1/testuser1@//localhost:1521/pdb1
    
    alter user testuser1 identified by newpasswd1;
    
    • 1
    • 2
    • 3

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

    conn testuser1/testuser1@//localhost:1521/pdb1
    Connected.
    SQL>
    
    conn testuser1/newpasswd1@//localhost:1521/pdb1
    Connected.
    SQL>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    相关视图

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    禁用密码逐步切换功能

    如果将 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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注意事项

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

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

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    conn testuser1/newpasswd1@//localhost:1521/pdb1
    Connected.
    SQL>
    
    conn testuser1/newpasswd2@//localhost:1521/pdb1
    Connected.
    SQL>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    将 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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    conn testuser1/newpasswd1@//localhost:1521/pdb1
    Connected.
    SQL>
    
    conn testuser1/newpasswd2@//localhost:1521/pdb1
    Connected.
    SQL>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

  • 相关阅读:
    vue课程75 axios是只专注于网络请求的库
    类和对象(中下)
    LeetCode算法题解(回溯)|LeetCode93. 复原 IP 地址、LeetCode78. 子集、LeetCode90. 子集 II
    Maven 生命周期,仓库概念和打包命令区别(package、install、deploy)
    C语言常见面经详细总结
    四十九、Hadoop HA部署(MINI版)
    macOS端React的项目WebPack热更新(HMR)失效问题分析及解决,原因竟是Windows文件系统不区分大小写导致
    数字驱动的品牌重塑战略对您公司的重要意义
    漏洞简述-漏洞分析实例是编号CVE-2006-3439
    PyTorch中的CPU和GPU代码实现详解
  • 原文地址:https://blog.csdn.net/horses/article/details/121511672