首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第7期->安全文摘
期刊号: 类型: 关键词:
构建SYSLOG系统详解

作者:iamin deepin@21cn.com
日期:2000-05-23

一:介绍
牋牋系统log是管理员每日需要查看的文件记录。里面记载了大量系统正常和不正常的运行信息,
对管理员分析系统的状况,监视系统的活动是一个相当重要的部分。如何有效的利用系统的log来
分析和定位攻击的可能呢?我将在下面的文章,介绍一下有关syslog如何配置和如何使用第三方
工具检查问题。

二: syslog.conf的详细说明
牋牋首先我们看看标准Unix Log系统的设置,对于不同类型的Unix,实际上除了一些关键词的不同,
系统的syslog.conf格式是相同的。syslog采用可配置的、统一的系统登记程序,随时从系统各
处接受log请求,然后根据/etc/syslog.conf中的预先设定把log信息写入相应文件中、邮寄给特
定用户或者直接以消息的方式发往控制台。值得注意的是,为了防止入侵者修改、删除messages
里的记录信息,可以采用用打印机记录或采用方式来挫败入侵者的企图。

以Sun Solaris 7牋为例
/etc/syslog.conf的一般格式如下:
#ident牋"@(#)syslog.conf牋牋牋牋1.4牋牋?6/10/11 SMI"牋?* SunOS 5.0 */
#
# Copyright (c) 1991-1993, by Sun Microsystems, Inc.
#
# syslog configuration file.
#
# This file is processed by m4 so be careful to quote (`') names
# that match m4 reserved words.牋Also, within ifdef's, arguments
# containing commas must be quoted.
#
*.err;kern.notice;auth.notice牋牋牋牋牋牋牋牋牋?dev/console
*.err;kern.debug;daemon.notice;mail.crit牋牋牋牋/var/adm/messages

*.alert;kern.err;daemon.err牋牋牋牋牋牋牋牋牋牋爋perator
*.alert牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋爎oot

*.emerg牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋?

# if a non-loghost machine chooses to have authentication messages
# sent to the loghost machine, un-comment out the following line:
#auth.notice牋牋牋牋牋牋牋牋牋牋ifdef(`LOGHOST', /var/log/authlog, @loghost)

