操作计划
找到 SYS、SYSTEM 和 OUTLN 之外的用户的默认表空间。 如果默认表空间为 SYSTEM,则将其更改为非 SYSTEM 表空间。 找到属于 SYS、SYSTEM 和 OUTLN 之外的用户的 SYSTEM 表空间段。 如果找到,则 |
|
将它们移出到它们的表空间 重新构建索引、物化视图等。 |
ENDIF 找到具有 UNLIMITED TABLESPACE 系统权限的用户 如果找到,则 |
|
向他们授予所有表空间(SYSTEM 和 SYSAUX 除外)的无限份额 撤销系统权限 UNLIMITED TABLESPACE |
ENDIF |
2.9 监控监听器日志以获知尝试的非法入侵
背景 在阶段 1.7 中,您了解了如何通过限制在线更改参数的能力来保护 Oracle Listener。 这样做很不错,但您如何知道是否有人尝试非法入侵以及何时尝试非法入侵? 防止入侵只是预防措施的一部分;跟踪防御的有效性同样重要。
您可以从监听器日志文件中浏览已尝试的失败登录。 当用户提供错误口令并尝试修改监听器时,以下消息将写入监听器日志: 12-NOV-2005 23:23:12 * (CONNECT_DATA=(CID=(PROGRAM=)(HOST=prolin01)(USER=ananda
))(COMMAND=stop)(ARGUMENTS=64)(SERVICE=LISTENER_PROLIN01)(VERSION=168821760)) * stop * 1190
TNS-01190: The user is not authorized to execute the requested listener command
该消息表明 11 月 12 日晚上 11:23,用户“ananda”尝试停止监听器(注意 (COMMAND=stop) 的存在),但提供了错误的口令。 这是否表示尝试的非法入侵? 有可能。 ananda 也可能是一个合法用户,但在输入口令时出现输入错误,从而产生此错误。 但如果您多次看到此错误,则它实际上可能指示尝试的非法入侵。应访问用户 ananda 并验证它实际上是否尝试停止监听器。
同样,在监听器中限制 admin 选项时,用户无法只从命令行设置参数。 如果用户尝试使用以下命令: $ 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;
这样,监控将变得非常简单。 发现失败登录尝试所要执行的操作就是发出 col l_user format a10with the embedde
col service format a20
col logdate format a20
col host format a10
col RC format a5
select to_char(log_date,'mm/dd/yy hh24:mi:ss') logdate,
extract_value (connect_data,'HOST') host,
extract_value (connect_data,'USER') l_user,
extract_value (connect_data,'SERVICE') service,
action RC
from listener_log
where extract_value (connect_data, 'COMMAND') in
(
'password',
'rawmode',
'displaymode',
'trc_file',
'trc_directory',
'trc_level',
'log_file',
'log_directory',
'log_status',
'current_listener',
'inbound_connect_timeout',
'startup_waittime',
'save_config_on_stop',
'start',
'stop',
'status',
'services',
'version',
'reload',
'save_config',
'trace',
'spawn',
'change_password',
'quit',
'exit'
)
这返回类似如下所示的输出 LOGDATE COMMAND HOST L_USER SERVICE RC
-------------------- --------------- ---------- ---------- -------------------- -----
10/02/05 02:57:36 stop prlddb01 oraprld LISTENER_PRLDDB01 0
10/02/05 04:47:03 stop prlddb01 oraprld listener_prlddb01 0
10/03/05 15:14:53 stop prlddb01 oraprld LISTENER_PRLDDB01 0
11/18/05 23:48:26 reload prlddb01 oraprld LISTENER_PRLDDB01 0
您可以看到,该输出显示了命令的日期和时间以及返回代码。 也可以修改此查询以只显示返回代码不为 0 的值。此外,还可以添加一个谓词以只显示某个日期之后的记录,以便只显示当天的尝试。 如果每天均运行此脚本,则只能看到当日的尝试。
上面只显示了无效口令的数据。 对于管理限制的监听器,该错误字符串只显示三个字段,因此表 LISTENER_LOG 的列具有不同的含义: 第二列显示用户发出的命令,第三列显示返回代码。 select
log_date,
connect_data command,
protocol_data return_code
from listener_log
where connect_data in
(
'password',
'rawmode',
'displaymode',
'trc_file',
'trc_directory',
'trc_level',
'log_file',
'log_directory',
'log_status',
'current_listener',
'inbound_connect_timeout',
'startup_waittime',
'save_config_on_stop',
'start',
'stop',
'status',
'services',
'version',
'reload',
'save_config',
'trace',
'spawn',
'change_password',
'quit',
'exit'
)
/
这返回: LOG_DATE COMMAND RETURN_CODE
--------- -------------------- ---------------
06-NOV-05 change_password 0
06-NOV-05 save_config 0
06-NOV-05 log_file 0
06-NOV-05 trc_level 12508
06-NOV-05 save_config_on_stop 12508
06-NOV-05 log_directory 12508
06-NOV-05 log_directory 12508
06-NOV-05 stop 1169
06-NOV-05 stop 1169
06-NOV-05 services 1169
06-NOV-05 status 1169
06-NOV-05 reload 1169
06-NOV-05 status 1169
06-NOV-05 stop 1169
06-NOV-05 status 1169
06-NOV-05 stop 1169
可能的影响 无;该活动只是一个诊断活动。
操作计划
- 创建监听器日志外部表。
- 选择在无口令情况下发出管理命令的记录(可以由非零返回值标识)。
- 选择根据监听器控制提示发出命令的记录。
- 如果找到无法由任何 DBA 执行的活动解释的记录,则您可能标识了错误内容。
(编辑:aniston)
|