- Este tópico contém 8 respostas, 4 vozes e foi atualizado pela última vez 12 anos, 11 meses atrás por fabiogalera.
-
AutorPosts
-
13 de dezembro de 2011 às 10:27 pm #102132RoninParticipante
Boa tarde,
Pessoal, a minha idéia é restringer o acesso ao ambiente do usuário SIGA e dos modulos (‘SGCRYS32.exe’,’w3wp.exe’), porém verifiquei que o usuário SIGA vindo de outro modulo também está conseguindo logar, vocês conseguem encontar erros no código?
Abraços
CREATE OR REPLACE TRIGGER TRG_RESTRICAO_ACESSO
AFTER LOGON ON DATABASE
BEGIN
IF SYS_CONTEXT(‘USERENV’,’SESSION_USER’) = ‘SIGA’ AND SYS_CONTEXT(‘USERENV’,’MODULE’) NOT IN (‘SGCRYS32.exe’,’w3wp.exe’) THEN
RAISE_APPLICATION_ERROR(-20003,’You are not allowed to connect to the database’);
insert into teste values (11,USER);
END IF;
END;13 de dezembro de 2011 às 10:44 pm #102133rmanParticipante@Ronin
Em que parte você mata a sessão caso entre na condição ?
Como não se pode dar COMMIT dentro da trigger deve se declarar uma transação autônoma, isso por causa do INSERT.
13 de dezembro de 2011 às 10:53 pm #102134rmanParticipante@Ronin
Cuidado com essa falsa segurança, isso não garante que por exemplo alguém conecte com o PL/SQL Developer na base usando o usuário SIGA. Basta eu renomear o executável do PL/SQL Developer para SGCRYS32.exe ou w3wp.exe estou dentro do banco, e claro se eu tiver a senha do SIGA. 😆
13 de dezembro de 2011 às 11:17 pm #102135RoninParticipanteOk, quanto a segurança é um risco mesmo, porém o usuário tem que ter um privégio diferenciado. Do jeito que está um programador pode por ex: dropar uma tabela, e queria tentar limitar o máximo possível!! minha edição é o standart e fico a limitada a features de segurança.
como ficaria naquela trigger ?Abs,
14 de dezembro de 2011 às 12:00 am #102138fabiogaleraParticipanteAqui segue uma que desenvolvi na minha primeira empresa como estagiário =).
CREATE OR REPLACE TRIGGER CHECK_CONNECTION AFTER
LOGON ON DATABASE
DECLARE
username varchar2(100);
username2 varchar2(100);
osuser varchar2(9);
program varchar2(100);
module varchar2(48);
node varchar2(48);
msg varchar2(255);
servidor varchar2(10);
instance varchar2(5);
sid number;
serial# number;
dummy integer;
profile varchar2(100);
igual boolean;dba boolean;
BEGIN
---- SELECT PARA ADQUIRIR AS VARIAVEIS
select distinct substr(a.username,1,20),substr(a.module,1,20),substr(a.osuser,1,8),substr(a.program,1,100),substr(a.machine,1,30),a.sid,a.serial#,b.profile into username,module,osuser,program,node,sid,serial#,profile FROM v$session a, dba_users b WHERE a.audsid = (select userenv('sessionid') from dual) and a.username = b.username and rownum = 1; SELECT substr(INSTANCE_NAME,1,5), substr(HOST_NAME,1,9) into INSTANCE,SERVIDOR FROM v$instance;
---- SETANDO MAIUSCULA NAS VARIÁVEIS
username := UPPER(USERNAME); osuser := UPPER(OSUSER); PROGRAM := UPPER(program); MODULE := UPPER(module);
---- VERIFICANDO SE É IGUAL
IF (OSUSER = USERNAME) THEN igual := TRUE; ELSE igual := FALSE; END IF;
---- VERIFICANDO SE É DBA
SELECT count(*) into dummy FROM DBAS.dbas a WHERE a.username = OSUSER; IF (DUMMY = 1) THEN dba := TRUE; ELSE dba := FALSE; END IF;
---- VERIFICANDO SE JAH LOGOU ALGUMA VEZ
username2:= username; SELECT count(*) into dummy FROM DBAS.last_login a WHERE a.username = username2; if(dummy > 0) then DBAS.last_login_alter(username,osuser); else DBAS.last_login_add(username,osuser); end if;
---- SQLPLUS
IF ( MODULE LIKE 'SQL%' ) THEN IF (not(igual) AND not(DBA)) THEN SELECT count(*) into dummy FROM DBAS.SQLPLUS_PERMIT WHERE owner = username; IF (DUMMY = 0) THEN DBAS.COMMIT_TRIGGER(username,osuser,program,'1'); msg:='Acesso bloqueado para o usuário abaixo: '||chr(10)||chr(10)||'Banco: '||INSTANCE||chr(10)|| 'Servidor: '|| SERVIDOR || chr(10) || 'Usuário: '||username||chr(10)||'Logon: '||osuser||chr(10)||'.EXE: '||program||chr(10)||'Programa: '||MODULE||chr(10)||'NODE: '||node||chr(10)||'Erro: 1'; DBAS.ENVIA_EMAIL (msg,'Acesso indevido no Banco de Producao'); raise_application_error (-20977,'*** LOGON DE REDE E ORACLE NÃO CONFEREM - CONEXÃO NÃO AUTORIZADA - FAVOR CONTACTAR O GRUPO DE DBA ***'); END IF; END IF;
ELSE
---- ACCESS
IF ( MODULE LIKE '%MSACCESS.EXE%' ) THEN SELECT count(*) into dummy from DBAS.users_connection_0802 WHERE upper(os_user) = osuser; IF (DUMMY > 0) THEN DBAS.COMMIT_TRIGGER (username,osuser,program,'2'); ELSE DBAS.COMMIT_TRIGGER (username,osuser,program,'3'); msg:='Acesso bloqueado para o usuário abaixo: '||chr(10)||chr(10)||'Banco: '||INSTANCE||chr(10)|| 'Servidor: '|| SERVIDOR || chr(10) || 'Usuário: '||username||chr(10)||'Logon: '||osuser||chr(10)||'.EXE: '||program||chr(10)||'Programa: '||MODULE||chr(10)||'NODE: '||node||chr(10)||'Erro: 3'; DBAS.ENVIA_EMAIL (msg,'Acesso indevido no Banco de Producao'); --raise_application_error (-20999,'*** ACESSO MICROSOFT ACCESS NÃO AUTORIZADO - FAVOR CONTACTAR O GRUPO DE DBA ***'); END IF;
ELSE
---- VB
IF ( MODULE like '%VB_.EXE%') THEN DBAS.COMMIT_TRIGGER (username,osuser,program,'4'); msg:='Acesso bloqueado para o usuário abaixo: '||chr(10)||chr(10)||'Banco: '||INSTANCE||chr(10)|| 'Servidor: '|| SERVIDOR || chr(10) || 'Usuário: '||username||chr(10)||'Logon: '||osuser||chr(10)||'.EXE: '||program||chr(10)||'Programa: '||MODULE||chr(10)||'NODE: '||node||chr(10)||'Erro: 4'; DBAS.ENVIA_EMAIL (msg,'Acesso indevido no Banco de Producao'); raise_application_error (-20999,'*** CONEXÃO NÃO AUTORIZADA - FAVOR CONTACTAR O GRUPO DE DBA ***'); END IF; END IF; END IF;
END;
/
14 de dezembro de 2011 às 3:23 pm #102143PetersonParticipanteFábio, bacana o script cara!
Não entendi o uso do DBAS.xxx
DBAS é um pacote de funções nativas?14 de dezembro de 2011 às 6:54 pm #102149fabiogaleraParticipanteNa verdade é um schema nosso, onde possuimos as listas de usuários que podem acessar via SQLPLUS, outros que são DBAs, etc.
Nessa empresa, todos tinham acesso individual no Banco de Dados, com user do Sistema Operacional =)
19 de dezembro de 2011 às 5:24 pm #102251RoninParticipanteBom dia,
Pessoal, o que tem de errado nessa trigger de logon ?
CREATE OR REPLACE TRIGGER TRG_RESTRICAO_ACESSO
AFTER LOGON ON DATABASE
DECLARE
USERNAME VARCHAR2(50);
SID NUMBER;
SERIAL NUMBER;
MODULE VARCHAR2(100);
BEGIN
SELECT SID,SERIAL#,MODULE,USERNAME INTO SID,SERIAL,MODULE,USERNAME FROM V$SESSION WHERE AUDSID=SYS_CONTEXT(‘userenv’,’sessionid’);
IF USERNAME = ‘SIGA’ AND MODULE NOT IN (‘SGCRYS32.exe’,’w3wp.exe’) THEN
EXECUTE IMMEDIATE ‘ALTER SYSTEM KILL SESSION ”’||sid||’,’||serial||””;
END IF;
END;19 de dezembro de 2011 às 6:13 pm #102252fabiogaleraParticipanteUtilize raise_application_error para matar a sessão.
A trigger precisa estar no schema SYS.
-
AutorPosts
- Você deve fazer login para responder a este tópico.