使用Oracle Net實現限制特定IP訪問資料庫

bitifi發表於2015-11-07

 

在實際運維環境中,資訊保安是我們不能忽視的重要方面,更是企業核心價值所在。無論系統多強大、效能有多快,安全這個硬指標是不能迴避的必要條件。

資料庫作為系統資料的貯存載體,是資訊系統關鍵核心。資料庫的安全、資料的安全,很大程度上就代表了資訊保安的大部分內容。資料庫安全不是一個單一的概念,是包括網路、連線、使用者、許可權乃至儲存等一系列軟硬體共同實現。目前尚未有專門一項技術可以解決所有的資料庫安全問題。

本篇主要介紹透過Oracle Net Service來實現限制特定IP訪問資料庫的功能。Oracle Net是客戶端Client Process連線到Service Process的主要功能元件。預設情況下,系統自動引數行為可以支援大部分的應用需求。但是,預設引數行為很多是不滿足安全性要求的。特定IP訪問資料庫,要求Oracle網路只能接受特定IP地址發出的請求連線,其他地址連線均不予接受。

這個需求是很多時候安全巡檢的一個重要內容專案。目的在於控制減少訪問資料庫伺服器的主機數量,減少潛在風險。下面介紹在Oracle中如何實現這個功能。

 

1、環境介紹

 

筆者使用Oracle 11gR2進行測試,具體版本號為11.2.0.4

 

 

SQL> select * from v$version;

 

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

PL/SQL Release 11.2.0.4.0 - Production

CORE    11.2.0.4.0      Production

TNS for Linux: Version 11.2.0.4.0 - Production

NLSRTL Version 11.2.0.4.0 – Production

 

 

伺服器IP地址配置如下:

 

 

[oracle@localhost ~]$ ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0C:29:21:A2:01 

          inet addr:172.16.19.2  Bcast:172.16.19.255  Mask:255.255.255.0

          inet6 addr: fe80::20c:29ff:fe21:a201/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:2151824 errors:0 dropped:0 overruns:0 frame:0

          TX packets:1194873 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:2817459392 (2.6 GiB)  TX bytes:184579510 (176.0 MiB)

 

 

2sqlnet.ora配置

 

Oracle Net是控制監聽器和連線行為的主要核心元件。Oracle Net配置檔案包括三個:listener.orasqlnet.oratnsnames.ora。三個檔案依然保持原有Unix平臺下的文字配置原則,分別承擔不同的配置任務。

Listener.ora主要負責監聽器配置內容。我們透過netca新增的監聽器程式配置資訊。在最新的11g版本中,引入了預設監聽器機制。也就是說,很多情況下,我們在$ORACLE_HOME/network/admin資料夾中是找不到listener.ora檔案的。但是此時監聽器程式也執行正常。

預設監聽程式是Oracle新版本的特性,即使在listener.ora中沒有配置,Oracle也是有一個預設在1521埠伺候的監聽程式後臺執行。但是根據筆者的經驗,實際生產環境中,還是獨立建立監聽程式比較好。

Sqlnet.ora是核心行為引數檔案,預設情況下一般為空檔案。這樣情況下,系統是直接使用預設Oracle Net行為引數進行控制。我們常常使用的如:禁用伺服器本地匿名登入等特性,都是在這個檔案上進行配置的。

Tnsnames.ora是我們日常客戶端最直接接觸的檔案。我們連入資料庫是透過主機IP、服務名、埠號進行資料庫例項instance定位的。在客戶端,我們是透過本地連線名進行替代的。Tnsnames.ora就是記錄本地配置資訊的載體。

透過檢視監聽器狀態,我們可以瞭解主要的Oracle Net配置情況。

 

 

[oracle@localhost ~]$ lsnrctl status

 

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 23-JUL-2014 16:11:06

 

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))

STATUS of the LISTENER

------------------------

Alias                     LISTENER

Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production

Start Date                16-JUN-2014 09:37:55

Uptime                    37 days 6 hr. 33 min. 10 sec

Trace Level               off

Security                  ON: Local OS Authentication

SNMP                      OFF

Listener Parameter File   /u01/app/oracle/network/admin/listener.ora

Listener Log File         /u01/app/diag/tnslsnr/localhost/listener/alert/log.xml

Listening Endpoints Summary...

  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)))

  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))

Services Summary...

Service "sicspcdb" has 1 instance(s).

  Instance "sicspcdb", status READY, has 1 handler(s) for this service...

Service "sicspcdbXDB" has 1 instance(s).

  Instance "sicspcdb", status READY, has 1 handler(s) for this service...

The command completed successfully

 

 

我們在配置目錄上,沒有找到sqlnet.ora,所以需要單獨建立一個文字檔案。

 

 

[oracle@localhost ~]$ cd /u01/app/oracle/network/admin/

[oracle@localhost admin]$ ls -l

total 16

-rw-r--r--. 1 oracle oinstall  343 Jul 14 16:21 listener.ora

drwxr-xr-x. 2 oracle oinstall 4096 Jun 16 09:31 samples

-rw-r--r--. 1 oracle oinstall  381 Dec 17  2012 shrept.lst

-rw-r-----. 1 oracle oinstall  312 Jul 14 16:21 tnsnames.ora

 

 

在新建檔案中,加入兩個key-value引數內容。

 

 

[oracle@localhost admin]$ cat sqlnet.ora

