syslogd config

在比较大规模的网络应用或者对安全有一定要求的应用中,通常需要对系统的日志进行记录分类并审核,默认情况下,每个系统会在本地硬盘上记录自己的日志,这样虽然也能有日志记录,但是有很多缺点:首先是管理不便,当服务器数量比较多的时候,登陆每台服务器去管理分析日志会十分不便,其次是安全问题,一旦有入侵者登陆系统,他可以轻松的删除所有日志,系统安全分析人员不能得到任何入侵信息。因此,在网络中安排一台专用的日志服务器来记录系统日志是一个比较理想的方案。下面我们以FreeBSD下的syslog为例介绍如何利用syslogd记录来自Unix和windows的logs。

A:记录类Unix主机的log:

首先需要对Freebsd的syslog进行配置,使它允许接收来自其他服务器的log信息。
在/etc/rc.conf中加入:
syslogd_flags=”-4 -a 0/0:*”

配置说明:freebsd的syslogd参数设置放在/etc/rc.conf文件的syslogd_flags变量中,Freebsd对syslogd的默认设置参数是syslogd_flags=”-s”,(可以在默认配置/etc/defaults/rc.conf中看到),默认的参数-s表示打开UDP 514端口监听,但是只监听本机的UDP 514端口,拒绝接收来自其他主机的log信息。如果是两个ss,即-ss,表示不打开任何端口,只在本机/dev/log设备记录。

参数说明:
-4 只监听IPv4端口,如果你的网络是IPv6协议,可以换成-6。

-a 0/0:* 接受来自所有网段所有端口发送过来的log信息。

-a 192.168.1.0/24:514或者-a 192.168.1.0/24表示仅接收来自局域网该网段514端口的log信息,这也是freebsd的syslogd进程默认设置,也就是说freebsd 在接收来自其他主机的log信息的时候会判断对方发送信息的端口,如果对方不是用514端口发送的信息,那么freebsd的syslogd会拒绝接收信息。在默认情况下必须:远程IP的UDP 514端口发送到本地IP的UDP 514端口。

在参数中加入*,表示允许接收来自任何端口的log信息。这点,在记录类Unix主机信息的时候感觉不到加不加有什么区别,因为类Unix主机都是用 514端口发送和接收syslog信息的。但是在接收windows信息的时候就非常重要了。因为windows的syslog软件不用514端口发送信息,这会让默认配置的syslogd拒绝接收信息。

修改好syslogd参数后,我们需要修改一下/etc/syslog.conf文件,指定log信息的存放路径,
比如你要记录其他系统的远程登陆登出信息并指定日志存放路径,则需要修改以下行:

authpriv.* /var/log/otherslog
这表示把系统的登入登出日志(包括本机系统登陆登出日志)存放到/var/log/otherslog文件中。
当然,这是最简陋的做法,因为这样会把所有服务器的登陆登出信息存放在一个文件中,察看的时候很不方便,通常的做法是用一个脚本,对接收到的信息进行简单的分拣,再发送到不同的文件。

如下设置:
authpriv.* |/var/log/filter_log.sh

在记录目标前面加上“|”表示把接收到的信息交给后面的程序处理,这个程序可以是一个专门的日志处理软件,也可以是一个自己编写的小的脚本,举例:

#!/bin/sh
stuff=/var/log/auth.log
read stuff
SERVER=`echo $stuff |awk’{print $4}’`
echo $stuff >> /usr/logs/login_log/$SERVER.log

这个简单的脚本以IP作为分类依据,先用read读取log信息,用awk取出第四字段(即IP地址或者主机名所在的字段),以该字段为文件名存放该主机的日志。
这样一来,来自192.168.1.1的log会记录到192.168.1.1.log文件中,来自192.168.1.2的log会被记录在 192.168.1.2.log文件中,分析和归类就比较方便了。当然这是一个最简单的例子,可以根据自己的需求写出更合适的脚本,可以按照日期每天,每周,每月分目录存储,甚至把log信息分类后插入数据库中,这样日志的管理和分析就更方便了。

