通过 IP 问题限制登录

Lan*_*tis 0 oracle triggers

我们有一个登录触发器,它通过 IP 限制访问:

IF UPPER(v_username) = 'CDEPROD' THEN
   IF SYS_CONTEXT('USERENV', 'IP_ADDRESS') NOT IN
       ('192.168.170.52',
        '192.168.170.40',
        '192.168.170.43',
        '192.168.170.54',
        '192.168.170.53',
        '192.168.170.58')
      OR SYS_CONTEXT('USERENV', 'IP_ADDRESS') IS NULL THEN
      RAISE_APPLICATION_ERROR(-20001, 'Can not log in from this IP address (' || SYS_CONTEXT('USERENV', 'IP_ADDRESS') || ')');
   END IF;
END IF;
Run Code Online (Sandbox Code Playgroud)

所以,触发器工作。但是,从本地,我无法以 CDEPROD 用户身份登录,它会引发应用程序错误。我想试试 127.0.0.1,但是没有用......

允许本地登录有什么技巧吗?

pmd*_*dba 5

一般来说,并且只有在绝对必要时,最好使用操作系统级防火墙或(如果您有 Oracle 企业版)Oracle 连接管理器而不是登录触发器来处理通过 IP 地址限制登录。请参阅我去年就该主题撰写的这篇博文:https : //pmdba.wordpress.com/2020/02/18/how-to-limit-a-user-connection-to-a-specific-ip-address/

关键是硬编码 IP 地址为高开销维护噩梦打开了一扇门(因为地址容易更改,有时会频繁更改),因为 IP 地址(以及几乎所有其他 SYS_CONTEXT 参数)相对容易获得很少或没有安全增益欺骗一个精明的 Java 程序员。我会建议回到绘图板,你应该首先问:“我要解决的问题是什么?”

  • 您是否试图确保用户是他们声称的人?使用 SSL(又名 TCPS)连接与 Oracle 钱夹和证书对用户进行身份验证。您还可以使用代理身份验证来允许经过严格身份验证的用户访问共享的应用程序架构,而不是共享密码或密钥。
  • 您是否试图确保用户仅使用经批准(和受保护)的公司资产来连接到数据库?使用主机防火墙或 OCM 规则来限制与已知网络子网(而不是单个 IP)的连接。
  • 您是否试图确保这些经过严格身份验证的合法用户使用经过批准和保护的公司计算资产,只在他们应该做的时候做他们应该在数据库中做的事情?使用审计、安全应用程序角色以及虚拟专用数据库或数据库保管库等内容来强制执行业务规则。