TCP.VALIDNODE_CHECKING=yes

TCP.INVITED_NODES=172.17.22.51

 

 

TCP.VALIDNODE_CHECKING作為限制IP訪問的開關專案。如果設定為yes,就表示啟用限制功能。TCP.INVITED_NODES是一個列表引數,用於列出允許連入的IP地址列表。IP地址172.17.22.51是實驗的windows環境。配置後,重啟監聽器(或者reload引數)。

 

 

[oracle@localhost admin]$ lsnrctl stop

 

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 23-JUL-2014 16:14:12

 

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

 

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)))

The command completed successfully

[oracle@localhost admin]$ lsnrctl start

 

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 23-JUL-2014 16:14:14

 

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Starting /u01/app/oracle/bin/tnslsnr: please wait...

 

 

3、首輪測試

 

到客戶端進行首次測試。客戶端是windows環境,而且已經建立本地連線名。

 

C:\Users\admin>tnsping sicspcdb_linux_bk

 

TNS Ping Utility for 64-bit Windows: Version 11.2.0.4.0 - Production on 23-7 -

2014 16:10:15

 

Copyright (c) 1997, 2013, Oracle.  All rights reserved.

 

已使用的引數檔案:

D:\app\admin\product\11.2.0\dbhome_1\network\admin\sqlnet.ora

 

已使用 TNSNAMES 介面卡來解析別名

嘗試連線 (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.19.2)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = sicspcdb)))

OK (10 毫秒)

 

 

當前IP地址為172.17.22.51,與配置相同。

 

 

C:\Users\admin>ipconfig

Windows IP 配置

 

乙太網介面卡 本地連線:

 

   連線特定的 DNS 字尾 . . . . . . . : chinare.local

   本地連結 IPv6 地址. . . . . . . . : fe80::e9b1:af96:9d03:1c89%14

   IPv4 地址 . . . . . . . . . . . . : 172.17.22.51

   子網掩碼  . . . . . . . . . . . . : 255.255.254.0

   預設閘道器. . . . . . . . . . . . . : 172.17.22.1

 

 

客戶端連線測試:

 

 

SQL> conn sys/oracle@sicspcdb_linux_bk as sysdba

ERROR:

ORA-12537: TNS: 連線關閉

 

 

連線失敗,在listener.log日誌檔案中,我們看到了拒絕資訊。

 

 

Wed Jul 23 16:19:17 2014

Incoming connection from 172.17.22.51 rejected

23-JUL-2014 16:19:17 * 12546

TNS-12546: TNS:permission denied

 TNS-12560: TNS:protocol adapter error

  TNS-00516: Permission denied

 

 

這個和我們預想的完全不同,設定上允許登入的反而不能登入。那麼,Linux伺服器本機登入情況是否允許呢?

 

 

[oracle@localhost admin]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.4.0 Production on Wed Jul 23 16:16:20 2014

 

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

 

SQL> conn sys/oracle@sicspcdb as sysdba

Connected.

SQL>

 

 

故障現象:配置的連線IP在連入的時候,不被允許。本機登入尚可以支援。

 

4、故障解決

 

經過分析和資料查詢,在MOS中我們找到了對應的資料解釋:

 

 

Cause

If the Local Server's address (where the listener is located) is not included in the TCP.INVITED_NODES listing, then the valid node checking seems to be nul and void.

 

Fix

The solution is to add the IP address or Fully qualified hostname of the local server to the TCP.INVITED_NODES list.

If this address is missing, then the "validnode checking" is not effective.

 

 

要求我們在配置sqlnet.ora引數中加上伺服器本地地址,否則限制IP功能不能實現。修改後如下:

 

 

[oracle@localhost admin]$ cat sqlnet.ora

TCP.VALIDNODE_CHECKING=yes

TCP.INVITED_NODES=(172.17.22.51,127.0.0.1)

 

 

重新啟動監聽器或者reload配置資訊。回到windows客戶端進行連線測試。

 

 

[oracle@localhost admin]$ sqlplus /nolog

 

SQL*Plus: Release 11.2.0.4.0 Production on Wed Jul 23 16:25:51 2014

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

 

SQL> conn sys/oracle@sicspcdb as sysdba

Connected.

 

 

找一個第三方IP進行測試連線。

 

 

C:\Documents and Settings\liuzy>ipconfig

 

Windows IP Configuration

 

 

Ethernet adapter 本地連線:

 

        Connection-specific DNS Suffix  . : chinare.local

        IP Address. . . . . . . . . . . . : 172.17.12.80

        Subnet Mask . . . . . . . . . . . : 255.255.254.0

        Default Gateway . . . . . . . . . : 172.17.12.1

 

 

C:\Documents and Settings\liuzy>sqlplus /nolog

 

SQL*Plus: Release 11.2.0.1.0 Production on 星期三 7 23 16:29:32 2014

 

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

 

SQL> conn sys/oracle@sicspcdb_training_linux as sysdba

ERROR:

ORA-12537: TNS: 連線關閉

 

 

實驗測試成功。

 

4、結論

 

資料庫安全問題是一個系統問題,一套安全的資料庫應用系統需要進行全方面的保護配置。本篇介紹的限定IP訪問手段,是Oracle平臺上非常簡單實用的手段。記錄下來,留待需要朋友待查。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30496894/viewspace-1825202/,如需轉載,請註明出處,否則將追究法律責任。

相關文章