问题描述
在Oracle 中,如何限定特定IP 访问数据库?
专家解答
总体来说有3 种办法可以限定特定IP 访问数据库,第一种是利用登录触发器,如下:
CREATE OR REPLACE TRIGGER CHK_IP_LHR AFTER LOGON ON DATABASE DECLARE V_IPADDR VARCHAR2(30); V_LOGONUSER VARCHAR2(60); BEGIN SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS'), SYS_CONTEXT('USERENV', 'SESSION_USER') INTO V_IPADDR, V_LOGONUSER FROM DUAL; IF V_IPADDR LIKE ('192.168.59.%') THEN RAISE_APPLICATION_ERROR('-20001', 'User '||V_LOGONUSER||' is not allowed to connect from '||V_IPADDR); END IF; END; /
需要注意的问题:
1 触发的对象类型可以为DATABASE,也可以为“用户名.SCHEMA”,如:
AFTER LOGON ON DATABASE AFTER LOGON ON SCOTT.SCHEMA
2 当触发的对象类型为DATABASE 的时候,登录用户不能拥有“ADMINISTER DATABASE TRIGGER”的系统权限;当触发的对象类型为“用户名.SCHEMA”的时候,登录用户不能拥有“ALTER ANY TIGGER”的系统权限。否则,这些用户还是会正常登录到数据库,只是将相应的报错信息写入到告警日志中。所以,拥有IMP_FULL_DATABASE 和DBA 角色的用户以及SYS 和EXFSYS 用户将不能通过这种方式限制登录。
3 隐含参数“_SYSTEM_TRIG_ENABLED”的默认值是TRUE,即允许DDL 和系统触发器。当设置该隐含参数为FALSE 的时候,将禁用DDL 和系统触发器。所以,当该值设置为FALSE 的时候将不能通过这种方式限制登录。
第二种是修改$ORACLE_HOME/network/admin/sqlnet.ora 文件,增加如下内容:
TCP.VALIDNODE_CHECKING=YES #开启IP 限制功能 TCP.INVITED_NODES=(127.0.0.1,IP1,IP2,……) #允许访问数据库 TCP.EXCLUDED_NODES=(IP1,IP2,……) #禁止访问数据库的IP 地址列表,多个IP 地址使用逗号分开
之后重新启动监听器即可,若禁止访问的IP 尝试登录的时候会报“ORA-12537: TNS:connection
closed”的错误,从而达到禁止某些IP 地址登录数据库的
需要注意的问题:
1 需要设置参数TCP.VALIDNODE_CHECKING 为YES 才能激活该特性。
2 一定要许可或不要禁止数据库服务器本机的IP 地址,否则通过lsnrctl 将不能启动或停止监听,因为该过程监听程序会通过本机的IP 访问监听器,而该IP 被禁止了,但是通过服务启动或关闭则不影响。
3 当参数TCP.INVITED_NODES 和TCP.EXCLUDED_NODES 设置的地址相同的时候以TCP.INVITED_NODES 的配置为主。
4 修改之后,一定要重起监听才能生效,而不需要重新启动数据库。
5 这种方式只是适合TCP/IP 协议。
6 这个配置适用于Oracle 9i 及其以上版本,在Oracle 9i 之前的版本使用文件protocol.ora。
7 在服务器上直接连接数据库不受影响。
8 这种限制方式是通过监听器来限制的。
9 这个限制只是针对IP 检测,对于用户名检测是不支持的。
第3 种是修改数据库服务器的IPTABLES(配置文件:/etc/sysconfig/iptables)来限制某些IP登录数据库服务器。配置命令如下所示:
iptables -A INPUT -s 192.168.59.1/32 -i eth0 -p tcp --dport 1521 -j DROP service iptables save #保存防火墙配置
若以上配置,则192.168.59.1 这台主机将不能通过1521 端口连接到数据库服务器了,会报“ORA-12170: TNS:Connect timeout occurred”的错误。