公文素材库 首页

如何保护好Oracle服务器上的监听器

时间:2019-05-29 22:25:30 网站:公文素材库

如何保护好Oracle服务器上的监听器

如何保护好Oracle服务器上的监听器

监听器简介

Oracle监听器是Oracle服务器软件的一个组件,它负责管理Oracle数据库和客户端之间的通讯,它在一个特定的网卡端口(默认是TCP1521端口)上监听连接请求,并将连接转发给数据库,由两个二进制文件组成:tnslsnr和lsnrctl.其中tsnlsnr就是监听器本身,它运行在数据库服务器端,lsnrctl是监听器控制程序,用于在服务器上或远程管理监听器。与监听器相关的还有两个配置文件:sqlnet.ora和listener.ora.tnslsnr启动时就会读取这两个配置文件中的信息,如端口号,数据库服务名。

Oracle监听器在默认安装和配置情况下,有许多著名的漏洞和缺陷,黑客利用这些缺陷可以制造拒绝服务攻击,偷窃数据库连接密码,进一步窃取机密数据。最大的风险来自监听器的配置,Oracle官方提供了一些推荐的配置,往往能够达到保护监听器的目的。本文就是想仔细列出现有的已知保护Oracle监听器的方法,这些方法对于黑客而言都很熟悉,所以作为DBA也必须要清楚才行。为什么要保护监听器?

DBA对于为什么要保护监听器往往不太关心,他们认为黑客不太可能通过控制监听器进而控制整个数据库,在Oracle10g之前的所有版本,Oracle监听器允许任何一个人利用lsnrctl从远程发起对监听器的管理,但幸运的是,从Oracle10.1开始严格限制在远程对监听器的管理了。下面列出一些对Oracle8/9i默认安装配置时可能有效的攻击手段,即使是打上最新的安全补丁,而没有进行安全配置加固,这些攻击手段也仍然有效:

注意:本文假设监听器使用的是TCP/IP,并且使用的是本地命名管理(即tnsnames.ora),本文所描述的Oracle版本在8i/9i/10g上做过测试,但相信对其他低版本或更高的版本也有一定的参考价值。怎么保护监听器?

既然监听器有这么多可供黑客利用的地方,那有没有什么方法来保护它,办法是有的,而且还很多,总结起来,大概有下面11种方法来保护Oracle监听器:1、设备监听器密码

通过设置监听器密码可以阻止大部分的菜鸟黑客的进攻,设置密码有两种方法,一种是通过lsnrctl命令来设置,另一种是直接修改listener.ora文件,第一种方法设置的密码是经过加密后存储在listener.ora中,而第二种方法是以明文的形式放在listener.ora中的,所以推荐使用第一种方式。具体命令如下:

LSNRCTL>setcurrent_listenerLSNRCTL>change_password

oldpassword:Newpassword:5、利用防火墙阻止SQL*NET

除非的确需要,否则不应该让SQL*NET通讯通过防火墙,在设计防火墙规则时,应设计为只允许经过认证的Web服务器和应用程序通过防火墙进行SQL*NET通信。而且放在防火墙DMZ区域的应用服务器使用SQL*NET通信时,应只允许它与特定的数据库服务器进行通信。

通常很少有应用会从Internet直接访问数据库,因为这种方式的延迟非常明显,通用的做法是配置应用服务器与数据库通信,Internet客户端通过浏览器访问应用服务器即可,这时配置防火墙时也只需设置应用服务器和数据库服务器之间的通信规则即可。6、保护$TNS_ADMIN目录

$TNS_ADMIN目录即我们通常看到的ORACLE_HOME/network/admin目录,它下面包含有listener.ora,tnsnames.ora,sqlnet.ora,protocol.ora等重要配置文件,前面已经提到,监听器的密码就是保存在listener.ora中的,如果不保护好,可能造成密码泄露,或整个文件被修改,这个目录下的listener.ora,sqlnet.ora,protocol.ora文件应该只开放给Oracle主账户(通常是oracle或Administrator),而其他账户不能有任何权限,tnsnames.ora文件在Linux或Unix系统上权限可以设置为0644,在windows上可以设置其他用户为浏览,读取权限。7、保护TNSLSNR和LSNRCTL

在Linux或Unix服务器上,应该将这两个文件的权限设为0751,如果想更严格一点,可以设为0700,这样就只有安装oracle时指定的宿主用户可以执行它们了,这两个文件位于ORACLE_HOME/bin目录下。保护这两个文件的目的是为了防止黑客直接破坏它们,如果tnslsnr被破坏,监听器肯定不能启动,如果lsnrctl被破坏,可能植入恶意代码,在运行lsnrctl时就会执行其它黑客行为。8、移除不用的服务