重启一下syslogd服务,让配置生效:
/etc/rc.d/syslogd restart

OK,服务端的配置完成。现在配置一下客户端:
这里所说的客户端,就是发送自己的日志到远程日志服务器上的主机。

修改/etc/syslog.conf文件:

如果你只需要记录系统登入登出日志到远程日志服务器上,那么只需要修改以下一行:
authpriv.* @192.168.1.100
这里的192.168.1.100就是log服务器的IP,“@”符号表示发送到远程主机。

重启一下syslog服务:
/etc/rc.d/syslogd restart

用logger测试一下是否配置成功:
logger -p authpriv.notice “Hello,this is a test”

到log服务器上去看看,“Hello,this is a test”应该已经被记录下了。最后在客户机上登陆登出几次,看看真实的authpriv信息是否也被成功的记录下。

B: Windows日志的记录

对于类Unix主机之间记录日志,由于协议、软件和日志信息格式等都大同小异,因此实现起来比较简单,但是windows的系统日志格式不同,日志记录软件,方式等都不同。因此,我们需要第三方的软件来将windows的日志转换成syslog类型的日志后,转发给syslog服务器。
一个第三方软件evtsys (全称是evntlog to syslog)
这是一个非常小巧而且免费的第三方日志记录软件:
https://engineering.purdue.edu/ECN/Resources/Documents/UNIX/evtsys/
文件才几十K大小,非常小巧,解压后是两个文件evtsys.dll和evtsys.exe
把这两个文件拷贝到 c:\windows\system32目录下。

打开CMD
C:\>evtsys –i –h 192.168.1.100
-i 表示安装成系统服务
-h 指定log服务器的IP地址
如果要卸载evtsys,则:
net stop evtsys
evtsys -u

启动该服务:
C:\>net start evtsys

打开windows组策略编辑器 (开始->运行 输入 gpedit.msc)

在windows 设置-> 安全设置 -> 本地策略->审核策略中,打开你需要记录的windows日志。evtsys会实时的判断是否有新的windows日志产生,然后把新产生的日志转换成syslogd可识别的格式,通过UDP 3072端口发送给syslogd服务器。

OK,所有的配置windows端配置完成,现在配置一下syslogd的配置文件.
参数的配置和上面相同,
所不同的是evtsys是以daemon设备的方式发送给 syslogd log信息的。
因此,需要在/etc/syslog.conf中加入:
daemon.notice |/var/log/filter_log.sh
关于syslog 记录设备和记录等级方面的知识可以参考syslog文档。

C:网络设备日志的记录

各种不同的中高档路由器都有日志记录的选项,且多使用嵌入式Linux上的syslogd,只需要在路由器GUI或CLI中设置即可,将NAT信息,防火墙信息,以及DHCP等等信息发送到日志服务器备查,这个机器型号太多了,不作赘述。

OK,所有配置设置完成。这下所有服务器上的系统日志都可以统一记录到一台日志服务器上轻松管理了。

FreeBSD的系统日志

由于FreeBSD是一个多用户系统,那么就需要管理员进行日常维护,特别是用做网络服务器的系统,一旦因为缺乏维护而造成停机故障,就会造成很大损失。即使对于单用户的FreeBSD系统,同样也要执行这些不可缺乏的维护任务,只是由于系统归个人使用,那么对维护的要求就不必那么高,维护任务就轻松一些。

系统日志
系统的日志记录提供了对系统活动的详细审计,这些日志用于评估、审查系统的运行环境和各种操作。对于一般情况,日志记录包括记录用户登录时间、登录地点、进行什么操作等内容,如果使用得当,日志记录能向系统管理员提供有关危害安全的侵害或入侵试图等非常有用的信息。
BSD提供了详细的各种日志记录,以及有关日志的大量工具和实用程序。这些审计记录通常由程序自动产生,是缺省设置的一部分,能够帮助Unix管理员来寻找系统中存在的问题,对系统维护十分有用。还有另一些日志记录,需要管理员进行设置才能生效。
大部分日志记录文件被保存在/var/log目录中,在这个目录中除了保存系统生成日志之外,还包括一些应用软件的日志文件。当然/var目录下的其他子目录中也会记录下一些其他种类的日志记录文件,这依赖于具体的应用程序的设置。

