[图文]如何保护好Oracle服务器上的监听器

[图文]如何保护好Oracle服务器上的监听器,第1张

Oracle监听器是Oracle服务器软件的一个组件,它负责管理Oracle数据库客户端之间的通讯,它在一个特定的网卡端口(默认是TCP 15

Oracle监听器简介

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

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

为什么要保护监听器?

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

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

怎么保护监听器?

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

1、 设备监听器密码

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

LSNRCTL> set current_listener

LSNRCTL> change_password

old password:

New password:

Reenter new password:

LSNRCTL> set password Password:

LSNRCTL> save_config

设置好密码后,打开listenerora,看是否有一条PASSWORDS_的记录,类似于PASSWORDS_LISTENER = F4BAA4A006C26134。为监听器设置了密码后,,必须到客户端重新配置连接。

2、 开启监听器日志

开启监听器日志功能是为了捕获监听器命令和防止密码被暴力破解。开启监听器日志功能的命令为:

LSNRCTL> set current_listener

LSNRCTL> set password Password:

LSNRCTL> set log_directory /network/admin

LSNRCTL> set log_file log

LSNRCTL> set log_status on

LSNRCTL> save_config

通过运行上面的命令,监听器将会在/network/admin目录下创建一个log日志文件,以后可以打开该文件查看一些常见的ORA-错误信息。

3、 在listenerora中设置ADMIN_RESTRICTIONS

在listenerora文件中设置了ADMIN_RESTRICTIONS参数后,当监听器在运行时,不允许执行任何管理任何,届时,set命令将不可用,不论是在服务器本地还是从远程执行都不行,这时如果要修改监听器设置就只有手工修改listenerora文件了,通过手工修改listenerora,要使修改生效,只能使用lsnrctl reload命令或lsnrctl stop/start命令重新载入一次监听器配置信息。在listenerora文件中手动加入下面这样一行:

ADMIN_RESTRICTIONS_ = ON

4、 打上最新的监听器补丁

这一点就与操作系统类似,数据库也有bug,也有漏洞,黑客会在漏洞发现第一时间扫描未打补丁的服务器,所以作为一个称职的DBA要随时关注Oracle的CPU(呵呵,不是处理器,是关键补丁升级的意思),这里要说明的是Oracle的补丁是自动累加的,就像windows xp sp2的内容包括了sp1的所有内容一样,所以只需要按照最新的补丁集就可以了,还有一点要注意的是在生产系统上应用任何补丁前都需要先在测试环境进行测试,保证升级后不影响正常业务才进行升级。最后要说明的是,只有购买了Oracle的正式许可才可以登陆下载补丁,否则就只有从第三方地址下载,其完整性就不能保证了。

5、 利用防火墙阻止SQLNET

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

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

6、 保护$TNS_ADMIN目录

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

7、 保护TNSLSNR和LSNRCTL

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

8、 移除不用的服务

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

9、 改变默认的TNS端口号

改变监听器监听的端口号与修改ftp服务器默认的21端口,web服务器的80端口类似,因为Oracle默认的监听端口是1521(Oracle还正式注册了两个新的端口号2483和2484,说不定哪个新版本发布后,可能默认的端口号就会是这两个了,其中2484用于SSL类型的连接),几乎所有的扫描器都可以直接扫描这个端口是否打开,如果设置为一个不常用的端口号,可能会给人一种假象,而且即使扫描到端口打开,也还要猜测该端口运行是究竟是什么服务,攻击难度就加大了。在修改端口的时候也不要设在1521-1550和1600-1699范围内,虽然通过修改默认端口并不算什么高级防护技术,但至少可以防止自动攻击,以及在端口1521上的简单扫描。

可直接编辑listenerora中端口号,也可以通过netca程序进行修改,当然在客户端也要做对应的修改才行。同时要设置初始化参数LOCAL_LISTENER,这样在监听端口发生变化后,数据库才会自动进行监听器重新注册。

10、 设置节点验证

根据应用程序和网络配置情况,采用节点验证对于保护监听器是一种强有力的方法,大部分Web应用程序都只需要从应用服务器访问监听器,以及一台管理客户端,对于Oracle 8/8i,在$ORACLE_HOME/network/admin/protocolora文件中添加节点检查语句,对于Oracle 9i/10g,在$ORACLE_HOME/network/admin/sqlnetora文件中添加节点检查语句,语句的格式都一样,如:

tcpvalidnode_checking = yes

tcpinvited_nodes = ( xxxx | name, xxxx | name)

tcpexcluded_nodes=( xxxx | name, xxxx | name)

注意:这里要么使用invited_nodes语句,要么使用excluded_nodes,不能同时都使用,也不能使用通配符,子网等,只能使用明确的ip地址或主机名。这里的xxxx指的就是如1921681100这样的ip地址,name就是主机名,如果有多个ip地址或主机名,使用逗号进行分隔。

设置了节点验证后,监听器需要重新启动才会生效。使用这种方法进行节点验证会消耗一定的系统资源和网络带宽,如果要验证的地址过多,靠手工添加也很麻烦,这时可以使用Oracle Connection Manager,如果是有许多客户端通过SQLNET访问数据库,使用这种节点验证的方法也不可行,那会相当的慢。

11、 监视日志

在前面的方法中开启了监听器日志功能,在产生了日志信息后,要对其进行分析,常见的可在日志文件中查找是否有TNS-01169,TNS-01189,TNS-01190或TNS-12508错误,如果有这些错误,至少可以说明要么有人攻击,要么有异常活动,进一步可以使用shell基本或一些简单的管理工具将这些有用的日志信息定期发送给DBA,实现实时监控效果。

下面是对前面提到的几个常见错误的描述:

小结

通过上面这11种方法对Oracle监听器进行保护后,想要通过监听器进行破坏活动基本上就很困难了,不能保证100%拦截攻击,也至少有99%的效果,另外那1%可能就是DBA本身犯的一些低级错误了,如不小心将监听器密码泄露给他人,或将配置信息暴露在Internet上。

请按如过程检查:

1 服务器,可否正常登录数据库并查询数据sqlplus

2 服务器上 用sqlplus user/pwd@orcl 的方式能否登录?

3 服务器的防火墙是否开着,是否没有为oracle调整过

4 客户端用oracle sql developer 连接时,地址,端口,数据库实例名,用户名,密码,是否都正确?

5 对于使用oci连接(pl/sql developer、toad等)的客户端,本地网络服务名 (tnsnamesora中的配置内容)配置的内容是否正确

oracle客户端与服务端有什么区别:

1、oracle服务端是指装在数据库服务器上的oracle主服务,数据库的核心,用于数据库的管理,数据的与存储、查询、数据库资源的监控、监听等服务。

oracle客户端只是指与服务端交互的工具,要登录使用oracle数据库服务就需要安装客户端(例如PLSQL),利用PLSQL连接到数据库,来执行oralce服务的一些增删改查等操作。

2、服务器端不一定在本地(client一定在本地),所以需要在客户端配置TNSNAMESORA文件。在文件中添加服务名和IP。

3、oracle数据库服务都会有一个全局数据库名例如:orcl,这是在安装数据库时指定的。如果要安装多个数据库,那么这个全局数据库名必须不一样。服务器端的listener文件里配置有监听程序,可以配置多个监听IP。

而oracle客户端连接服务端是就要配置oracle的实例名来确认数据库信息。

4、服务器端的客户工具是通过服务器端tnsnamesora和listenerora进行验证并建立连接;

远程客户端是通过客户端的tnsnamesora和服务器端的listenerora执行验证和建立连接。

一、监听器(LISTENER)

  监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求。既然是基于服务器端的服务,那么它也只存在于数据库服务器端,进行监听器的设置也是在数据库服务器端完成的。

二、本地服务名(Tnsname)

  Oracle客户端与服务器端的连接是通过客户端发出连接请求,由服务器端监听器对客户端连接请求进行合法检查,如果连接请求有效,则进行连接,否则拒绝该连接。

本地服务名是Oracle客户端网络配置的一种,另外还有Oracle名字服务器(Oracle Names Server)等。Oracle常用的客户端配置就是采用的本地服务名,本文中介绍的也主要是基于本地服务名的配置。

三、Oracle网络连接配置方法

  配 置Oracle服务器端与客户端都可以在其自带的图形化Oracle网络管理器(Oracle Net Manager)里完成(强烈建议在这个图形化的工具下完成Oracle服务端或客户端的配置)。在Windows下,点击“开始/程序/Oracle - OraHome92/Configuration and Migration Tools/Net Manager”启动Oracle网络管理器工具,在Linux/Unix下,利用netmgr命令来启动图形化Oracle网络管理器,如:

$ netmgr

Windows下启动Net Manager图形窗口如下图示:

Oracle

1、 Oracle监听器配置(LISTENER)

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

Oracle

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

Oracle

  保 存以上配置,默认即可在Oracle安装目录下找到监听配置文件 (Windows下如D:oracleora92networkadminlistenerora,Linux/Unix下$ ORACLE_HOME/network/admin/listererora)。至此,Oracle服务端监听器配置已经完成。

2、 本地服务名配置(Tnsnames)

  本 地服务名是基于Oracle客户端的网络配置,所以,如果客户端需要连接数据库服务器进行操作,则需要配置该客户端,其依附对象可以是任意一台欲连接数据 库服务器进行操作的pc机,也可以是数据库服务器自身。如前面所介绍,可以利用Oracle自带的图形化管理工具Net Manager来完成Oracle客户端的配置。选中如图(一)中的服务命名,再点击左上侧“+”按钮,弹出如下图示对话框:

Oracle

  输入Net服务名,如myoracle,点击下一步,进入下图示对话框:

Oracle

选中TCP/IP(Internet协议),点击下一步,如下图示:

Oracle

  输入主机名与端口号。注意这里的主机名与端口号必须与数据库服务器端监听器配置的主机名和端口号相同。点击下一步,如下图示:

Oracle

  选 中(Oracle8i或更高版本)服务名,输入服务名。这里的服务名实际上就是数据库服务器端监听器配置中的全局数据库名,前者与后者必须相同。连接类型 通常选专用服务器,这要视数据库服务器的配置而定,如果配置的共享数据库服务器,这里的连接类型就要选共享服务器,否则建议选专用服务器(关于专用服务器 的介绍请参阅相关文档)。配置好后点击下一步,如下图示:

Oracle

 如 果数据库服务器端相关服务启动了,可以点击测试按钮进行连接测试。Oracle默认是通过scott/tiger用户进行测试连接,由于scott用户是 Oracle自带的示例用户,对于正式的业务数据库或专业测试数据库可能没有配置这个用户,所以需要更改成有效的用户登录才可能测试成功。如果这里测试连 接不成功,也不要紧,先点完成按钮结束配置。

  回 到Oracle网络管理器(Oracle Net Manager)主窗口,保存配置,默认即可在Oracle安装目录下找到本地服务名配置文件 (Windows下如D:oracleora92networkadmintnsnamesora,Linux/Unix下$ ORACLE_HOME/network/admin/ tnsnamesora)。配置完成的本地服务名如下图示:

Oracle

  树形目录下的服务命名可以通过编辑菜单里的重命名菜单更改成任意合法字符组成的服务名称,注意服务名称前不能有空格字符,否则可能无法连接数据库服务器。

3、 连接数据库服务器

(1) 启动服务器端监听器与数据库服务

Linux/Unix下,启动监听器:

$ lsnrctl start

关闭监听器:

$ lsnrctl stop

查看监听状态:

$ lsnrctl status

启动数据库:

$ sqlplus /nolog

SQL>conn sys@myoracle as sysdba --这里的myoracle是前面配置的客户端本地服务名

SQL>conn / as sysdba

SQL>startup

Windows下,启动监听器:

C:lsnrctl start

启动Oracle实例服务:

C:oradim a href="http://gamepchomenet/pcgame" class="none" title="cs" rel="external">cstartup –sid myoracle

关闭Oracle实例服务:

C:oradim –shutdown –sid myoracle

  以上服务必须同时启动,客户端才能连接数据库。由于默认配置的监听器名称是Listener,上述命令可以正常启动监听器,如果监听器名称是其它名称,如aListener,则需要用下列方式才能启动:

Linux/Unix下:

$ lsnrctl start aListener

Windows下:

C:lsnrctl start aListener

(2) 测试连接数据库服务器

  测试的方法多种多样,可以在上面配置本地服务名时进行测试,也可以是第三方客户端工具,如PL/SQL Developer,最方便的是用Oracle自带的sqlplus工具,以下利用sqlplus进行测试:

C:sqlplus /nolog

SQL>conn zgh@myoracle

已连接。

四、客户端连接服务器端常见问题排除方法

  要排除客户端与服务器端的连接问题,首先检查客户端配置是否正确(客户端配置必须与数据库服务器端监听配置一致),再根据错误提示解决。下面列出几种常见的连接问题:

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

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

$ lsnrctl start

C:lsnrctl start

2、 ORA-12500: TNS: 监听程序无法启动专用服务器进程

对于Windows而言,没有启动Oracle实例服务。启动实例服务:

C:oradim –startup -sid myoracle

3、 ORA-12535: TNS: 操作超时

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

4、 ORA-12154: TNS: 无法处理服务名

  检 查输入的服务名与配置的服务名是否一致。另外注意生成的本地服务名文件(Windows下如D:oracleora92networkadmin tnsnamesora,Linux/Unix下/network/admin/tnsnamesora)里每项服务的首 行服务名称前不能有空格。

5、 ORA-12514: TNS: 监听进程不能解析在连接描述符中给出的 SERVICE_NAME

  打开Net Manager,选中服务名称,检查服务标识栏里的服务名输入是否正确。该服务名必须与服务器端监听器配置的全局数据库名一致。

6、 Windows下启动监听服务提示找不到路径

  用 命令或在服务窗口中启动监听提示找不到路径,或监听服务启动异常。打开注册表,进入HKEY_LOCAL_MACHINE/SYSTEM/Current ControlSet/Services/OracleOraHome92TNSListener项,查看ImagePath字符串项是否存在,如果没 有,设定值为D:oracleora92BINTNSLSNR,不同的安装路径设定值做相应的更改。这种方法同样适用于Oracle实例服务,同 上,找到如同HKEY_LOCAL_MACHINE/SYSTEM/Current ControlSet/Services/Oracle ServiceMYORACLE项,查看ImagePath字符串项是否存在,如果没有,则新建,设定值为d:oracleora92 binORACLEEXE MYORACLE。

你把端口关闭,不就解决问题了? 139的关闭方法在控制面板上点击管理工具-本地安全策略,右击"IP安全策略,在本地计算机"选择"管理IP筛选器表和筛选器操作",点添加,在对话框里填,随便写只要你记得住最好还是写"禁用139端口"比较看的懂点右边的添加->下一步->源地址为"任何地址"->目的地址"我的地址"->协仪为TCP->在到此端口里填"139"就可以

还有一个办法就是TCP/IP协仪里禁用NETBIOS 1433的关闭方法比较麻烦 方法有三种:

1、最简单的是在网卡TCP/IP协议的属性--高级--[TCP/IP筛选]里设置。方法是:

[设置]--[网络和拨号连接],右击[本地连接]--[属性]--TCP/IP协议--[属性]--[高级]--[选项]--[TCP/IP筛选]--[属性],在这里就可以设置端口的打开关闭。

但这里要吗就“全部允许”,要吗就“只允许”。要把常用的端口都添加,否则,缺了那些端口,那些上网功能就没了。

2、使用IPSEC安全策略(这个方法麻烦一点):

IPSEC安全策略被誉为是WIN2000自带的‘防火墙’,不过它的RULE(规则)不是很直观罢了。每一个RULE由两部分组成,“条件”与“行为”,思路是:当满足某个“条件”时就执行某个“行为”。建立一个RULE一共需要四个步骤:

(1)建立“条件”、

(2)建立“行为”、

(3)建立策略(RULE)群,把“条件”与“行为”连起来)、(4)击活策略。