默认安装时,会安装一个PL/SQL外部程序(ExtProc)条目在listener.ora中,它的名字通常是ExtProc或PLSExtProc,但一般不会使用它,可以直接从listener.ora中将这项移除,因为对ExtProc已经有多种攻击手段了。有时可能会在多个实例之间拷贝listener.ora,请检查拷贝来的文件中是否含有不需要的服务,确保只留下的确需要的服务项目,减少监听器受攻击的面。

9、改变默认的TNS端口号

改变监听器监听的端口号与修改ftp服务器默认的21端口,web服务器的80端口类似,因为Oracle默认的监听端口是1521(Oracle还正式注册了两个新的端口号2483和2484,说不定哪个新版本发布后,可能默认的端口号就会是这两个了,其中2484用于SSL类型的连接),几乎所有的扫描器都可以直接扫描这个端口是否打开,如果设置为一个不常用的端口号,可能会给人一种假象,而且即使扫描到端口打开,也还要猜测该端口运行是究竟是什

扩展阅读:oracle技术文档-监听器专题(精)

0racle技术文档

版本

V1.0日期201*/10/25

Oracle技术文档系列之

Oracle监听器

文件编号:

版本号:V1.0

0racle技术文档

版本

V1.0日期201*/10/25

版本修订历史

序号1版本1.0变更描述创建修订人/日期审核/日期批准/日期2345670racle技术文档

版本

V1.0日期201*/10/251.引言

1.1编写目的

针对研发中心工作中经常遇到的oracle监听器发生故障的情况,特整理编写此技术文档,详细介绍Oracle监听器的概念、工作原理、配置以及相关问题及其处理方法。以期此文档对研发中心的开发工作有所帮助,并解决问题。

1.2背景1.3定义

1.4参考资料

-1-

0racle技术文档

版本

V1.0日期201*/10/252.Oracle监听器概念

Oracle监听器是主要的oracle服务端网路构件,扮演着至关重要的作用。它负责管

理Oracle数据库和客户端之间的通讯,它在一个特定的网卡端口(默认是TCP1521端口)上监听连接请求,并将连接转发给数据库。你可以形象的把它认为是oracle数据库(服务端oracle实例)的大耳朵,一动也不动的呆在一个地方(端口号,默认是1521),来监听外来的客户端发送的连接请求。

Oracle监听器是一个独立的操作系统进程。在操作系统的服务列表可以看见它,一

般名称为OracleOradb11g_home1TNSListener

Oracle监听器独立于oracle实例,它的启动和关闭独立于oracle数据库的启动和

关闭。

Orale监听器的默认名称是listener,默认端口号为1521

-2-

0racle技术文档

版本

V1.0日期201*/10/253.Oracle监听器功能

3.1监听客户端请求

监听客户端请求。监听器运行在数据库服务器之上,与Oracle实例(可为多个)相关关联,是一个专门的进程process,在Windows的服务项目或者Linux的运行进程列表中,都会看到对应的运行进程。Windows上名为TNSLSNR,Linux/Unix平台上是lsnrctl。监听器守候在服务器制定端口(默认为:1521),监听客户端的请求。

3.2为客户端请求分配serverprocess

在Oracle模式下,客户端进程是不允许直接操作数据库实例和数据,而是通过一个服务进程ServerProcess(也称为影子进程)。

监听器只负责接听请求,之后将请求转接给OracleServerProcess。当监听器接受到请求之后,就向操作系统(或者Dispathcer组件)要求(或分配)一个ServerProcess与客户端相连。

3.3注册实例服务

监听器是建立实例和客户端进程之间联系的桥梁。监听器和实例之家的联系,就是通过注册来实现的。

注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个对外的服务名可以和实例名一样,也可以不一样。

注册的过程就是实例告诉监听器,它的数据库实例名instance_name和服务名service_names。(对外提供的服务名)。

注册的方式有2种:静态注册和动态注册。详细内容见后面

-3-

0racle技术文档

版本

V1.0日期201*/10/254.Oracl监听器工作原理

1)监听器作为一个独立的process在操作系统中运行,守候在特定网络端口(默认1521),

等待客户端的请求到来。2)当一个请求“如期而至”,监听器会对比请求中的service名称和已经注册的服务列表,

如果不匹配,就拒绝。如果匹配,就定位到对应的oracle实例,并获得实例的oracle_home路径。3)oracle监听器会向操作系统或dispatcher进程(专用连接、共享连接)分配一个server

process,也就是前面讲过的影子进程。Serverprocess将自己在OS中的进程编连接地址信息发给监听器;监听器将客户端信息传递给serverprocess.4)监听器获得serverprocess的信息之后,将其返回给客户端。客户端根据返回的信息,

