Desconectando uma sessão do Oracle de um disparador de logon

1

Estou tentando construir um gatilho de logon do Oracle 11g que restringe o acesso de um usuário específico a uma lista conhecida de aplicativos. Por exemplo, o usuário SCOTT pode se conectar apenas com MYAPP.EXE .

Acredito que tenho o gatilho e lógica corretos, mas o problema que estou tendo é que RAISE_APPLICATION_ERROR(); não mata a sessão. O gatilho está ativado e tentei conceder o privilégio ADMINISTER DATABASE TRIGGER , mas ainda sinto falta de algo.

Com base no este exemplo , aqui está o gatilho que tenho até agora (de propriedade do mesmo usuário):

CREATE OR REPLACE TRIGGER global_logon_trg AFTER logon ON DATABASE
DECLARE
   p_session_user  varchar2(64);
   p_module        varchar2(64);
BEGIN
   SELECT UPPER(SYS_CONTEXT('USERENV', 'SESSION_USER')) INTO p_session_user FROM DUAL;
   SELECT UPPER(SYS_CONTEXT('USERENV', 'MODULE')) INTO p_module FROM DUAL;

   DBMS_SESSION.SET_IDENTIFIER(p_session_user || '-' || p_module);

   IF ((p_session_user = 'SCOTT') AND (p_module IN ('MYAPP.EXE'))) THEN
      DBMS_SESSION.SET_IDENTIFIER('about to raise app_error..');
      RAISE_APPLICATION_ERROR(-20003,'You are not allowed to connect to the database');
   END IF;

END;
/

Mas o login como SCOTT com o SQL * Plus ainda funciona. E se eu, então, consultar v$session , com a seguinte consulta:

select username, client_identifier
from v$session
where username not in ('SYSMAN', 'DBSNMP');

Eu obtenho o seguinte resultado ..

USERNAME           CLIENT_IDENTIFIER
------------------ -----------------------------------
SCOTT              about to raise app_error..

O que estou perdendo? Isso é uma coisa de privilégio, uma coisa de código de gatilho ou um bug do Oracle ? Ou há uma maneira melhor de fazer o que estou tentando fazer? (Eu tenho controle total sobre o banco de dados e o servidor em que ele se encontra, se isso torna tudo mais fácil!)

Estou usando Oracle Database 11g Release 11.1.0.6.0 - Production

Muito obrigado pela sua ajuda e sugestões

Andrew: o)

    
por Andrew 26.08.2009 / 11:03

2 respostas

1

Confira o site do blog / Q & A da TOM KYTE asktom . Pode haver uma razão sutil por que isso não está funcionando como seria de esperar.

Seu problema foi discutido aqui e < a href="http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:3236035522926"> aqui para dois exemplos.

Uma alternativa é usar PAPÉIS DE APLICAÇÃO que só são ativados pelo aplicativo e uma senha configurada no aplicativo.

Como DBA, eu não gostaria de restringir o acesso ao banco de dados via SQLPLUS sob nenhuma circunstância, já que este é frequentemente o melhor caminho para obter acesso a um banco de dados doentio. E tê-lo em um gatilho global. De jeito nenhum matey!

    
por 26.08.2009 / 13:01
1

O esquema Scott recebeu o papel DBA? De essa discussão no Asktom , parece que um membro do grupo DBA não pode ser desconectado com um disparador ON LOGON.

A propósito, você também verá neste tópico por que sua solução não é à prova de balas (por exemplo: copy sqlplus.exe foo.exe )

Atualização: além disso, esse gatilho não funciona nos seguintes casos:

  • o dono do gatilho é SCOTT (i-e: ele não será desconectado se ele realmente possuir o gatilho, isso deve ser para impedir o autotravamento acidental),
  • o usuário tem o privilégio Administrar acionador do banco de dados

Poderia, por favor, verificar se o gatilho é propriedade da SCOTT?

    
por 26.08.2009 / 11:35