mail.debug牋牋牋牋牋牋牋牋牋牋牋ifdef(`LOGHOST', /var/log/syslog, @loghost)牋牋
#
# non-loghost machines will use the following lines to cause "user"
# log messages to be logged locally.
#
ifdef(`LOGHOST', ,
user.err牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋/dev/console
user.err牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋/var/adm/messages
user.alert牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋`root, operator'
user.emerg牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋*
)牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋

syslog.conf的格式如下,既然大家都懒得看syslog.conf的man,那么只好我在这里再向大家讲一下了:

设备.行为级别 [;设备.行为级别] 记录行为
注意各栏之间用[Tab]来分隔,用空格是无效的。

第一栏:设备 描述

auth认证系统,即询问用户名和口令
cron 系统定时系统执行定时任务时发出的信息
daemon某些系统的守护程序的syslog,如由in.ftpd产生的log
kern 内核的syslog信息
lpr 打印机的syslog信息
mail 邮件系统的syslog信息
mark 定时发送消息的时标程序
news 新闻系统的syslog信息
user本地用户应用程序的syslog信息
uucp uucp子系统的syslog信息
local0..7 种本地类型的syslog信息,这些信息可以又用户来定义
*:代表以上各种设备


第二栏:行为级别 描述(危险程度递加)

debug 程序的调试信息
info 信息消息
notice 要注意的消息
warning 警告
err 一般性错误
crit 严重情况
alert 应该立即被纠正的情况
emerg紧急情况
none 指定的服务程序未给所选择的

第三栏:记录归属(举例) 描述

/dev/console send messages to devices 控制台,实际上是可以任何合法的设备名
/var/adm/messages write messages to files 写入/var/adm/messages,定义这里可以分类
写到不同的log文件中@loghost forward messages to a loghost 其他的日志记录服务器.
也叫loghost主机fred,user1 send messages to users 传送消息给某用户
(但此用户正登陆的时候可以看到)
*:send messages to all logged-in users 传送消息给所有的在线用户

@符号后面可以是ip,也可以是域名,默认在/etc/hosts文件下loghost这个别名已经指定给了本机。
如 “192.168.1.4牋牋爏un1.nsfocus.com牋牋loghost”
另外这一栏也支持m4的宏,下面我们看到的是一个标准的m4宏。在syslog.conf里可以通过
define(`LOGHOST`,hostname)来定义LOGHOST这个常量,注意的是这个LOGHOST可以不是/etc/hosts下
的loghost这个别名所指向的主机.
ifdef(`LOGHOST', ,
user.err牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋/dev/console
user.err牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋/var/adm/messages
user.alert牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋`root, operator'
user.emerg牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋*
)牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋


如果用打印机来记录日志文件,可以采用如下方法:
把打印机连接到终端端口/dev/ttya上,在/etc/syslog.conf中加入配置语句.
Auth.notice牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋牋?dev/ttya
如果是记录到log文件中,一定要注意此文件必须存在,且文件属性为600,否则无法记录log信息.

三.配置举例
这里举一个比较通用的例子,某一台主机的log记录要求,所有的认证信息存到auth.log ,各个deamon
的log,包括telnet,ftp的连接和状态记录到deamon.log,mail log单独记录到maillog.log文件,其他
信息记录与messages里面.另外所有的这些log同样要传到一台特定的loghost主机。我们首先在
/etc/hosts中定义一台主机的别名为loghost(当然你可以也可以直接在syslog.conf里指定loghost)


192.168.1.88牋牋牋牋deepin.nsfocus.com牋牋loghost
下面是符合条件的 syslog.conf的内容:
*.info;mail.none;auth.none;deamon.none牋牋/var/adm/messages
*.info;mail.none;auth.none;deamon.none牋牋@loghost
auth.notice牋牋牋牋/var/log/auth.log
auth.notice牋牋牋牋@loghost
deamon.info牋牋牋牋/var/log/deamon.log
deamon.info牋牋牋牋@loghost
mail.debug牋牋牋牋/var/log/mail.log
mail.debug牋牋牋牋@loghost

改好syslog.conf以后,在定义的目录下确认log文件是否存在,不存在,就用
touch /var/log/auth.log;chmod 600 /var/log/auth.log来建立一个.另外..不要忘记给syslog发
一个-HUP的信号.用ps –ef |grep syslogd找出syslogd的PID,再用kill –HUP (刚才查到的)PID
来让syslogd重新读取syslog.conf.定义的loghost需要配置吗?还是要作一点工作的.实际上最简单
的方法是用*.info牋牋/var/log/all.log
把所有主机各种级别的log记到一个大文件里面。。如果你在loghost上也想分类,按照常规写就是了。
在log记录中会有一个域标识主机名来区别来源于不同主机的log记录。

是不是比想像的简单?实际上也没有必要用m4的宏,直接写也很明了。要注意的是按照syslog的man
里面的说明,notice级别比info,waring低,但notice级别并不被Info包括也就是说用auth.waring或
auth.ifo是无法记录在认证时的系统信息的,不过这是在solairs下使用的结果,在linux和solairs
又不一样,auth.waring可以记录认证信息。

那么local0-7这几个设备名是怎么回事呢?
实际上用他们来记录自己开发的程序的信息是很方便的。例如在你写的某个shell脚本里,使用类似
与:logger –p local0.notice –t [tag]…这样的语句,可以利用syslogd帮你记录运行的信息,
当然你的syslog.conf也要加上一条
local0.notice牋牋/var/log/myapps.log
具体logger的用法,man logger看看就知道了。

四.Logcheck

由于业务繁忙的主机log往往相当巨大,很多无用的信息会把值得注意的log信息淹没起来,对于管理
员审计log相当不便,所以一些“偷懒”的管理员们往往自己写上一些脚本来作log的分类和整理工作。
当然,这些脚本也很容易在 internet上找到,一个易于使用且功能比较强大的工具是logcheck。
Logcheck可以在http://www.psionic.com/tools/logcheck-1.1.1.tar.gz 获得,安装是相当简便的,
仅仅只有一个标准的c程序需要编译,主要运行部分是一个shell脚本。

解开压缩包以后,运行make,按照它的提示选择你所使用的操作系统以后重新make以后,很快就能安装
完毕。配置文件和主运行脚本均默认安装在/usr/local/etc下主要是
logcheck.sh牋主要运行脚本,负责分析本次的log并汇报结果
logcheck.hacking牋可能有人攻击而在log记录中出现的关键词
例如,此文件里面默认包括了以下一些关键词
"wiz"
"WIZ"
"debug"
"DEBUG"
ATTACK
nested
VRFY bbs
VRFY decode
VRFY uudecode
VRFY lp
VRFY demo
VRFY guest
VRFY root
VRFY uucp
VRFY oracle
VRFY sybase
VRFY games
vrfy bbs
vrfy decode
vrfy uudecode
vrfy lp
vrfy demo
vrfy guest
vrfy root
vrfy uucp
vrfy oracle
vrfy sybase
vrfy games
expn decode
expn uudecode
expn wheel
expn root
EXPN decode
EXPN uudecode
EXPN wheel
EXPN root
LOGIN root REFUSED
rlogind.*: Connection from .* on illegal port
rshd.*: Connection from .* on illegal port
sendmail.*: user .* attempted to run daemon
uucico.*: refused connect from .*
tftpd.*: refused connect from .*
login.*: .*LOGIN FAILURE.* FROM .*root
login.*: .*LOGIN FAILURE.* FROM .*guest
login.*: .*LOGIN FAILURE.* FROM .*bin
login.*: .*LOGIN FAILURE.* FROM .*uucp
login.*: .*LOGIN FAILURE.* FROM .*adm
login.*: .*LOGIN FAILURE.* FROM .*bbs
login.*: .*LOGIN FAILURE.* FROM .*games
login.*: .*LOGIN FAILURE.* FROM .*sync
login.*: .*LOGIN FAILURE.* FROM .*oracle
login.*: .*LOGIN FAILURE.* FROM .*sybase
attackalert
同样,你可以自己分析系统的log,删除或增加必要的关键词
logcheck.violations 系统运行时出现的异常信息的关键词
logcheck.violations.ignore 系统出现异常信息,但包含在这个文件中的关键词的log记录视为正常,
并不作为logcheck报告异常信息的一部分logcheck.ignore 系统出现可能攻击的记录,但由于包含在
这个文件中的关键词的log记录视为正常,并不作为logcheck报告攻击部分的一部分

在安装完成以后,你还需要作以下两件事,一个是修改logcheck.sh中的一些参数使它符合你的要求,
一个是在你的cron任务里增加定时检测的任务。

Logcheck,sh里面注意的参数主要是:
# Person to send log activity to.
SYSADMIN=root
默认把logcheck的报告发给本机的root..当然你可能希望发给自己的信箱,改这里就可以了,如果你
希望把结果发给几个人,自己定义mial的别名去吧。

另一个位置:
# SunOS, Sun Solaris 2.5
$LOGTAIL /var/log/syslog > $TMPDIR/check.$$
$LOGTAIL /var/adm/messages >> $TMPDIR/check.$$
这个是sun标准存放log的地方,当然,我们不是自己定义过log的存放地点吗?加上我们自己要检查的log文件
$LOGTAIL /var/log/auth.log >> $TMPDIR/check.$$
$LOGTAIL /var/log/deamon.log >> $TMPDIR/check.$$
$LOGTAIL /var/log/mail.log >> $TMPDIR/check.$$

下面就是要服务器帮你自动用logcheck.sh来检查你的log了。。不要告诉我你不会用cron来作这件事。。。
对于log记录很多的主机每天就分析几次,对于firewall主机这类产生标准log很少的主机每30-60分钟检查
一次不会对系统有什么负担。

使用了logcheck加上一个集中的loghost,对管理一个拥有大量主机的网络系统,能大大的降低劳动强度,也便
于及时的发现系统的异常情况,阻止可能的攻击行为。最后一句。。。集中管理大型网络的log..loghost主机
的存放log记录的硬盘一定要大,不然撑爆了是不能记录任何log的:) …当然你可以时常备份这些log,再删除老
的log文件,删除以后…别忘了马上再touch一个新的log文件..syslogd不会帮你检查和建立这个文件的,不过你
倒是可以在备份脚本里作这件事.

五.syslog存在的问题和发展。

标准Syslog的记录是明文保存的,也没有效验机制,被修改以后是无法得知的,同时在网络上传输syslog消息的
时候也很容易被伪造和窜改,对于某些系统syslog的文件属性是不合适的,如solair,默认是任何人可读,实际
上,只需要root可读写,即600的文件属性就足够了。要解决这些问题,恐怕只能使用第三方的log系统,包括
logdeamon,syslog-ng等等。其中syslog-ny号称是下一代的syslog (ng=next generration),包含了一些比较好
的特性,如log文件的md5效验,log记录加密存放,加密在网上传输的数据流,内置syslog过滤器,但是现在这个
软件尚未发展完全,由于它特殊的log格式,使得管理员自己定制和过滤相对比较麻烦,目前我们也没有作更多的
测试,所以暂时不推荐关键系统上使用这些产品。当然也有一些商用的log分析系统,这里就不作介绍了。
版权所有,未经许可,不得转载