如何限定IP訪問Oracle數據庫

  • 2019 年 10 月 29 日
  • 筆記

1.1  前言部分

1.2.1  導讀和注意事項

各位技術愛好者,看完本文後,你可以掌握如下的技能,也可以學到一些其它你所不知道的知識,~O(∩_∩)O~:

① 限定IP訪問Oracle數據庫的3種方法(重點)

② 如何將信息寫入到Oracle的告警日誌中

③ RAISE_APPLICATION_ERROR不能拋出錯誤到客戶端環境

④ 系統觸發器

⑤ 隱含參數:_system_trig_enabled

1.3  本文簡介

本文詳細介紹了3種限制IP地址登錄Oracle數據庫的辦法。

1.3.1  本文實驗環境介紹

項目

source db

db 類型

RAC

db version

11.2.0.3.0

db 存儲

ASM

OS版本及kernel版本

RHEL 6.5

數據庫服務器IP地址

192.168.59.130

客戶端IP地址

192.168.59.1或192.168.59.129

1.4  限定IP訪問Oracle數據庫的3種辦法

1.4.1  利用登錄觸發器

1.4.1.3  注意事項

需要注意的問題:

① 觸發的對象類型可以為DATABASE,也可以為「用戶名.SCHEMA」,如:

AFTER LOGON ON DATABASE

AFTER LOGON ON SCOTT.SCHEMA

② 當觸發的對象類型為DATABASE的時候,登錄用戶不能擁有「ADMINISTER DATABASE TRIGGER」的系統權限;當觸發的對象類型為「用戶名.SCHEMA」的時候,登錄用戶不能擁有「ALTER ANY TRIGGER」的系統權限。否則,這些用戶還是會正常登錄到數據庫,只是將相應的報錯信息寫入到告警日誌中。所以,擁有IMP_FULL_DATABASE和DBA角色的用戶以及SYS和EXFSYS用戶將不能通過這種方式限制登錄。

③ 隱含參數「_SYSTEM_TRIG_ENABLED」的默認值是TRUE,即允許DDL和系統觸發器。當設置隱含參數「_SYSTEM_TRIG_ENABLED」為FALSE的時候,將禁用DDL和系統觸發器。所以,當該值設置為FALSE的時候將不能通過這種方式限制登錄。

1.4.2  利用sqlnet.ora

第二種是修改$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檢測,對於用戶名檢測是不支持的。

1.4.3  利用防火牆

第3種是修改數據庫服務器的IPTABLES(配置文件:/etc/sysconfig/iptables)來限制某些IP登錄數據庫服務器。如下:

iptables -I INPUT -s 192.168.59.129 -j DROPservice iptables save

則,192.168.59.129這台主機將不能連接到數據庫服務器了,會報「ORA-12170: TNS:Connect timeout occurred」的錯誤。

該部分可以參考網絡配置,小麥苗從網上找了很多。

我們可以通過以下的iptables的設置來限制用戶訪問oracle所在linux操作系統的安全。

1、清楚操作系統默認的iptables策略

      我本機安裝的是centos6.0,安裝之後系統會提供iptables默認的policy策略,我們首先要清楚默認的策略

      iptables -F

2、開發22和1521端口對局域網的某個IP,在本例中客戶端ip是192.168.1.125,oracle所在機器的IP是192.168.1.144,在這裡,設置僅有該客戶端可以訪問22和1521端口,局域網內的其他IP都不允許訪問,

    iptables -A INPUT -s 192.168.1.125/32 -i eth0 -p tcp  –dport 22 -j ACCEPT

    iptables -A INPUT -s 192.168.1.125/32 -i eth0 -p tcp  –dport 1521 -j ACCEPT

    iptables -A INPUT -s 192.168.1.0/24 -p tcp  –dport 22 -j DROP

    iptables -A INPUT -s 192.168.1.0/24 -p tcp  –dport 1521 -j DROP

    這樣同一網段內除192.168.1.125之外其他IP都不能訪問數據庫服務器,即使ping命令也不可以

3、開發22和1521的OUTPUT鏈給192.168.1.125,否則已經啟動的oracle instance的pmon進程無法動態註冊到1521端口中

     iptables -A OUTPUT -d 192.168.1.125/32 -p tcp  –sport 22 -j ACCEPT

     iptables -A OUTPUT -d 192.168.1.125/32 -p tcp –sport 1521 -j ACCEPT