与serverprocess在指定的服务器端口进行联系。

5)直到这个时候客户端才将连接用户名、密码等信息发给serverprocess,进行登录验

证等操作。监听器的工作也就到此结束。

5.Oracle监听器注册机制

在上面的内容中,我们已经初步了解了注册的作用,注册就是将数据库作为一个服务

注册到监听程序。客户端不需要知道数据库名和实例名,只需知道该数据库对外提供的服务名就可以申请连接到数据库。相当于这样:在数据库服务器和客户端之间有一监控程序,在监听程序里,会记录相应数据库对应的服务名(一个数据库可对应多个服务名),当客户端需要连接数据库时,只需要提供服务名,就可以建立客户端与服务器之间的连接。

5.1静态注册

静态注册顾名思义,就是显示的指定监听器要为哪个实例,以哪个服务名做监听。静态注册就是实例启动时,读取listener.ora文件配置,将实例和服务注册到监听程序。Listener.ora文件中的:

GLOBAL_NAME是对外提供的服务名。SID_NAME是要注册的实例名。

采取静态注册方法时,listener.ora中的内容如下:

SID_LIST_LISTENER=(SID_LIST=(SID_DESC=

(SID_NAME=PLSExtProc)

(ORACLE_HOME=D:\\oracle\\product\\10.2.0\\db_1)

-4-

0racle技术文档

版本

V1.0日期201*/10/25(PROGRAM=extproc))

(SID_DESC=

(GLOBAL_DBNAME=an)

(ORACLE_HOME=D:\\oracle\\product\\10.2.0\\db_1)(SID_NAME=orcl))

(SID_DESC=

(GLOBAL_DBNAME=server2)

(ORACLE_HOME=D:\\oracle\\product\\10.2.0\\db_1)(SID_NAME=oradb)))

该文件表明数据库是单实例的,实例名为orcl,向外提供服务名为an

5.2动态注册

动态注册是instance启动的时候,也就是数据库启动的时候,后台进程PMON根据init.ora中的instance_name,service_names两个参数将实例和服务动态注册到监听中。

动态注册可以不需要listener.ora文件。动态注册默认只注册到默认的监视器上(名称为LISTENE、端口是1521,协议是TCP),如果需要向非默认的监听器注册,则需要配置local_listener参数。

注意:init.ora中的service_names和instance_name这个参数,会一定程度上影响动态注册的效果

如果没有显示的设置init.ora中的service_names和instance_name值,那么仅当数据库在监听器运行之后才启动时,动态注册才会发生。

如果没有显示设置init.ora中的service_names和instance_name值,动态注册后,若重启监听器,则会发生动态注册信息丢失的情况。

如果我们需要在数据库运行期间重启监听器,仅当在init.ora文件中显示的设置了service_names和instane_name的值,这样数据库的PMON进程才会周期性(1分钟)的完成动态注册。

通过命令,也可以强迫PMON立即执行一次注册。命令如下:SQL>altersystemregister;Systemaltered注:经过试验oracle11g版本已经不需要在init.ora文件中显示的设置service_names和instane_name的值,PMON进程会周期性(1分钟内)的自动完成动态注册

不论何时数据库实例关闭,该实例动态注册的数据库服务都会动态的出监听器注销,这样,不管数据库是运行还是关闭,监听器总是知道它的状态。

-5-

0racle技术文档

版本V1.0日期201*/10/25

6.Oracle监听器命令控制台(Lsnrctl)

6.1进入监听器命令控制台

CMDLsnrctl

6.2开启监听

启动默认监听器Listener

LSNRCTL>Start

启动非默认监听器,假设监听器名称为Lsnrctl_omsLSNRCTL>StartLsnrctl_oms

6.3显示监听状态

LSNRCTL>Status

6.4关闭监听

关闭默认监听器Listener

LSNRCTL>Stop

关闭非默认监听器,假设监听器名称为Lsnrctl_omsLSNRCTL>StopListener_oms

0racle技术文档

版本

V1.0日期201*/10/257.Oracle监听配置(服务器端)

配置Oracle服务器端监听可以在oracle自带的图形化Oracle网络管理器(OracleNetManager)里完成(强烈建议在这个图形化的工具下完成Oracle服务端或客户端的配置,不建议直接在listener.ora文件中配置,主要是为了减少人为输入错误)。在Windows下,点击“开始/程序/Oracle-OraHome92/ConfigurationandMigrationTools/NetManager”启动Oracle网络管理器工具,Windows下启动NetManager图形窗口如下图示:

如上图所示,选中树形目录中监听程序项,再点击左上侧“+”按钮添加监听程序,点击监听程序目录,默认新加的监听器名称是LISTENER(该名称也可以由任意合法字符命名)。选中该名称,选中窗口右侧栏下拉选项中的“监听位置”,点击添加地址按钮。在出现的网络地址栏的协议下拉选项中选中“TCP/IP”,主机文本框中输入主机名称或IP地址(如果主机即用作服务端也作为客户端,输入两项之一均有效;如果主机作为服务端并需要通过网络连接,建议输入IP地址),端口文本框中输入数字端口,默认是1521,也可以自定义任意有效数字端口。配置好的监听位置如下图示:

-7-

0racle技术文档

版本

V1.0日期201*/10/25

选中窗口右侧栏下拉选项中的“数据库服务”,点击添加数据库按钮。在出现的数据库栏中输入全局数据库名,如myoracle。注意这里的全局数据库名与数据库SID有所区别,全局数据库名实际通过域名来控制在同一网段内数据库全局命名的唯一性,就如Windows下的域名控制器,如这里可以输入myoracle.192.168.1.5。Oracle主目录可以不填写,输入SID,如myoracle。完整的数据库服务配置如下图示:

保存以上配置,默认即可在Oracle安装目录下找到监听配置文件(Windows下如

D:oracleora92networkadminlistener.ora)。至此,Oracle服务端监听器配置已经完成。

-8-

0racle技术文档

版本

V1.0日期201*/10/258.Oracle监听器常见问题及解决方法

8.1因服务器主机名或IP发生改变导致监听无法启动

解决方法一:

打开文件listener.ora文件,修改文件中的HOST的值为新的主机名或IP(见下面划线部分),然后重新启动监听,监听正常工作LISTENER=

(DESCRipTION_LIST=(DESCRIPTION=(ADDRESS_LIST=

(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0)))

(ADDRESS_LIST=

(ADDRESS=(PROTOCOL=TCP)(HOST=IBMThinkPad)(PORT=1521)))))

解决方法二:

直接删除listener.ora文件,或者将此文件改名。

运行Lsnrctlstart生成一个系统默认的监听器,名称Listener。利用后台进程POMN自动完成监听服务动态注册。用动态注册的服务名来连接数据

-9-

0racle技术文档

版本

V1.0日期201*/10/258.2客户端无法连接服务器问题及排除

1、ORA-12541:TNS:没有监听器

显而易见,服务器端的监听器没有启动,另外检查客户端IP地址或端口填写是否正确。启动监听器:C:lsnrctlstart

2、ORA-12500:TNS:监听程序无法启动专用服务器进程对于Windows而言,没有启动Oracle实例服务。启动实例服务:3、ORA-12535:TNS:操作超时

出现这个问题的原因很多,但主要跟网络有关。解决这个问题,首先检查客户端与服务端的网络是否畅通,如果网络连通,则检查两端的防火墙是否阻挡了连接。4、ORA-12154:TNS:无法处理服务名

检查输入的服务名与配置的服务名是否一致。另外注意生成的本地服务名文件(Windows下如D:oracleora92networkadmintnsnames.ora,Linux/Unix下

/network/admin/tnsnames.ora)里每项服务的首行服务名称前不能有空格。5、ORA-12514:TNS:监听进程不能解析在连接描述符中给出的SERVICE_NAME

打开NetManager,选中服务名称,检查服务标识栏里的服务名输入是否正确。该服务名必须与服务器端监听器配置的全局数据库名一致。6、Windows下启动监听服务提示找不到路径

用命令或在服务窗口中启动监听提示找不到路径,或监听服务启动异常。打开注册表,进入HKEY_LOCAL_MACHINE/SYSTEM/Current

ControlSet/Services/OracleOraHome92TNSListener项,查看ImagePath字符串项是否存在,如果没有,设定值为D:oracleora92BINTNSLSNR,不同的安装路径设定值做相应的更改。这种方法同样适用于Oracle实例服务,同上,找到如同HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/OracleServiceMYORACLE项,查看ImagePath字符串项是否存在,如果没有,则新建,设定值为d:oracleora92binORACLE.EXEMYORACLE。

以上是Oracle客户端连接服务器端常见的一些问题,当然不能囊括所有的连接异常。解决问题的关键在于方法与思路,而不是每种问题都有固定的答案。

-10-

友情提示:本文中关于《如何保护好Oracle服务器上的监听器》给出的范例仅供您参考拓展思维使用,如何保护好Oracle服务器上的监听器:该篇文章建议您自主创作。

  来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。


如何保护好Oracle服务器上的监听器
由互联网用户整理提供,转载分享请保留原作者信息,谢谢!
http://m.bsmz.net/gongwen/747151.html
相关阅读
最近更新
推荐专题