ampulheta

Resolvendo o ORA-28001 sem alterar a senha do usuário

O erro ORA-28001: The account has expired acontece quando a senha do usuário expira de acordo com a política de tempo de vida de senha (PASSWORD_LIFE_TIME) configurada no profile do usuário. O valor padrão para este tempo de vida é de 180 dias (6 meses), e caso não configurado adequadamente, pode impactar sistemas produtivos com a senha expirando, e impedindo a comunicação da aplicação com o banco de dados.

Esse problema pode ser resolvido alterando a senha do usuário, porém essa abordagem não é possível em alguns casos, pois a aplicação necessita de um novo deploy para conseguir usar a nova senha. Nesses casos, precisamos setar a mesma senha, para que a aplicação possa se conectar normalmente. Abaixo demonstro como podemos fazer esse processo mesmo sem ter a senha do usuário, utilizando as tabelas internas do Oracle.

A solução

Para resolver o ORA-28001, usamos da tabela interna sys.user$, que contém informações sobre os usuários do banco. Para gerar o comando de alteração de senha, utilizando a senha expirada, podemos executar a consulta:

select 'alter user ' || name || ' identified by values ''' || password || ''' account unlock;' 
from sys.user$
where name like 'MYUSER%';

A coluna name armazena o nome do usuário e a coluna password o hash da senha atual. Também podemos fazer o filtro da consulta usando a coluna astatus, que assume o valor de 1 quando a senha está expirada:

select 'alter user ' || name || ' identified by values ''' || password || ''' account unlock;' 
from sys.user$
where astatus = 1;

Executando o comando retornado pela consulta irá atualizar a senha, com a senha antiga, e o usuário conseguirá se conectar normalmente. Caso seja necessário, também podemos atualizar o profile do usuário, usando:

ALTER PROFILE my_profile LIMIT PASSWORD_LIFE_TIME UNLIMITED;

Essa alteração faz com que a senha não expire mais.

Conclusão

Embora essa abordagem evite que o erro ORA-28001 aconteça novamente, não é a estratégia mais segura, pois desta forma não existe uma rotação da senha do usuário de aplicação. O ideal é que exista a rotação de senha, trazendo mais segurança para o ambiente. No meu artigo “Alteração de senhas no Oracle sem derrubar a aplicação” eu demonstro como podemos fazer a troca de senhas dos usuários sem downtime para a aplicação, usando o PASSWORD_ROLLOVER_TIME, o que pode ajudar nessa implementação.

Publicar comentário