如何限定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」的錯誤。