服务器 频道

Logon Trigger Example 登陆例子

  【IT168 服务器学院】Logon Trigger Example 登陆例子

  EXAMPLE 1)
  
  有时候我们不希望使用者利用ODBC来连接上资料库,利用ACCESS或者EXCEL来抓资料库资料。在道德劝说无效下,就直接挡下来!
  
  BEGIN
  FOR rec in (select username,program,SYS_CONTEXT(''USERENV'',''IP_ADDRESS'') ip from v$session
  where audsid = userenv(''sessionid'')) loop
  IF rec.IP = ?。16.64.19'' AND rec.USERNAME = ''HR'' AND upper(rec.program) in
  (''MSACCESS.EXE'',''SQLPLUSW.EXE'',''JREW.EXE'',''MSEXCEL.EXE'')
  THEN
  EXIT;
  ELSIF upper(rec.program) in (''MSACCESS.EXE'',''SQLPLUSW.EXE'',''JREW.EXE'',''MSEXCEL.EXE'') THEN
  raise_application_error(-20001,''Access Deny'');
  END IF;
  END LOOP;
  END;
  
  只有HR并且由指定的IP 172.16.64.19才能使用ACCESS或者SQL*PLUS或者EXCEL连上来,其他的使用者皆无法连线。
  
  但是,拥有DBA OR SYSDBA ROLE的权限帐号,是不会受到此限制。
  
  EXAMPLE 2)
  
  很多时候我们需要写一个logon trigger来进行帐号登入的控管。在Three - tier 架构下,大部分的程式可能都是由一个固定的帐号,授与适当的权限经由AP Server连接到后端的Oracle资料库来进行一般操作, 这个帐号的权限可能很大,而你并不希望programer利用这个帐号进入资料库做一些测试动作,因为这样就达不到有效权限控管的要求。可是这个AP专用的帐号及密码可能是半公开的,你如何防止这样的情况发生呢? 写一个logon trigger 也许是不错的主意。
  
  CREATE OR REPLACE TRIGGER LOGON_DB_TRIGGER
  AFTER LOGON ON DATABASE
  DECLARE
  IP VARCHAR2(30);
  UNAME VARCHAR2(30);
  BEGIN
  SELECT SYS_CONTEXT (''USERENV'',''IP_ADDRESS''),USERNAME INTO IP,UNAME FROM V$SESSION
  WHERE AUDSID=USERENV(''SESSIONID'');
  IF IP != ?。16.64.33'' AND
  UNAME = ''APPLE'' THEN
  RAISE_APPLICATION_ERROR(-1,''CONNECTIION REFUSED'');
  END IF;
  END;
  
  写好这个Trigger,只要使用者帐号为apple,且来源IP不是172.16.64.33都会被拒绝连线掉喔!!这样是不是多了些安全管控呢?特别注意一点,如果欲受限制的帐号权限为DBA or SYSDBA者,将不受此Trigger管制。

 

0
相关文章