0

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

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

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

不幸的是,我们不能通过应用程序做到这一点,而且我们不想走让供应商修改应用程序的路线。该应用程序使用单个 tnsnames.ora 文件来连接测试版本和 prod 版本的数据库,因此我们无法更改它(除非有使用多个的方法?)。

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

那么,任何人都可以想出一种方法来阻止某个应用程序访问 Oracle 数据库吗?应用程序 EXE 具有相同的名称,但它从不同的路径运行,具体取决于它是测试版本还是生产版本。

4

2 回答 2

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;

您可以使用下面的脚本创建一个AFTER LOGON ON TRIGGER

 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,那么他们仍然在其中。

于 2013-02-20T09:40:46.717 回答
1

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

创建两个目录,例如test_tns_adminlive_tns_admin。将您的副本tnsnames.ora放在每个目录中,但对其进行编辑,以便每个目录只有一个目标数据库的 TNS 别名。

创建两个批处理文件,例如live.battest.bat. 在每一个中,将TNS_ADMINadmin 变量设置为指向适当的目录,然后启动真正的应用程序。所以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意味着它会选择 cut-down tns_names.ora,因此只会TEST识别 TNS 别名。终端服务器或数据库上的其他任何内容都不会受到影响。

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

于 2013-02-21T09:56:38.017 回答