Gradual Password Rollover: Troque Senhas no Oracle sem Indisponibilidade


Um simples processo de troca de senha no banco de dados pode gerar uma grande dor de cabeça em ambientes com várias aplicações, integrações, database links, jobs, etc. Uma vez que essas aplicações vão apresentar falha de conexão até que tenham suas credenciais atualizadas e isso nem sempre é um processo muito rápido.

A partir do Oracle 19.12 foi disponibilizado o gradual database rollover time, uma feature que possibilita uma troca de senha com um menor impacto, permitindo que a senha anterior e a nova senha coexistam por um período controlado. Assim as aplicações pode ter suas credenciais ajustadas de forma gradativa sem impacto.

Em uma troca tradicional de senha, o DBA altera a senha no banco de dados com o comando:

ALTER USER usuario IDENTIFIED BY nova_senha;  

A partir do momento que o comando é executado, novas conexões que tentam utilizar a senha anterior passarão a apresentar falha através do erro ORA-01017: invalid username/password.

Com o gradual database password rollover, a troca da senha ocorre em "etapas". 

  1. Senha antiga válida
    1. Alteração da senha
  2. Senha antiga + senha nova válidas
    1. Durante esse período os clients devem ter suas credenciais ajustada
  3. Somente a nova senha é válida
O período começa no momento em que a senha do usuário é alterada, desde que o profile associado possua um valor diferente de zero para PASSWORD_ROLLOVER_TIME. Durante esse intervalo, novas conexões podem utilizar tanto a senha anterior quanto a nova.

O parâmetro PASSWORD_ROLLOVER_TIME no profile deve ser informado em dias, podem receber o valor mínimo de uma hora 1/24 e máximo de 60 dias.

Nesta simulação, estarei criando um profile dedicado chamado app_rollover_profile e definindo o PASSWORD_ROLLOVER_TIME  para 1 hora. Na sequencia será criado o usuário app_rollover setando este profile criado.

SQL> show pdbs;

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 LAMIMPDB                       READ WRITE NO
SQL> alter session set container=LAMIMPDB;

Session altered.

SQL> CREATE PROFILE app_rollover_profile
LIMIT
    PASSWORD_ROLLOVER_TIME 1/24;  2    3

Profile created.

SQL> 
SQL> SET LINESIZE 160
SQL> COLUMN profile FORMAT A30
SQL> COLUMN resource_name FORMAT A35
SQL> COLUMN limit FORMAT A20
SQL> SELECT profile, resource_name, resource_type, limit FROM dba_profiles WHERE profile = 'APP_ROLLOVER_PROFILE' AND resource_name IN ( 'PASSWORD_ROLLOVER_TIME', 'PASSWORD_LIFE_TIME', 'PASSWORD_GRACE_TIME', 'FAILED_LOGIN_ATTEMPTS', 'PASSWORD_LOCK_TIME', 'PASSWORD_VERIFY_FUNCTION' ) ORDER BY resource_name;

PROFILE                        RESOURCE_NAME                       RESOURCE LIMIT
------------------------------ ----------------------------------- -------- --------------------
APP_ROLLOVER_PROFILE           FAILED_LOGIN_ATTEMPTS               PASSWORD DEFAULT
APP_ROLLOVER_PROFILE           PASSWORD_GRACE_TIME                 PASSWORD DEFAULT
APP_ROLLOVER_PROFILE           PASSWORD_LIFE_TIME                  PASSWORD DEFAULT
APP_ROLLOVER_PROFILE           PASSWORD_LOCK_TIME                  PASSWORD DEFAULT
APP_ROLLOVER_PROFILE           PASSWORD_ROLLOVER_TIME              PASSWORD 3600
APP_ROLLOVER_PROFILE           PASSWORD_VERIFY_FUNCTION            PASSWORD DEFAULT

6 rows selected.

