ALTER USER IDENTIFIED BY VALUES

O comando CREATE/ALTER USER <usuario> IDENTIFIED BY VALUES '<password hash>' não é documentado. É utilizado internamente para armazenar as senhas que foram anteriormente salvas com o utilitário export na tabela do dicionário de dados SYS.USER$. Em algumas situações onde o DBA precisa se conectar com um certo usuário, mas não sabe a senha dele ou a possibilidade de salvar estas senhas ganha-se tempo ao invés de sair perguntando por elas.

Às vezes você como DBA precisa realizar alguma manutenção que é preciso ser com aquele schema específico, mas a empresa não quer fornecer a senha do usuário/schema então este recurso pode ser utilizado da seguinte maneira:

Você se conecta com um usuário administrativo (DBA ou SYSDBA) e executa a consulta e anota o resultado:

SQL> spool senha.log
SQL> SELECT password FROM dba_users     WHERE username='SCOTT';

PASSWORD                     
------------------------------
F894844C34402B67             

Agora você altera temporariamente a senha do usuário para qualquer uma e poderá realizar a manutenção desejada:

SQL> ALTER USER scott IDENTIFIED BY manutencao;

Após a manutenção você apenas retorna para o valor desejado e a senha voltará a ser a mesma de antes:

SQL> ALTER USER scott IDENTIFIED BY VALUES 'F894844C34402B67';

Pronto. É uma ação simples, mas muitos não sabem desta boa idéia na hora de executar alguma manutenção com esses requisitos. Em migrações também pode ser útil.


Existe também uma outra utilidade para esse comando, é gerar "senhas impossíveis". A Oracle recomenda que você bloqueie contas internas do banco de dados como CTXSYS, XDB, OLAPSYS, etc., mas dessa forma você permite que outros descubram o que está instalado como funcionalidade no banco de dados e permitir que explorem vulnerabilidades. Se a conta estiver apenas bloqueada o "invasor" verá “ORA-28000: the account is locked” e assim descobrindo que essa funcionalidade existe. Nesse contexto podem ser geradas senhas impossíveis que utilizam o mesmo comando "... IDENTIFIED BY VALUES" impossibilitando que o invasor perceba que a funcionalidade existe. Se ele tentasse se conectar outro erro seria gerado: “ORA-01017: invalid username/password; logon denied”.


Para gerar um password impossível é fácil, basta você colocar um texto comum após o VALUES. Desta forma o Oracle nunca poderia decodificar o seu "hash" em uma senha:



SQL> ALTER USER olapsys IDENTIFIED BY VALUES 'IMPOSSIBLE' ACCOUNT UNLOCK;


Quando você verificar a senha na visão DBA_TABLES você irá ver:




SQL> SELECT username,password FROM DBA_USERS ORDER BY username;


USERNAME       PASSWORD                     
--------    --------
MGMT_VIEW      108DD8F2F748347B             
OLAPSYS        IMPOSSIBLE                      
ORACLE_OCM     6D17CF1EB1611F94

Até a próxima!

Comentários

  1. Parabéns Eduardo! Excelente dica!

    ResponderExcluir
  2. E se a conta nao existir tem como criar um exception?

    ResponderExcluir
    Respostas
    1. Se a conta existir ou não o erro será ORA-01017. Não é necessário exception, até porque não haverá login.

      Excluir
  3. Obrigado, cara! Foi bastante útil!

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Evitando FULL TABLE SCANS quando usar IS NULL em cláusulas WHERE

Restore no RMAN falha com "ORA-01180: can not create datafile 1"