$ ls /var/log
adduser maillog.5.gz sendmail.st.1
dmesg.today maillog.6.gz sendmail.st.10
dmesg.yesterday maillog.7.gz sendmail.st.2
httpd-access.log messages sendmail.st.3
httpd-error.log messages.0.gz sendmail.st.4
kerberos.log messages.1.gz sendmail.st.5
lastlog messages.2.gz sendmail.st.6
lpd-errs messages.3.gz sendmail.st.7
maillog messages.4.gz sendmail.st.8
maillog.0.gz messages.5.gz sendmail.st.9
maillog.1.gz news setuid.today
maillog.2.gz ppp.log setuid.yesterday
maillog.3.gz sendmail.st userlog
maillog.4.gz sendmail.st.0 wtmp

系统登录日志
系统会保存每个用户的登录记录,这些信息包括这个用户的名字、登录起始结束时间以及从何处登录入系统的等等。它们被保存到

/var/log/lastlog

/var/log/wtmp

var/run/utmp

文件中,这三个文件以二进制格式保存了这些用户的登录数据。
其中/var/run/utmp文件中保存的是当前系统用户的登录记录,因此这个文件会随着用户进入和离开系统而不断变化,而它也不会为用户保留很长的记录,只保留当时联机的用户记录。系统中需要查询当前用户状态的程序,如 who、w等就需要访问这个文件。
utmp可能不包括所有精确的信息,某些突发错误会终止用户登录会话,当没有及时更新utmp记录,因此utmp的记录不是百分之百的可以信赖的。
而/var/log/wtmp保存了所有的登录、退出信息,以及系统的启动、停机记录,因此随着系统正常运行时间的增加,它的大小也会越来越大,增加的速度依赖于系统用户登录次数。因此可以利用这个日志用来查看用户的登录记录,last命令就通过访问这个文件来获得这些信息,并以反序从后向前显示用户的登录记录,last也能根据用户、终端tty或时间显示相应的记录。ac命令同样也使用wtmp中的数据产生报告,但它的显示方式不同。它可以根据用户(ac -p),或按日期(ap -d)显示信息,这样管理员就能获得一些非常有用的反常信息,如一个平时不太活跃的用户突然登录并连接很长时间,就有理由怀疑这个帐户被窃取了。
注意:X Window由于会同时打开多个终端窗口,因此会使得用户登录连接时间迅速增加。
lastlog文件保存的是每个用户的最后一次登录信息,包括登录时间和地点,这个文件一般只有login程序使用,通过用户的UID,来在lastlog文件中查找相应记录,然后报告其最后一次登录时间和终端tty。然后, login程序就使用新的记录更新这个文件。
这三个文件是使用二进制格式保存的,因此不能直接查看其中的内容,而需要使用相关命令。当然也可以通过程序来访问这三个文件,这就需要了解它们使用的数据结构。其中utmp和wtmp使用同样的数据结构,而lastlog使用另外一个数据结构,可使用man来进行查询具体结构。如果系统的用户数量很多,那么wtmp文件的大小会迅速增加,在系统/var文件系统空间紧张的情况下,就导致这个文件系统被占满。系统不会主动控制这个文件的大小,因此这需要管理员的干预,需要手工及时清除,或编写shell脚本定期保存和清除。
系统还可以提供审计统计的功能,要打开系统的审计功能,需要使用accton命令,注意,accton必须跟随审计日志文件的名字作参数,而不带参数的accton将关闭审计进程。
当打开了审计功能后,可以使用lastcomm来检查在系统中执行的所有命令的信息,包括执行的命令、执行命令的用户、用户使用的终端tty,命令完成的时间,执行时间等。从lastcomm的输出也能帮助管理员检查可能的入侵行为。
此外可以使用ac命令来查询用户的连接时间的报告,sa命令来查询用户消耗的处理器时间的报告。

