在Oracle中,有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;
/
需要注意的问题:
① 触发的对象类型可以为DATABASE,也可以为“用户名.SCHEMA”,如:
AFTER LOGON ON DATABASE
AFTER LOGON ON SCOTT.SCHEMA
② 当触发的对象类型为DATABASE的时候,登录用户不能拥有“ADMINISTER DATABASE TRIGGER”的系统权限;当触发的对象类型为“用户名.SCHEMA”的时候,登录用户不能拥有“ALTER ANY TIGGER”的系统权限。否则,这些用户还是会正常登录到数据库,只是将相应的报错信息写入到告警日志中。所以,拥有IMP_FULL_DATABASE和DBA角色的用户以及SYS和EXFSYS用户将不能通过这种方式限制登录。
③ 隐含参数“_SYSTEM_TRIG_ENABLED”的默认值是TRUE,即允许DDL和系统触发器。当设置隐含参数“_SYSTEM_TRIG_ENABLED”为FALSE的时候,将禁用DDL和系统触发器。所以,当该值设置为FALSE的时候将不能通过这种方式限制登录。
第二种是修改$ORACLE_HOME/network/admin/sqlnet.ora文件,增加如下内容:
TCP.VALIDNODE_CHECKING=YES #开启IP限制功能
TCP.INVITED_NODES=(127.0.0.1,IP1,IP2,……) #允许访问数据库的IP地址列表,多个IP地址使用逗号分开
TCP.EXCLUDED_NODES=(IP1,IP2,……) #禁止访问数据库的IP地址列表,多个IP地址使用逗号分开
之后重新启动监听器即可。这样客户端在登录的时候会报“ORA-12537: TNS:connection closed”的错误。
需要注意的问题:
① 需要设置参数TCP.VALIDNODE_CHECKING为YES才能激活该特性。
② 一定要许可或不要禁止数据库服务器本机的IP地址,否则通过lsnrctl将不能启动或停止监听,因为该过程监听程序会通过本机的IP访问监听器,而该IP被禁止了,但是通过服务启动或关闭则不影响。
③ 当参数TCP.INVITED_NODES和TCP.EXCLUDED_NODES设置的地址相同的时候以TCP.INVITED_NODES的配置为主。
④ 修改之后,一定要重起监听才能生效,而不需要重新启动数据库。
⑤ 这个方式只是适合TCP/IP协议。
⑥ 这个配置适用于Oracle 9i以上版本。在Oracle 9i之前的版本使用文件protocol.ora。
⑦ 在服务器上直接连接数据库不受影响。
⑧ 这种限制方式是通过监听器来限制的。
⑨ 这个限制只是针对IP检测,对于用户名检测是不支持的。
第三种是修改数据库服务器的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”的错误。