martes, 14 de agosto de 2012

Un usuario tipo proxy y su gran uso para un DBA

El RDBMS de Oracle tiene dentro de sus métodos de autenticación una manera llamada usuario proxy, este usuario lo que te permite hacer es poder conectarte con las credenciales que tu tienes (usuario y contraseña que tu ya conoces) y ejercer acciones en un usuario en el que tu no tienes contraseña.

Y te vas a preguntar, pues para que me sirve esto si ya soy un super usuario, bueno una de las primeras cosas que se me viene a la mente es crear un database link privado, ya que la unica manera de crearlo es si estas conectado como el usuario que requiere el database link :)

Aquí te voy a dar un ejemplo de como crear un usuario proxy y como usarlo, ya tu te divertirás con las cosas que puedes hacer con este método de autenticación.

Lo primero que voy a hacer es crear un llamado usuario_princi y un usuario llamado usuario_proxy, después de crear el usuario proxy, vas a ver que altero al usuario para darle un grant connect through, esto es lo que nos va a permitir conectarnos como un usuario proxy

TESTDB> create user usuario_princi identified by 1234;

User created.

TESTDB> create user usuario_proxy identified by proxy1234;

User created.

TESTDB> grant create session, create table to usuario_princi;

Grant succeeded.

TESTDB> alter user usuario_princi grant connect through usuario_proxy;

User altered.

Una vez que creamos al usuario proxy, nos conectamos de la siguiente manera, vas a ver que aunque estoy usando el usuario y contraseña de usuario_proxy, mi esquema de contexto es usuario_princi

TESTDB> connect usuario_proxy[usuario_princi]/proxy1234
Connected.
USER: USUARIO_PRINCI
SESSION ID: 45
CURRENT_SCHEMA: USUARIO_PRINCI
INSTANCE NAME: TESTDB
DATABASE ROLE: PRIMARY
OS USER: oracle
CLIENT IP ADDRESS:
SERVER HOSTNAME: servidor1
CLIENT HOSTNAME: servidor1.oracleenespanol.blogspot.com

PL/SQL procedure successfully completed.

TESTDB> select sys_context('userenv','current_user') from dual;

SYS_CONTEXT('USERENV','CURRENT_USER')
--------------------------------------------------------------------------------
USUARIO_PRINCI

TESTDB> select sys_context('userenv','proxy_user') from dual;

SYS_CONTEXT('USERENV','PROXY_USER')
--------------------------------------------------------------------------------
USUARIO_PROXY

Ahora como ejemplo, vamos a crear una tabla y vas a ver que esta tabla se crea en el usuario_princi, no en el usuario_proxy que fue con el que nos conectamos

TESTDB> create table prueba (id number);

Table created.


TESTDB> select owner from all_tables where table_name='PRUEBA';

OWNER
---------------
USUARIO_PRINCI

Ya nada mas para verificar , audite a la sesión y las acciones de crear una tabla para los usuarios y el resultado es este

TESTDB> AUDIT CREATE TABLE BY usuario_proxy ON BEHALF OF usuario_princi;

Audit succeeded.

TESTDB> AUDIT CREATE TABLE BY usuario_princi BY ACCESS;

Audit succeeded.

TESTDB> SELECT
  2  tr2.username PROXY,
  3  tr1.username USERNAME,
  4  tr1.extended_timestamp,
  5  tr1.owner,
  6  tr1.obj_name,
  7  tr1.action_name,
  8  tr1.returncode ,
  9  tr1.SESSIONID,
 10  tr1.PROXY_SESSIONID
 11  FROM dba_audit_trail tr1,
 12  dba_audit_trail tr2
 13  WHERE tr1.obj_name not in ( 'DUAL','SQLPLUS_PRODUCT_PROFILE','PRODUCT_PRIVS')
 14  AND tr1.proxy_sessionid=tr2.sessionid
 15  AND tr2.action_name='PROXY AUTHENTICATION ONLY' and tr2.username='USUARIO_PROXY' and tr1.owner='USUARIO_PRINCI'
 16  ORDER BY tr1.timestamp;

PROXY           USERNAME        EXTENDED_TIMESTAMP        OWNER           OBJ_NAME   ACTION_NAME     RETURNCODE  SESSIONID PROXY_SESSIONID
--------------- --------------- ------------------------- --------------- ---------- --------------- ---------- ---------- ---------------
USUARIO_PROXY   USUARIO_PRINCI  14-AUG-12 04.31.30.650906 USUARIO_PRINCI  PRUEBA     CREATE TABLE             0   14900441        14900440
                                 AM -07:00

Como te puedes dar cuenta este método te puede ayudar para crear un database link en el usuario o de igual manera le puede ayudar a tu desarrollador para que se conecte a un usuario y no tener que crear sinónimos.