搜尋此網誌

星期三, 7月 07, 2010

如何限制Client端連線到Oracle的方法

歐瑞客--尋找「自慢」絕活




如何限制Client端連線到Oracle的方法

在Oracle資料庫上限制Client連線的方法,當然有可以從網路層上限制IP,例如防火牆等方式。
應用層,例如:WebLogic設定連線資料庫的IP。 

在Oracle資料庫,可以透過不同的方式來解決這些問題。 

以下介紹兩個方式來實現這樣的功能: 

1、 修改SQLNET.ora文件來限制訪問資料庫的IP。 
2、 使用觸發器實現。 

以下範例就是使用sqlnet.ora的功能限制。 
適用版本:oracle 9i以上版本 
在9i提供了幾個參數: 
A. TCP.EXCLUDED_NODES 
   設定禁止訪問資料庫的IP地址列表。 
B. TCP.INVITED_NODES 
   設定允許訪問資料庫的IP地址列表,當這個參數和TCP.EXCLUDED_NODES設定的地址相同的時候
   將覆蓋TCP.EXCLUDED_NODES設定。 
C. TCP.VALIDNODE_CHECKING 
   檢測上述參數的設定。 

例如: 
tcp.validnode_checking=yes
#允許訪問的ip
tcp.invited_nodes =(ip1,ip2,……)
#不允許訪問的ip
tcp.excluded_nodes=(ip1,ip2,……)

透過這樣的設定就可以根據自己的需要更改, 

需要注意的問題: 
1、 需要設定參數為YES,這樣才能啟動。 
2、 建議設定允許訪問的IP,因為IP地址有可能被隨意修改,這樣比較安全。 
3、 TCP當參數TCP.INVITED_NODES和TCP.EXCLUDED_NODES設定的地址相同的時候將覆蓋TCP.EXCLUDED_NODES設定。 
4、 需要重啟監聽器才能生效。 
5、 這個方式只是適合TCP協定。 
6、 這個配置適用9i以上版本。在9i之前的版本使用文件protocol.ora。 
7、 在服務器上直接連接資料庫不受影響。 
8、 這種限制方式是透過監聽器來限制的。 
 
使用觸發器
很多時候我們需要寫一個logon trigger來進行帳號登入的控管。
在 Three-tier 架構下,大部分的程式可能都是由一個固定的帳號,
授與適當的權限經由AP Server連接到後端的Oracle資料庫來進行一般操作,
這個帳號的權限可能很大,而你並不希望programer利用這個帳號進入資料庫做一些測試動作,
因為這樣就達不到有效權限控管的要求。可是這個AP專用的帳號及密碼可能是半公開的,
你如何防止這樣的情況發生呢? 寫一個logon trigger 也許是不錯的主意。 

CREATE OR REPLACE TRIGGER LOGON_DB_TRIGGER 
AFTER LOGON ON DATABASE 
DECLARE 
IP VARCHAR2(30); 
UNAME VARCHAR2(30); 
BEGIN 
SELECT SYS_CONTEXT ('USERENV','IP_ADDRESS'),USERNAME INTO IP,UNAME FROM V$SESSION 
WHERE AUDSID=USERENV('SESSIONID');
IF IP != '10.70.36.120' AND 
UNAME = 'STEVEN' THEN 
RAISE_APPLICATION_ERROR(-20001,'Access Deny'); 
END IF; 
END LOGON_DB_TRIGGER; 

寫好這個Trigger,只要使用者帳號為STEVEN,且來源IP不是10.70.36.120都會被拒絕連線掉喔!!
這樣是不是多了些安全管控呢?特別注意一點,如果欲受限制的帳號權限為DBA or SYSDBA者,
將不受此Trigger管制。 

刪除觸發器
DROP TRIGGER LOGON_DB_TRIGGER;

沒有留言: