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.
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