4、保存當前設置的iptables規則

      service iptables save

      這時系統會將已經設置的規則保存到/etc/sysconfig/iptables文件中

否則重啟之後之前設置的規則都會失效

先關閉所有的80端口

開啟ip段192.168.1.0/24端的80口

開啟ip段211.123.16.123/24端ip段的80口

# iptables -I INPUT -p tcp –dport 80 -j DROP

# iptables -I INPUT -s 192.168.1.0/24 -p tcp –dport 80 -j ACCEPT

# iptables -I INPUT -s 211.123.16.123/24 -p tcp –dport 80 -j ACCEPT

以上是臨時設置。

1.先備份iptables

# cp /etc/sysconfig/iptables /var/tmp

2.然後保存iptables

# service iptables save

3.重啟防火牆

#service iptables restart

以下是端口,先全部封再開某些的IP

iptables -I INPUT -p tcp –dport 9889 -j DROP

iptables -I INPUT -s 192.168.1.0/24 -p tcp –dport 9889 -j ACCEPT

如果用了NAT轉發記得配合以下才能生效

iptables -I FORWARD -p tcp –dport 80 -j DROP

iptables -I FORWARD -s 192.168.1.0/24 -p tcp –dport 80 -j ACCEPT

常用的IPTABLES規則如下:

只能收發郵件,別的都關閉

iptables -I Filter -m mac –mac-source 00:0F:EA:25:51:37 -j DROP

iptables -I Filter -m mac –mac-source 00:0F:EA:25:51:37 -p udp –dport 53 -j ACCEPT

iptables -I Filter -m mac –mac-source 00:0F:EA:25:51:37 -p tcp –dport 25 -j ACCEPT

iptables -I Filter -m mac –mac-source 00:0F:EA:25:51:37 -p tcp –dport 110 -j ACCEPT

IPSEC NAT 策略

iptables -I PFWanPriv -d 192.168.100.2 -j ACCEPT

iptables -t nat -A PREROUTING -p tcp –dport 80 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.2:80

iptables -t nat -A PREROUTING -p tcp –dport 1723 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.2:1723

iptables -t nat -A PREROUTING -p udp –dport 1723 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.2:1723

iptables -t nat -A PREROUTING -p udp –dport 500 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.2:500

iptables -t nat -A PREROUTING -p udp –dport 4500 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.2:4500

FTP服務器的NAT

iptables -I PFWanPriv -p tcp –dport 21 -d 192.168.100.200 -j ACCEPT

iptables -t nat -A PREROUTING -p tcp –dport 21 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.200:21

只允許訪問指定網址

iptables -A Filter -p udp –dport 53 -j ACCEPT

iptables -A Filter -p tcp –dport 53 -j ACCEPT

iptables -A Filter -d www.3322.org -j ACCEPT

iptables -A Filter -d img.cn99.com -j ACCEPT

iptables -A Filter -j DROP

開放一個IP的一些端口,其它都封閉

iptables -A Filter -p tcp –dport 80 -s 192.168.100.200 -d www.pconline.com.cn -j ACCEPT

iptables -A Filter -p tcp –dport 25 -s 192.168.100.200 -j ACCEPT

iptables -A Filter -p tcp –dport 109 -s 192.168.100.200 -j ACCEPT

iptables -A Filter -p tcp –dport 110 -s 192.168.100.200 -j ACCEPT

iptables -A Filter -p tcp –dport 53 -j ACCEPT

iptables -A Filter -p udp –dport 53 -j ACCEPT

iptables -A Filter -j DROP

多個端口

iptables -A Filter -p tcp -m multiport –destination-port 22,53,80,110 -s 192.168.20.3 -j REJECT

連續端口

iptables -A Filter -p tcp -m multiport –source-port 22,53,80,110 -s 192.168.20.3 -j REJECT iptables -A Filter -p tcp –source-port 2:80 -s 192.168.20.3 -j REJECT

指定時間上網

iptables -A Filter -s 10.10.10.253 -m time –timestart 6:00 –timestop 11:00 –days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j DROP

iptables -A Filter -m time –timestart 12:00 –timestop 13:00 –days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j ACCEPT

iptables -A Filter -m time –timestart 17:30 –timestop 8:30 –days Mon,Tue,Wed,Thu,Fri,Sat,Sun -j ACCEPT

禁止多個端口服務