(1)建立RULE(规则)示例,以端口445/TCP为例:

打开[本地安全策略]--右击“IP安全策略,在本地机器”--“管理IP筛选器表和筛选器操作”--“管理IP筛选器列表”--“添加”;

随便写个“名称”和“描述”,方便自己记忆就行,什么都可以,例如写“禁止TCP445”;然后“下一步”--“添加”--“下一步”--“源地址”选“任何IP地址”,“下一步”--“目标地址”选“自己的IP地址”,“下一步”--“选择协议类型”,选‘TCP’,“下一步”--选择“从任意端口”“到此端口”;“到此端口”栏填“445”,“下一步”--“完成”(把“编辑属性”栏钩上再按“完成”。

在跳出的窗口中,可以选择是否“镜象”,此选项会把此规则用到源地址与目标地址相反的条件上去)。这样,就完成了建立“条件”的工作了。

(2)回到楼上的第三步“管理IP筛选器表和筛选器操作”--“管理筛选器操作”--“添加”--“下一步”--添写“名称”和“描述”,例如写“阻止”,“下一步”--选择“阻止”,“下一步”--“完成”(这里也有‘编辑属性’,不过没什么用的,建议不要选)。建立“行为”完成了。

(3)建立RULE:回到“本地安全策略”--右击“IP安全策略,在本地机器”--“创建IP安全策略”--“下一步”--填写“名称”和“描述”,例如写上“我的防火墙”,“下一步”--取消“击活默认响应规则”选项的勾选,“下一步”--钩上“编辑属性”,“完成”。

--在跳出的属性窗体中的“规则”栏中,点击“添加”--“下一步”--‘下一步’--‘下一步’--到“身份验证方法”中,您可以选择使用WINDOWS 2000默认值(第一项)、也可以选择使用自己定义的字符串(第三项);“下一步”--出现一个列表,在里面选择原来建立的“禁止TCP445”,

“下一步”--到选择“行为”了,选择原来建立好的“阻止”,“下一步”--“完成”。按“确定”,关闭属性窗口。如果还要建立其他的RULE,可以双击原来建立好的“我的防火墙”策略,然后“添加”,重复上面的操作步骤就可以建立其他RULE。

(4)击活策略:在“本地安全策略”--点击“IP安全策略,在本地机器”->在右面的窗口,右击“我的防火墙”--点击“指派”就激活了。

此方法较为可靠,在不阻碍用户正常使用的情况下又可以阻止黑客的入侵;只是操作有点麻烦。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » [图文]如何保护好Oracle服务器上的监听器

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情