SQL> CREATE USER app_rollover IDENTIFIED BY "Lab#Old_19c!" PROFILE app_rollover_profile;

User created.

SQL> GRANT CREATE SESSION TO app_rollover;

Grant succeeded.

Agora irei validar a conexão do usuário criado e na sequencia trocaremos a senha do mesmo para que seja iniciado o processo de rollover.

[oracle@db19c ~]$ sqlplus app_rollover/"Lab#Old_19c!"@LAMIMPDB

SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jul 21 23:24:47 2026
Version 19.31.0.0.0

Copyright (c) 1982, 2026, Oracle.  All rights reserved.


Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.31.0.0.0

SQL> show user;
USER is "APP_ROLLOVER"
SQL>

Troca da senha. O rollover começa a contar no momento desta alteração.

SQL> alter session set container=LAMIMPDB;

Session altered.

SQL>  ALTER USER app_rollover IDENTIFIED BY "Lab#New_19c!";

User altered.

SQL>

É possível validar o estado do rollover consultando o account_status da dba_users;

SQL> set lines 210
SQL> col username for a45
SQL> col profile for a60
SQL> SELECT username, account_status, profile FROM dba_users WHERE username = 'APP_ROLLOVER';

USERNAME                                      ACCOUNT_STATUS                   PROFILE
--------------------------------------------- -------------------------------- ------------------------------------------------------------
APP_ROLLOVER                                  OPEN & IN ROLLOVER               APP_ROLLOVER_PROFILE

SQL>

Agora vamos testar uma conexão com a senha antiga e com a nova senha para comprovar que as duas estarão válidas durante o período do rollover.

SQL> conn app_rollover/"Lab#Old_19c!"@LAMIMPDB
Connected.
SQL> show user;
USER is "APP_ROLLOVER"
SQL> conn app_rollover/"Lab#New_19c!"@LAMIMPDB
Connected.
SQL> show user;
USER is "APP_ROLLOVER"
SQL>

Para finalizar antecipadamente o processo de rollover basta executar uma alteração do profile para EXPIRE PASSWORD ROLLOVER PERIOD, conforme exemplo abaixo.

SQL> alter session set container=LAMIMPDB;

Session altered.

SQL> set lines 210
SQL> col username for a45
SQL> col profile for a60
SQL>  SELECT username, account_status, profile FROM dba_users WHERE username = 'APP_ROLLOVER';

USERNAME                                      ACCOUNT_STATUS                   PROFILE
--------------------------------------------- -------------------------------- ------------------------------------------------------------
APP_ROLLOVER                                  OPEN & IN ROLLOVER               APP_ROLLOVER_PROFILE

SQL> ALTER USER app_rollover EXPIRE PASSWORD ROLLOVER PERIOD;

User altered.

SQL> SELECT username, account_status, profile FROM dba_users WHERE username = 'APP_ROLLOVER';

USERNAME                                      ACCOUNT_STATUS                   PROFILE
--------------------------------------------- -------------------------------- ------------------------------------------------------------
APP_ROLLOVER                                  OPEN                             APP_ROLLOVER_PROFILE

SQL>
SQL> conn app_rollover/"Lab#New_19c!"@LAMIMPDB
Connected.
SQL> show user;
USER is "APP_ROLLOVER"
SQL> conn app_rollover/"Lab#Old_19c!"@LAMIMPDB
ERROR:
ORA-01017: invalid username/password; logon denied


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

O Gradual Database Password Rollover resolve um problema operacional comum: coordenar a troca de uma senha compartilhada por várias instâncias de aplicação sem interromper imediatamente as conexões que ainda utilizam a credencial anterior.

A simplicidade dos comandos não elimina a necessidade de planejamento. Quando empregado com uma janela curta, monitoração adequada e um procedimento de contingência, o recurso permite realizar rotações de credenciais com menor risco de indisponibilidade e maior controle operacional.

Managing Gradual Database Password Rollover for Applications

Comentários