Pessoal, para uma determinada atividade que precisei executar, eu tive a 
necessidade de conectar como um determinado usuário da Aplicação no banco , 
usuário esse que desconhecia a senha, E um simples ALTER SESSION SET 
CURRENT_SCHEMA não funcionaria (princiopalmente por ter que executar stored 
PL/SQLs) : não é nada tão incomum, às vezes acontece...
 Nesses casos o procedimento comum é conectar como DBA no banco, consultar a 
senha do usuário desejado criptografada na DBA_USERS (ou na USER$ se for banco 
11g), pedir um ALTER USER nomedousuario IDENTIFIED BY senhatemporariaqualquer;  
conectar no usuário desejado e imediatamente voltar a senha ao que estava antes 
com um ALTER USER nomedousuario IDENTIFIED BY VALUES 
('stringdasenhacriptografada').

 Essa técnica funciona desde sempre mas tem a desvantagem de, por uns segundos 
que seja, o usuário desejado ficar com a senha alterada, o que pode facilmente 
causar interrupção na aplicação, além de ser um tanto complexo de se fazer .  
Hoje porém eu encontrei a referência em 
http://www.dbsnaps.com/oracle/connect-as-an-oracle-user-without-knowing-the-password/
 que na versão 10g, que é o que temos aqui em produção (o recurso existe no 
sqlplus de 10gr2 em diante, iirc) o sqlplus já aceita conexão por proxy, aí 
botei a mão na consciência e me perguntei porque não usar o recurso, né ? Dãã 
pra mim... Então fiz assim :

a. conectei no banco como SYSDBA

b. temporariamente dei para um outro usuário que nós tinhamos a senha a 
permissão de conectar como se fosse o usuário desejado :

SYS:AS SYSDBA:SQL>alter user USER_APLIC grant connect through 
USER_COM_SENHA_CONHECIDA;

User altered.

c. conectei num outra sqlplus como o usuário que temos a senha mas fazendo 
proxy no usuário realmente desejado :

USER_COM_SENHA_CONHECIDA::SQL>conn 
USER_COM_SENHA_CONHECIDA[USER_APLIC]/senhaconhecida
Connected.

USER_APLIC::SQL>show user

USER is "USER_APLIC"

d. no sqlplus original removi do usuário que conhecemos a senha a permissão de 
conectar via proxy :

SYS:AS SYSDBA:SQL>alter user USER_APLIC revoke connect through 
USER_COM_SENHA_CONHECIDA;

User altered.


e é isso... Achei mais simples de fazer e absolutamente não perturba a 
Aplicação nem o pool de conexões nem nada, fikadika ...

 Abraços,

  José Laurindo Chiappa

OBS : 

  a. o link não fala, mas por segurança o RDBMS exige que o usuário com a senha 
já conhecida e que vai receber o GRANT ** não seja ** um usuário privilegiado, 
senão ele rejeita a operação com ORA-28150 :

:@:SQL>conn system[userdestino]/senhadosystem
ERROR:
ORA-28150: proxy not authorized to connect as client

  b. DE FORMA ALGUMA isso que eu disse é um hack, um 'segredo interno' : essa 
técnica está Plenamente Documentada nos manuais Oracle, então não temos por que 
não divulgar... 
  
  c. Falando sobre segurança, ela nos lembra o QUANTO é ultra-mega-poderoso o 
privilégio de ALTER USER, e o perigo que é dar esse privilégio para qualquer um 
que não é DBA... É um pouco parecido com o privilégio de ALTER SESSION, que 
muita gente pede e recebe sem pensar duas vezes mas que dá pra fazer muuuito 
estrago, principalmente ativando eventos na sessão....

Responder a