iptables -A Filter -m multiport -p tcp –dport 21,23,80 -j ACCEPT

將WAN 口NAT到PC

iptables -t nat -A PREROUTING -i $INTERNET_IF -d $INTERNET_ADDR -j DNAT –to-destination 192.168.0.1

將WAN口8000端口NAT到192。168。100。200的80端口

iptables -t nat -A PREROUTING -p tcp –dport 8000 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.200:80

MAIL服務器要轉的端口

iptables -t nat -A PREROUTING -p tcp –dport 110 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.200:110

iptables -t nat -A PREROUTING -p tcp –dport 25 -d $INTERNET_ADDR -j DNAT –to-destination 192.168.100.200:25

只允許PING 202。96。134。133,別的服務都禁止

iptables -A Filter -p icmp -s 192.168.100.200 -d 202.96.134.133 -j ACCEPT

iptables -A Filter -j DROP

禁用BT配置

iptables –A Filter –p tcp –dport 6000:20000 –j DROP

禁用QQ防火牆配置

iptables -A Filter -p udp –dport ! 53 -j DROP

iptables -A Filter -d 218.17.209.0/24 -j DROP

iptables -A Filter -d 218.18.95.0/24 -j DROP

iptables -A Filter -d 219.133.40.177 -j DROP

基於MAC,只能收發郵件,其它都拒絕

iptables -I Filter -m mac –mac-source 00:0A:EB:97:79:A1 -j DROP

iptables -I Filter -m mac –mac-source 00:0A:EB:97:79:A1 -p tcp –dport 25 -j ACCEPT

iptables -I Filter -m mac –mac-source 00:0A:EB:97:79:A1 -p tcp –dport 110 -j ACCEPT

禁用MSN配置

iptables -A Filter -p udp –dport 9 -j DROP

iptables -A Filter -p tcp –dport 1863 -j DROP

iptables -A Filter -p tcp –dport 80 -d 207.68.178.238 -j DROP

iptables -A Filter -p tcp –dport 80 -d 207.46.110.0/24 -j DROP

只允許PING 202。96。134。133 其它公網IP都不許PING

iptables -A Filter -p icmp -s 192.168.100.200 -d 202.96.134.133 -j ACCEPT

iptables -A Filter -p icmp -j DROP

禁止某個MAC地址訪問internet:

iptables -I Filter -m mac –mac-source 00:20:18:8F:72:F8 -j DROP

禁止某個IP地址的PING:

iptables –A Filter –p icmp –s 192.168.0.1 –j DROP

禁止某個IP地址服務:

iptables –A Filter -p tcp -s 192.168.0.1 –dport 80 -j DROP

iptables –A Filter -p udp -s 192.168.0.1 –dport 53 -j DROP

只允許某些服務,其他都拒絕(2條規則)

iptables -A Filter -p tcp -s 192.168.0.1 –dport 1000 -j ACCEPT

iptables -A Filter -j DROP

禁止某個IP地址的某個端口服務

iptables -A Filter -p tcp -s 10.10.10.253 –dport 80 -j ACCEPT

iptables -A Filter -p tcp -s 10.10.10.253 –dport 80 -j DROP

禁止某個MAC地址的某個端口服務

iptables -I Filter -p tcp -m mac –mac-source 00:20:18:8F:72:F8 –dport 80 -j DROP

禁止某個MAC地址訪問internet:

iptables -I Filter -m mac –mac-source 00:11:22:33:44:55 -j DROP

禁止某個IP地址的PING:

iptables –A Filter –p icmp –s 192.168.0.1 –j DROP

1.5  本文總結

在Oracle中,有3種辦法可以限定特定IP訪問數據庫。第一種是利用登錄觸發器,如下:

CREATE OR REPLACE TRIGGER CHK_IP_LHR  AFTER LOGON ON DATABASEDECLARE  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 DATABASEAFTER 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檢測,對於用戶名檢測是不支持的。

第3種是修改數據庫服務器的IPTABLES(配置文件:/etc/sysconfig/iptables)來限制某些IP登錄數據庫服務器。如下:

iptables -A INPUT -s 192.168.59.1/32 -i eth0 -p tcp  –dport 1521 -j DROPservice iptables save

則,192.168.59.1這台主機將不能通過1521端口連接到數據庫服務器了,會報「ORA-12170: TNS:Connect timeout occurred」的錯誤。