热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

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

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

Oracle监听器简介

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

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

为什么要保护监听器?

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

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

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

怎么保护监听器?

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

1、 设备监听器密码

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

LSNRCTL> set current_listener <监听器名>

LSNRCTL> change_password

old password: <如果之前没有设置密码就直接按回车>

New password: <输入新密码>

Reenter new password: <再次输入新密码>

LSNRCTL> set password Password: <输入刚刚设置的新密码>

LSNRCTL> save_config

设置好密码后,打开listener.ora,看是否有一条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、 在listener.ora中设置ADMIN_RESTRICTIONS

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

ADMIN_RESTRICTIONS_<监听器名> = ON

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

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

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类型的连接),几乎所有的扫描器都可以直接扫描这个端口是否打开,如果设置为一个不常用的端口号,可能会给人一种假象,而且即使扫描到端口打开,也还要猜测该端口运行是究竟是什么服务,攻击难度就加大了。在修改端口的时候也不要设在1521-1550和1600-1699范围内,虽然通过修改默认端口并不算什么高级防护技术,但至少可以防止自动攻击,以及在端口1521上的简单扫描。

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

10、 设置节点验证

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

tcp.validnode_checking = yes

tcp.invited_nodes = ( x.x.x.x | name, x.x.x.x | name)

tcp.excluded_nodes=( x.x.x.x | name, x.x.x.x | name)

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

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

11、 监视日志

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

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

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

小结

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


推荐阅读
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在Hibernate配置lazy=false时无法加载数据的问题,通过采用OpenSessionInView模式和修改数据库服务器版本解决了该问题。详细描述了问题的出现和解决过程,包括运行环境和数据库的配置信息。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文比较了eBPF和WebAssembly作为云原生VM的特点和应用领域。eBPF作为运行在Linux内核中的轻量级代码执行沙箱,适用于网络或安全相关的任务;而WebAssembly作为图灵完备的语言,在商业应用中具有优势。同时,介绍了WebAssembly在Linux内核中运行的尝试以及基于LLVM的云原生WebAssembly编译器WasmEdge Runtime的案例,展示了WebAssembly作为原生应用程序的潜力。 ... [详细]
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了adg架构设置在企业数据治理中的应用。随着信息技术的发展,企业IT系统的快速发展使得数据成为企业业务增长的新动力,但同时也带来了数据冗余、数据难发现、效率低下、资源消耗等问题。本文讨论了企业面临的几类尖锐问题,并提出了解决方案,包括确保库表结构与系统测试版本一致、避免数据冗余、快速定位问题等。此外,本文还探讨了adg架构在大版本升级、上云服务和微服务治理方面的应用。通过本文的介绍,读者可以了解到adg架构设置的重要性及其在企业数据治理中的应用。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis错题分析解析及注意事项
    本文对MyBatis的错题进行了分析和解析,同时介绍了使用MyBatis时需要注意的一些事项,如resultMap的使用、SqlSession和SqlSessionFactory的获取方式、动态SQL中的else元素和when元素的使用、resource属性和url属性的配置方式、typeAliases的使用方法等。同时还指出了在属性名与查询字段名不一致时需要使用resultMap进行结果映射,而不能使用resultType。 ... [详细]
author-avatar
多米音乐_34249295
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有