Pular para o conteúdo
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #102132
    Ronin
    Participante

      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;

      #102133
      rman
      Participante

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

        #102134
        rman
        Participante

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

          #102135
          Ronin
          Participante

            Ok, 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,

            #102138
            fabiogalera
            Participante

              Aqui 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;
              /

              #102143
              Peterson
              Participante

                Fábio, bacana o script cara!
                Não entendi o uso do DBAS.xxx
                DBAS é um pacote de funções nativas?

                #102149
                fabiogalera
                Participante

                  Na 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 =)

                  #102251
                  Ronin
                  Participante

                    Bom 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;

                    #102252
                    fabiogalera
                    Participante

                      Utilize raise_application_error para matar a sessão.

                      A trigger precisa estar no schema SYS.

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.
                    plugins premium WordPress