$ lsnrctl
LSNRCTL> set trc_level support
他将立即获得错误。 TNS-12508: TNS:listener could not resolve the COMMAND given
以下条目将出现在监听器日志文件中。 12-NOV-2005 23:26:34 * trc_level * 12508
TNS-12508: TNS:listener could not resolve the COMMAND given
该条目指示某人曾尝试直接对 LSNRCTL 提示设置 trc_level。 这可能也是个正常的错误,但重复尝试可能表示存在攻击。
策略 最好的方法是定期检查这些模式的监听器日志文件。 可以通过多种方法执行该操作。
首先,您可以使用以下代码编写一个 shell 脚本: $ grep "(COMMAND=stop)" listener.log | cut -f4 -d"*"
以下输出将指示监听器命令 STOP 已发出三次: 0
0
0
还可以使用复杂工具(如 awk)或脚本语言(如 PERL)使该脚本提供更丰富的信息。 但如果您对 SQL 最熟悉(这种情况很有可能),则使用 SQL 从此日志文件中提取信息将更具有吸引力。
此处的技巧是将监听器日志用作外部表。 首先,为监听器日志所在的目录创建一个 directory 对象。 create directory listener_log_dir
as
'/u01/app/oracle/10.1/db1/network/log'
/
然后,为日志文件创建外部表。 仔细留意日志文件的内容;它通常包含六个由“*”字符分隔的信息部分。 这些部分将成为外部表的列。 create table listener_log
(
log_date date,
connect_data varchar2(300),
protocol_data varchar2(300),
command 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_datechar(30) date_format
date mask "DD-MON-YYYY HH24:MI:SS",
connect_data,
protocol_data,
command,
service_name,
return_code
)
)
location ('listener_prolin01.log')
)
reject limit unlimited
/
创建表后,可以从中进行选择以确保定义正确。
这些行的描述性很高,但嵌入的命令(如 (COMMAND=stop))可能使它难于破解。 这种情况下,编写另一个函数以提取字符串中的值: create or replace function extract_value
(
p_in varchar2,
p_param in varchar2
)
return varchar2
as
l_begin number(3);
l_end number(3);
l_val varchar2(2000);
begin
l_begin := instr (upper(p_in), '('||p_param||'=');
l_begin := instr (upper(p_in), '=', l_begin);
l_end := instr (upper(p_in), ')', l_begin);
l_val := substr (p_in, l_begin+1, l_end - l_begin - 1);
return l_val;
end;
(编辑:aniston)
|