技术开发 频道

从监听器日志中挖掘信息

  【IT168 技术文章】

  提起日志,可能你会一下子想到操作系统日志,数据库日志,但今天我们不说那些日志,今天要说的是数据库监听器日志,监听器日志记录了监听器所有操作,包括成功的和不成功的,从日志中还可以发现针对监听器的攻击行为,因为监听器常常是黑客攻击Oracle数据库的首要目标,本文主要是想介绍一下从监听器日志中挖掘一些有用的信息。

  监听器日志是一个标准的文本文件,但如果直接用文本编辑器,如记事本打开它来寻找想要的信息可能有点困难,这里介绍另一种方法,使用扩展表和SQL语句来查找,将日志中的每一行填充为扩展表中的每一条记录,下面介绍具体的实现步骤。

  1、创建日志目录对象

create directory LISTENER_LOG_DIR

  
as 'C:\oracle\product\10.2.0\db_1\network\log\'

  
/

  如果你不清楚你的监听器日志放在哪里,可以使用lsnrctl status命令查看,在命令输出结果中就指出了监听器日志文件的路径。

  2、创建扩展表 

create table full_listener_log

  (

  line
varchar2(4000))

  organization external (

  type oracle_loader

  
default directory LISTENER_LOG_DIR

  access parameters (

  records delimited
by newline

  nobadfile

  nologfile

  nodiscardfile

  )

  location (
'listener.log')

  )

  reject limit unlimited

  
/

  如果有多个监听器,那么在location处,要做相应的修改,这里的日志文件名要与lsnrctl status输出的保持一致。

  现在已经可以查询full_listener_log表了,如查询日志写入信息: 

SQL> select * from full_listener_log

  
2 where line like 'Log messages written%'

  
3 /

  然而查询出来的信息还是非常原始的,我们的目标是要找出真正有用的信息,于是要对日志文件的每一行的内容再进行分解,通常,监听器日志文件大部分行都含有下列字段:

  A)日志条目的日期和时间戳

  B)客户端连接使用的字符串

  C)客户端使用的协议信息(TCP/IP,端口号等)

  D)客户端的行为,如状态,建立连接等

  E)客户端连接字符串中的服务名

  F)客户端行为返回的代码,如果返回0,表示操作成功,否则就显示错误代码

  每个字段之间使用星号(*)进行分隔。注意不是每条日志条目都遵循这个格式,如下面的日志内容:

TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production on 01-9月 -2008 11:48:15

  Copyright (c)
1991

  系统参数文件为C:\oracle\product\
10.2.0\db_1\network\admin\listener.ora

  写入C:\oracle\product\
10.2.0\db_1\network\log\listener.log的日志信息

  写入C:\oracle\product\
10.2.0\db_1\network\trace\listener.trc的跟踪信息

  跟踪级别当前为0

  它们每一行是一个整体,无法进行分解。对于这些总结性的信息,我们可以忽略它们。还有一些条目大致遵循前面所说的格式,但有些字段没有,如下面这条监听器注册信息:

 01-9月 -2008 11:48:31 * service_register * orcl * 0

  它只包括了四个字段:时间戳,行为,服务名和返回代码。即使只有四个字段,也还是可以分解它们,只不过要注意字段的对应了。所以要建立一个标准表也不困难,下面就是创建日志分解扩展表的脚本:  

create table listener_log

  (

  log_date date,

  connect_string
varchar2(300),

  protocol_info
varchar2(300),

  action
varchar2(15),

  service_name
varchar2(15),

  return_code
number(10)

  )

  organization external (

  type oracle_loader

  
default directory LISTENER_LOG_DIR

  access parameters

  (

  records delimited
by newline

  nobadfile

  nologfile

  nodiscardfile

  fields terminated
by "*" lrtrim

  missing field
values are null

  (

  log_date
char(30) date_format

  date mask "DD
-MON-YYYY HH24:MI:SS",

  connect_string,

  protocol_info,

  action,

  service_name,

  return_code

  )

  )

  location (
'listener.log')

  )

  reject limit unlimited

  
/

  和前一个扩展表创建脚本一样,可能你要修改一下localtion位置的日志文件名,创建好后,该表的结构如下:  

LOG_DATE DATE

  CONNECT_STRING
VARCHAR2(300)

  PROTOCOL_INFO
VARCHAR2(300)

  ACTION
VARCHAR2(15)

  SERVICE_NAME
VARCHAR2(15)

  RETURN_CODE
NUMBER(10)

  下面对其中两个有嵌套信息的字段的含义进行说明:

  a) CONNECT_STRING

  它包含的内容是数据库连接信息,连接字符串又可以拆分成多个组件:

   SID – Oracle SID,只有当用户使用SID进行连接时才有该值,否则就为空。

   CID – 它下面又包括多个组件:

  (1) PROGRAM 客户端使用的程序名字

  (2) HOST 客户端主机名称

  (3) USER 操作系统用户名,在客户端就是以该用户登陆向数据库发出命令的

   SERVER – 显示客户端使用的连接类型,包括DEDICATED或SHARED两种。

   SERVICE_NAME –如果客户端使用的是服务名而不是SID进行连接,这里显示的就是所使用的服务名了。

   COMMAND – 用户发出的命令,也有可能是其它进程发出的命令,用户可能发出如“lsnrctl status”命令查看监听器的状态,pmon进程可能发出“service_update”命令用它载入的数据更新监听器,总的来说,COMMAND命令可以有下面几个:services,status,stop,service_register,service_update,service_died。

   SERVICE – 只有发出了监听器控制命令如status,services后它才会出现,它又包括了下面的信息:

  (1) DESCRIPTION

  (1.1) ADDRESS

  (1.1.1) PROTOCOL

  (1.1.2) HOST

  (1.1.3) PORT

   FAILOVER_MODE – 只有当客户端使用了故障转移连接字符串它才会出现,它又包括了四个元素:

  (1) TYPE 故障转移的类型,如BASIC。

  (2) METHOD 故障转移的方法,如PRESELECT。

  (3) RETRIES 客户端重试的次数。

  (4) DELAY 在连接尝试间的延迟。

  值得注意的是,在监听器日志文件中,不是上面所说的每一个元素都会出现,如客户端使用服务名连接数据库时,就不会出现SID,出现这种情况时,对应的字段内容就为空,如(SID=),等号后面没有任何值,这个时候就要注意在查询结果时你要知道它的含义。

  b) PROTOCOL_INFO

  协议信息,它又包括了下面的元素:

   PROTOCOL – 客户端连接时使用的协议,如TCP,IPC。

   HOST – 客户端主机的IP地址。

   PORT – 监听器连接使用的端口号(注意不是监听器监听的端口号)。

0
相关文章