阻止应用程序访问数据库

时间:2013-02-20 06:20:40

标签: oracle exe

我们有一个终端服务器,它有两个我们的应用程序副本:实时版本和测试版本。

这些是用户桌面上的2个图标。现在,当您启动应用程序时,您键入应用程序连接到的oracle数据库的名称。

我们希望阻止用户在使用TEST图标时访问生产数据库,并阻止用户在使用PROD图标时访问TEST环境。

不幸的是,我们无法通过应用程序执行此操作,并且我们不希望沿着获取供应商修改应用程序的路线走下去。应用程序使用单个tnsnames.ora文件连接到测试版本和prod版本的数据库,因此我们无法更改此项(除非有办法使用倍数?)。

我原本以为我们可能有一个本地防火墙会阻止测试应用程序访问实时服务器(只是阻止连接),但目前它们都在同一台服务器上!

那么,有人能想出一种方法来阻止某个应用程序访问Oracle数据库吗?应用程序EXE具有相同的名称,但它根据测试版本或prod版本从不同的路径运行。

2 个答案:

答案 0 :(得分:1)

有一个名为v $ session的视图 并且下面的查询显示任何会话信息

select username,program
from   v$session 


您可能有一个表格列出受限制(或允许)的程序名称

CREATE TABLE RESTRICTED_PROGRAMS(
PROGRAM_NAME     VARCHAR2(64))

INSERT INTO RESTRICTED_PROGRAMS VALUES ('TEST.exe');
COMMIT;

您可以使用以下脚本创建 登录触发后

 CREATE OR REPLACE TRIGGER logon_audit
  AFTER LOGON ON database
DECLARE
  v_program            VARCHAR2(100);
BEGIN
    SELECT program into v_program;
      FROM v$session
     WHERE audsid = userenv('sessionid');


  for x in (SELECT * FROM RESTRICTED_PROGRAMS) loop
    IF upper(v_program) == upper(x.PROGRAM_NAME) THEN
      RAISE_APPLICATION_ERROR(-20001,
                              'You are not allowed to login using ' ||
                              v_program);
    end if;
  end loop;
END;

如果用户可以使用应用程序X.exe连接到您的数据库,那么如果他们将Y.exe重命名为X,那么他们仍然在。

答案 1 :(得分:1)

由于您可以控制终端服务器上的环境,因此一个相当简单的选项是将应用程序包装在批处理文件中,该文件强制它使用受限制的tnsnames.ora

创建两个目录,例如test_tns_adminlive_tns_admin。在每个目录中放置tnsnames.ora的副本,但要编辑它们,以便每个目录数据库只包含TNS别名。

创建两个批处理文件,例如live.battest.bat。在每个中,将TNS_ADMIN admin变量设置为指向相应的目录,然后启动实际应用程序。所以test.bat可能看起来像:

::Batch wrapper for the TEST application
@set TNS_ADMIN="\path\to\test_tns_admin"
@"\path\to\real\application.exe"

...和live.bat相同但指向另一个目录。您可以将快捷方式放在桌面上的批处理文件而不是实际应用程序中。当其中一个运行并且应用程序启动时,TNS_ADMIN将意味着它会选择缩减tns_names.ora,因此只会识别TEST TNS别名。终端服务器或数据库上的任何其他内容都不会受到影响。

你甚至不需要两个新的tnsnames.ora个文件;您可以从现有的系统范围中删除TEST别名并保留实时应用程序,仅将测试启动器替换为批处理文件 - 这可能更好,因为不接触实时,但取决于您想要的方式管理它,以及让它们以相同的方式工作是否更清楚。