Syslog日志记录
最初,syslog只是为了sendmail而设计的消息日志工具,由于它提供了一个中心控制点,使得sys log非常好用和易配置,因此当今很多程序都使用syslog来发送它们的记录信息。syslog是一种强大的日志记录方式,不但可以将日志保存在本地文件中,还可以根据设置将syslog记录发送到网络上的另一台主机中。
支持syslog方式的系统启动了syslogd守护进程,这个程序从本地的Unix套接字和监听在514端口(UDP)上的Internet套接字,来获得syslog的记录。本机中进程使用syslog系统调用发送来sy slog记录,然后由syslogd将他们保存到正确的文件或发送到网络上另一台运行的syslogd主机中去。
syslogd的设置文件为/etc/syslog.conf,定义消息对应的相应目标,一条消息可以达到多个目标,也可能被忽略。
# $Id: syslog.conf,v 1.9 1998/10/14 21:59:55 nate Exp $
#
# Spaces are NOT valid field separators in this file.
# Consult the syslog.conf(5) manpage.
*.err;kern.debug;auth.notice;mail.crit /dev/console
*.notice;kern.debug;lpr.info;mail.crit;news.err /var/log/messages
mail.info /var/log/maillog
lpr.info /var/log/lpd-errs
cron.* /var/cron/log
*.err root
*.notice;news.err root
*.alert root
*.emerg *
!ppp
*.* /var/log/ppp.log
syslog.conf的配置可以分为两个部分,第一部分用于区分消息的类型,另一个用于设置消息发送的目的地。通常,消息的类型包括消息的产生者,例如kern表示内核产生的消息,auth表示认证系统产生的消息,等等,还包括消息的级别,例如emerg表示非常重要的紧急信息,alert表示系统告警状态,crit表示关键状态,err 表示一般的错误信息,warning表示警告信息,notice表示提示信息,但还不是错误,info表示一般信息,debug表示调试信息等,因此一个消息的类型可能为:kern.debug、mail.info等,但页可以使用通配符*进行匹配。
从上面的syslog.conf的设置可以看出,系统正常运行中的很多重要的信息,如错误信息*.err、内核调试信息kern.debuf、认证报告auth.notice等被直接输出的console中,另外还有一些比较重要的信息被输出到/var/log/messages文件中,发送邮件的记录将被保存在/var/log/mail log文件中,打印记录为/var/log/lpd-errs等,使得管理员可以根据这些文件来查询相关记录,进行统计或寻找系统问题。其中使用syslog记录的messages文件中包括root登录的信息、用户多次登录失败的尝试等对系统安全相当重要的信息,因此也是系统遭受攻击之后,攻击者会根据syslog.conf中设置试图清除相关文件中自己的登录记录。因此对于安全性要求更高的系统,可以尝试将syslog发送到另一台计算机上,或者输出到一些设备文件中,如在打印机上立即打印输出。
系统会使用newsyslog定期检查syslog输出的messages文件和maillog文件,将旧数据压缩保存为备份文件,如messages.1.gz等。

其他日志
除了系统登录记录和syslog记录之外,其他还有一些应用程序使用自己的记录方式。
系统每天都会自动检查系统的安全设置,包括对SetUID、SetGID的执行文件的检查,其结果将输出到/ var/log/security.today文件中,管理员可以与/var/log/security.yeste rday文件对比,寻找系统安全设置的变化。
如果系统使用sendmail,那么sendmail.st文件中以二进制形式保存了sendmail的统计信息。
在系统启动的时候,就将内核的检测信息输出到屏幕上,这些信息可以帮助用户分析系统中的硬件状态。一般使用dmesg命令来查看最后一次启动时输出的这个检测信息。这个信息也被系统保存在/var/log/dmesg.tod ay文件中,系统中同时也存在另一个文件dmesg.yesterday,是上次的启动检测信息,对比这两个文件,就可以了解到系统硬件和内核配置的变化。
lpd-errs记录了系统中lpd产生的错误信息。
此外,各种shell还会记录用户使用的命令历史,它使用用户主目录下的文件来记录这些命令历史,通常这个文件的名字为.history(csh),或.bash-history等。