jueves, 4 de junio de 2015

dbando Trigger After Logon, denegando usuarios, Toad,cmd,putty

Buen dia,


El siguiente script deniega accesos no permitidos de usuarios que intentan ingresar a la base de datos mediante herramientas como lo son, putty, MobaXterm, cmd, Toad, PlsqlDeveloper, Excel, etc.



Esta solucion es mediante un trigger (disparador) que se activa al despues de loguearse, la solucion es perfecta para sistemas comerciales que funcionan mediante el cliente de Oracle instalado en sus maquinas, ya sean cajeros o atencion a clientes, con el fin de evitar filtracion de datos sensibles a usuarios con algo de experiencia en bases de datos.



El Trigger es el siguiente:


CREATE OR REPLACE TRIGGER SYSTEM.DENY_ACCESS_LETG
AFTER LOGON ON DATABASE
DECLARE

--Se declaran variables

  t_prog sys.v_$session.program%TYPE;
  v_prog sys.v_$session.program%TYPE;
  l_count integer;
  v_date sys.v_$session.logon_time%TYPE;
 
BEGIN

--El parametron de bd job_queue_processes seteado arriba de 0 genera errores en el alert
--Con la siguiente excepcion se evita el error (prueben el trigger sin la excepcion y monitoreen el alert)

  SELECT count(PROGRAM)
  into t_prog
  from sys.v_$session
  where program like 'oracle@osgc-oracle (J00%)'
  AND audsid = USERENV('SESSIONID')
  AND  ROWNUM = 1;

  IF t_prog >0

  THEN

  NULL;

  ELSE

  SELECT program INTO v_prog
  FROM sys.v_$session
  WHERE  audsid = USERENV('SESSIONID')
  AND  audsid != 0  -- No revisa conexiones de sys
  AND  ROWNUM = 1;

 SELECT LOGON_TIME INTO v_date
 FROM sys.v_$session
 WHERE audsid = USERENV('SESSIONID')
 AND  audsid != 0  -- No revisa conexiones de sys
 AND  ROWNUM = 1;

     IF UPPER(v_prog) LIKE '%TOAD%' OR UPPER(v_prog) LIKE '%T.O.A.D%' OR -- Toad
     UPPER(v_prog) LIKE '%SQLNAV%' OR     -- SQL Navigator
     UPPER(v_prog) LIKE '%PLSQLDEV%' OR -- PLSQL Developer
     UPPER(v_prog) LIKE '%SQL%' OR -- PLSQL Developer
     UPPER(v_prog) LIKE '%BUSOBJ%' OR   -- Business Objects
     UPPER(v_prog) LIKE '%EXCEL%'       -- MS-Excel plug-in
  THEN

--Seleccionar uno o mas roles para tomarlos como parametro de acceso
--Los usuario con el role elegido podran accesar sin problemas

  SELECT COUNT (*)
  INTO l_count
  FROM dba_role_privs
  WHERE     granted_role in ('NOMBRE_ROLE','NOMBRE_ROLE2')
  AND grantee = SYS_CONTEXT ('userenv', 'session_user');
  IF l_count=0 THEN

--Si el role del usuario no se encuentra dentro de los permitidos entonces insertamos sus datos en una tabal de log
--La tabla de log debe haberse creado con anteioridad

  EXECUTE IMMEDIATE ('ALTER SESSION SET NLS_DATE_FORMAT=''MM/DD/YY HH:MI:SSAM''');
insert into DUEÑO.TABLA_LOG VALUES(
USER,v_date,
sys_context('USERENV','SERVER_HOST'),
 sys_context('USERENV','SESSIONID'),
 sys_context('USERENV','HOST'),
 sys_context('USERENV','IP_ADDRESS'),
 sys_context('USERENV','OS_USER'),
 sys_context('USERENV','CLIENT_IDENTIFIER'));
commit;


--Hacemos un update con la informacion complementataria (el programa con el que se intento conectar)
 update DUEÑO.TABLA_LOG set CLIENT_IDENTIFIER=v_prog where LOGON_TIME=v_date;
 commit;

--Para que el usuario no se alarme y podamos identificarlo, generamos un mensaje en pantalla

 RAISE_APPLICATION_ERROR(-20000, 'Memoria insuficiente, espera 5 minutos e intentalo nuevamente');

  END IF;
  END IF;
  END IF;

END;
/

No hay comentarios:

Publicar un comentario