rollover

Alteração de senhas no Oracle sem derrubar a aplicação

A alteração de senhas de usuários de aplicação em um banco de dados pode ser uma tarefa complexa, onde precisamos agendar uma janela de indisponibilidade com o time de aplicação. O principal motivo disso é que ao alterarmos a senha do usuário, a antiga senha passa a ser rejeitada pelo Oracle e a nova senha passa a ser válida.

Bom, isso é verdade em partes. A partir da versão 19.12 do Oracle, temos a opção de utilizar o PASSWORD_ROLLOVER_TIME para alterar este comportamento. Vamos entender aqui como ele funciona.

Sobre o PASSWORD_ROLLOVER_TIME

O PASSWORD_ROLLOVER_TIME é um parâmetro de senha adicionado aos profiles a partir da versão 19.12 do Oracle, que permite a troca gradual de senhas de usuário. Neste parâmetro configuramos uma quantidade, em dias, que a antiga senha permanece válida após a troca da senha do usuário. Traduzindo, temos um período de tempo no qual o usuário da aplicação consegue logar no banco de dados utilizando tanto a senha antiga quanto a nova:

Fonte: Autoria própria

A grande vantagem aqui é que a aplicação pode fazer a alteração para a nova senha em qualquer momento durante a janela do PASSWORD_ROLLOVER_TIME, e utilizar de meios de deploy que não afetem a disponibilidade da aplicação, como o blue green ou o canary deploy.

Alteração de senha com PASSWORD_ROLLOVER_TIME

Aqui vamos fazer a implementação do PASSWORD_ROLLOVER_TIME e demonstrar como ele funciona. Vou estar utilizando um ambiente com a versão 19.20 do Oracle Database para demonstrar o processo, mas qualquer ambiente acima da 19.12 terá os mesmos resultados.

Iniciamente vou criar um profile, onde quero que o PASSWORD_ROLLOVER_TIME seja de 7 dias e adicionar um novo usuário ao banco, utilizando este profile:

$ sqlplus sys@pdb as sysdba

SQL*Plus: Release 19.0.0.0.0 - Production on Thu May 1 15:15:13 2025
Version 19.20.0.0.0

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

Enter password:

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.20.0.0.0

SQL> CREATE PROFILE rollover LIMIT PASSWORD_ROLLOVER_TIME 7;

Profile created.

SQL> CREATE USER rollover_app IDENTIFIED BY "senha_inicial" PROFILE rollover;

User created.

SQL> GRANT CREATE SESSION TO rollover_app;

Grant succeeded.

SQL> SET LINES WINDOW
SQL> COL USERNAME FOR A15
SQL> SELECT USERNAME, ACCOUNT_STATUS FROM DBA_USERS WHERE USERNAME='ROLLOVER_APP';

USERNAME        ACCOUNT_STATUS                  
--------------- --------------------------------
ROLLOVER_APP    OPEN                            

Agora, vamos alterar a sua senha:

SQL> ALTER USER rollover_app IDENTIFIED BY "senha_nova";

User altered.

SQL> SELECT USERNAME, ACCOUNT_STATUS, PASSWORD_CHANGE_DATE FROM DBA_USERS WHERE USERNAME='ROLLOVER_APP';

USERNAME        ACCOUNT_STATUS                   PASSWORD_
--------------- -------------------------------- ---------
ROLLOVER_APP    OPEN & IN ROLLOVER               01-MAY-25

SQL> COL LIMIT FOR A35
SQL> SELECT RESOURCE_NAME, LIMIT FROM DBA_PROFILES WHERE PROFILE='ROLLOVER' AND RESOURCE_NAME='PASSWORD_ROLLOVER_TIME';

RESOURCE_NAME                    LIMIT
-------------------------------- -----------------------------------
PASSWORD_ROLLOVER_TIME           604800

O status OPEN & IN ROLLOVER indica que o usuário está com a sua senha no período de rollover e está aceitando as duas senhas. A coluna PASSWORD_CHANGE_DATE nos mostra quando foi feita a última alteração de senha, e a consulta da view DBA_PROFILES nos mostra o tempo, em segundos, do PASSWORD_ROLLOVER_TIME.

Neste momento podemos verificar que o usuário consegue se conectar ao banco utilizando as duas senhas:

SQL> conn rollover_app/senha_inicial@pdb
Connected.

SQL> conn rollover_app/senha_nova@pdb
Connected.

Ressalvas

A troca de senhas gradual através do PASSWORD_ROLLOVER_TIME foi desenvolvida pensando principalmente em usuários de aplicação, e não é válida para usuários administrativos do banco de dados. Por exemplo, caso eu tente adicionar um privilégio administativo ao usuário com PASSWORD_ROLLOVER_TIME configurado, recebo o erro ORA-28227:

SQL> conn sys@pdb as sysdba
Enter password:
Connected.
SQL> GRANT SYSDBA TO rollover_app;
GRANT SYSDBA TO rollover_app
*
ERROR at line 1:
ORA-28227: Gradual password rollover is not supported for administrative users.

Além desta, existem algumas outras restrições mais específicas na documentação, que estarei deixando nas referências do final do post.

Conclusão

A alteração de senhas de usuários de aplicação de maneira recorrente é uma das várias práticas de segurança para deixar o banco de dados mais seguro. Com a implementação do PASSWORD_ROLLOVER_TIME no profile do usuário de aplicação, essa rotatividade se torna mais simples, uma vez que não precisamos mais ter downtime ao realizar as trocas de senhas.

Abaixo as referências utilizadas:

Publicar comentário