在实际运维环境中,信息安全是我们不能忽视的重要方面,更是企业核心价值所在。无论系统多强大、性能有多快,安全这个硬指标是不能回避的必要条件。
数据库作为系统数据的贮存载体,是信息系统关键核心。数据库的安全、数据的安全,很大程度上就代表了信息安全的大部分内容。数据库安全不是一个单一的概念,是包括网络、连接、用户、权限乃至存储等一系列软硬件共同实现。目前尚未有专门一项技术可以解决所有的数据库安全问题。
本篇主要介绍通过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)
2、sqlnet.ora配置
Oracle Net是控制监听器和连接行为的主要核心组件。Oracle Net配置文件包括三个:listener.ora、sqlnet.ora和tnsnames.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平台上非常简单实用的手段。记录下来,留待需要朋友待查。
本文转自ICT时空 dbasdk博客,原文链接:使用Oracle Net实现限制特定IP访问数据库 ,如需转载请自行联系原博主。