Linux日志的来龙去脉

: 日志简介

日志对于安全来说,非常重要,他记录了系统每天发生的各种各样的事情,你可以通过他来检查错误发生的原因,或者受到攻击时攻击者留下的痕迹。日志主要的功能有:审计和监测。他还可以实时的监测系统状态,监测和追踪侵入者等等。
Linux 系统中,有三个主要的日志子系统:
(1). 连接时间日志 ---- 由多个程序执行,把纪录写入到 /var/log/wtmp /var/run/utmp login 等程序更新 wtmp utmp 文件,使系统管理员能够跟踪谁在何时登录到系统。
(2). 进程统计 ---- 由系统内核执行。当一个进程终止时,为每个进程往进程统计文件( pacct acct )中写一个纪录。进程统计的目的是为系统中的基本服务提供命令使用统计。
(3). 错误日志 ---- syslogd 执行。各种系统守护进程、用户程序和内核通过 syslog 向文件 /var/log/messages 报告值得注意的事件。另外有许多 UNIX 程序创建日志。像 HTTP FTP 这样提供网络服务的服务器也保持详细的日志。
每个使用 UNIX/LINUX 的人都知道日志的用处,那你是否清楚 LINUX 这些日志信息处理的来龙去脉呢?
我们可以看到 LINUX 系统信息日志的途径基本有以下 2 种:
1 dmesg
2 /var/log/ 下的文件
下面我们就从这个 2 个途径着手 , 一步步的走下去 .
(一)首先 , 我们来看 dmesg 这个常见的命令背后隐藏的是什么 !!
1 )先让我们来 man 一下
-------------man dmesg--------------------------
NAME
dmesg - print or control the kernel ring buffer
SYNOPSIS
dmesg [ -c ] [ -n level ] [ -s bufsize ]
DESCRIPTION
dmesg is used to examine or control the kernel ring buffer .
The program helps users to print out their bootup mes- sages. Instead of copying the messages by hand, the user need only:
………………
LINUX 提供的手册 , 我们可以得知一条最重要的信息 dmesg 是从 kernel ring buffer( 环缓冲区 ) 中读取信息的 .
2 )那什么是 ring buffer ?
LINUX , 所有的系统信息 ( 包内核信息 ) 都会传送到 ring buffer . 而内核产生的信息由 printk() 打印出来。系统启动时所看到的信息都是由该函数打印到屏幕中。 printk ()打出的信息往往以< 0 >< 2 ... 这的数字表明消息的重要级别。高于一定的优先级别会打印到屏幕上, 否则只会保留在系统的缓冲区中 (ring buffer)
至于 dmesg 具体是如何从 ring buffer 中读取的 , 大家可以看 dmesg.c 源代码 . 很短 , 比较容易读懂 .
(二) dmesg 怎么搞的大家应该很明白了吧 . 至于 /var/log/ 下的文件更是大家熟悉得不能再熟悉了 !
1 /var/log/.. 下为什么有这么多文件呢 ?
一句话解释 : syslogd 这个守护进程根据 /etc/syslog.conf, 将不同的服务产生的 Log 记录到不同的文件中 .
这里的 /etc/syslog.conf 我就不细说了 , 很多这方面的信息 .
2 )既然知道了 ,/var/log/.. 是由 syslogd 这个守护进程产生的 . 那就再顺着这条线走下去 .
LINUX 系统启动后,由 /etc/init.d/sysklogd 先后启动 klogd,syslogd 两个守护进程。
其中 klogd 会通过 syslog() 系统调用或者读取 proc 文件系统来从系统缓冲区 (ring buffer) 中得到由内核 printk()
发出的信息 . syslogd 是通过 klogd 来读取系统内核信息 .
我想至此 , 大家心理应该对 log 产生 , 读取等一系列的动作有所感觉 .
总结
1 )所有系统信息是输出到 ring buffer 中去的 .dmesg 所显示的内容也是从 ring buffer 中读取的 .
2 LINUX 系统中 /etc/init.d/sysklogd 会启动 2 个守护进程 :Klogd&&Syslogd
3 klogd 是负责读取内核信息的 , 2 种方式 : syslog() 系统调用 ( 这个函数用法比较全 , 大家去 MAN 一下看看 ) 直接的对 /proc/kmsg 进行读取 ( 再这提一下 ,/proc/kmsg 是专门输出内核信息的地方 )
4 Klogd 的输出结果会传送给 syslogd 进行处理 ,syslogd 会根据 /etc/syslog.conf 的配置把 log 信息输出到 /var/log/ 下的不同文件中。

: 常用的日志文件

access-log 纪录 HTTP/web 的传输
acct/pacct 纪录用户命令
aculog 纪录 MODEM 的活动
btmp 纪录失败的纪录
lastlog 纪录最近几次成功登录的事件和最后一次不成功的登录
messages syslog 中记录信息(有的链接到 syslog 文件)
sudolog 纪录使用 sudo 发出的命令
sulog 纪录使用 su 命令的使用
syslog syslog 中记录信息(通常链接到 messages 文件)
utmp 纪录当前登录的每个用户   /var/run/utmp 
wtmp 一个用户每次登录进入和退出时间的永久纪录   /var/log/wtmp 系统重启及系统状态变化情况。
xferlog 纪录 FTP 会话
utmp wtmp lastlog 日志文件是多数重用 UNIX 日志子系统的关键 -- 保持用户登录进入和退出的纪录。
有关当前登录用户的信息记录在文件 utmp 中; [ 针对当前已 LOGIN 的用户 ]
登录进入和退出纪录在文件 wtmp 中; [ 针对用户的所有历史记录,明细表 ]
最后一次登录文件可以用 lastlog 命令察看。
数据交换、关机和重起也记录在 wtmp 文件中。所有的纪录都包含时间戳。这些文件( lastlog 通常不大)在具有大量用户的系统中增长十分迅速。例如 wtmp 文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把 wtmp 配置成循环使用。它通常由 cron 运行的脚本来修改。这些脚本重新命名并循环使用 wtmp 文件。通常, wtmp 在第一天结束后命名为 wtmp.1 ;第二天后 wtmp.1 变为 wtmp.2 等等,直到 wtmp.7
每次有一个用户登录时, login 程序在文件 lastlog 中察看用户的 UID 。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后 login 程序在 lastlog 中纪录新的登录时间。在新的 lastlog 纪录写入后, utmp 文件打开并插入用户的 utmp 纪录。该纪录一直用到用户登录退出时删除。 下一步, login 程序打开文件 wtmp 附加用户的 utmp 纪录。当用户登录退出时,具有更新时间戳的同一 utmp 纪录附加到文件中。
LOGIN---- 刷新 LAGTLOG---- 写入用户的 utmp 纪录 ----- 退出时删除 utmp 中相应的纪录 ------LOGIN 根据 utmp 更新对应 wtmp 文件中的记录。
utmp 文件被各种命令文件使用,包括 who w users finger 。均针对系统已 login in 的用户
wtmp 文件被程序 last ac 使用。这两个命令所按历史记录进行统计

: 具体命令

wtmp utmp 文件都是二进制文件,他们不能被诸如 tail 命令剪贴或合并(使用 cat 命令)。用户需要使用 who w users last ac 来使用这两个文件包含的信息。
who who 命令查询 utmp 文件并报告当前登录的每个用户。 Who 的缺省输出包括用户名、终端类型、登录日期及远程主机。
#who
chyang pts/0 Aug 18 15:06
ynguo pts/2 Aug 18 15:32
如果指明了 wtmp 文件名,则 who 命令查询所有以前的纪录。命令 who /var/log/wtmp 将报告自从 wtmp 文件创建或删改以来的每一次登录。
w w 命令查询 utmp 文件并显示当前系统中每个用户和它所运行的进程信息。
#w
3:36pm up 1 day, 22:34, 6 users, load average: 0.23, 0.29, 0.27
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
chyang pts/0 202.38.68.242 3:06pm 2:04 0.08s 0.04s -bash
users users 用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。
#users
chyang lewis lewis ylou ynguo ynguo
last last 命令往回搜索 wtmp 来显示自从文件第一次创建以来登录过的用户。例如:
#last
chyang pts/9 202.38.68.242 Tue Aug 1 08:34 - 11:23 (02:49)
cfan pts/6 202.38.64.224 Tue Aug 1 08:33 - 08:48 (00:14)
如果指明了用户,那么 last 只报告该用户的近期活动,例如:
#last root
root pts/4 simba.nic.ustc.e Fri Aug 4 16:50 - 08:20 (15:30)
root pts/4 simba.nic.ustc.e Thu Aug 3 23:55 - 04:40 (04:44)
root pts/11 simba.nic.ustc.e Thu Aug 3 20:45 - 22:02 (01:16)
ac ac 命令根据当前的 /var/log/wtmp 文件中的登录进入和退出来报告用户连结的时间小时),如果不使用标志,则报告总的时间。
#ac
total 123.45
ac -d 显示每天的总的连结时间
#ac -d
Aug 12 total 261.87
Aug 13 total 351.39
Aug 14 total 396.09
Aug 15 total 462.63
Aug 16 total 270.45
Aug 17 total 104.29
Today total 179.02
ac -p 显示每个用户的总的连接时间
#ac -p
ynguo 193.23
yucao 3.35
rong 133.40
hdai 10.52
zjzhu 52.87
zqzhou 13.14
liangliu 24.34
total 5178.24
lastlog lastlog 文件在每次有用户登录时被查询。可以使用 lastlog 命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志 /var/log/lastlog 的内容。
它根据 UID 排序显示登录名、端口号( tty )和上次登录时间。如果一个用户从未登录过, lastlog 显示 "**Never logged**
注意需要以 root 运行该命令,例如:
#lastlog
rong 5 202.38.64.187 Fri Aug 18 15:57:01 +0800 2000
dbb **Never logged in**
xinchen **Never logged in**
pb9511 **Never logged in**
xchen 0 202.38.64.190 Sun Aug 13 10:01:22 +0800 2000
另外,可一加一些参数,例如, last -u 102 将报告 UID 102 的用户; last -t 7 表示限制上一周的报告。
 
 
 

一: 进程统计 --- 进程记账 , 监视所有用户执行的命令

一些异常用户试图移去系统上的所有活动记录 ( 比如 ~/.bash_history), 不过我们可以使用专门的工具来监视所有用户执行的命令。推荐你使用进程记帐来记录用户的活动 , 你可以通过进程记帐查看每一个用户执行的命令 , 包括 CPU 时间和内存占用。
Psacct 程序提供了几个进程活动监视工具 : ac, lastcomm, accton sa
ac 命令显示用户连接时间的统计。
lastcomm 命令显示系统执行的命令。
accton 命令用于打开或关闭进程记帐功能。
sa 命令统计系统进程记帐的情况。
1 ). 启动 psacct/acct 服务 ,psacct RHEL4.4 中默认是不启动的 .
# chkconfig psacct on
# /etc/init.d/psacct start
现在我们可以了解如何利用这些工具来监视用户的命令和时间。
2). 显示用户连线时间的统计信息
ac 在上面已经讨论
3). 查找用户过去执行的命令
你可以使用 lastcomm 命令打印出用户过去执行的命令。你也可以通过用户名 , tty 名或命令名来搜索以往执行的命令。
比如显示 root 用户过去执行的命令 :
# lastcomm root
[root@localhost log]# lastcomm root | more
lastcomm                root     pts/1      0.03 secs Wed Dec  2 14:16
crond             SF    root     __         0.02 secs Wed Dec  2 14:15
mrtg              S     root     __         0.65 secs Wed Dec  2 14:15
crond             SF    root     __         0.01 secs Wed Dec  2 14:10
mrtg               S     root     __         0.65 secs Wed Dec  2 14:10
crond             SF    root     __         0.02 secs Wed Dec  2 14:10
sadc              S     root     __         0.02 secs Wed Dec  2 14:10
crond             SF    root     __         0.02 secs Wed Dec  2 14:05
mrtg              S     root     __         0.63 secs Wed Dec  2 14:05
bash               F    root     pts/1      0.00 secs Wed Dec  2 14:02
bash               F    root     pts/1      0.00 secs Wed Dec  2 14:01
每一行信息都在屏幕上打印出来 , 我们以第一行输出项为例 :
lastcomm                root     pts/1      0.03 secs Wed Dec  2 14:16
分析 :
lastcomm 是进程的命令名。
S X 是标志信息 , 由系统记帐程序管理。每一个标志的含义是 :
S -- 命令由超级用户执行。
F -- 命令由 fork 产生 , 但是没有 exec( 执行 )
D -- 命令终止并创建一个 core 文件。
X -- 命令被 SIGTERM 信号终止。
root 是执行命令的用户名。
prts/1 终端名。
0.00 secs -- 进程退出时间。
你可以通过执行下面的命令来搜索进程记帐日志谁做了 rm 操用 :
# lastcomm rm
rm                      root     pts/1      0.00 secs Wed Dec  2 14:21
rm                      root     pts/1      0.00 secs Wed Dec  2 14:19
rm                      root     pts/1      0.00 secs Wed Dec  2 14:19
你可以通过终端名 pts/1 作为关键字来搜索进程记帐日志 :
# lastcomm pts/1
4). 统计记帐信息
你可以使用 sa 命令打印过去执行命令的统计信息。另外 , sa 命令保存了一个叫做 savacct 文件 , 文件包含了命令被调用的次数和资源使用的次数。而且 sa 还提供每一个用户的统计信息 , 这些信息保存在一个叫做 usracct 的文件当中。
# sa
207       0.41re       0.40cp     7408k   mrtg
    6       0.04re        0.04cp     7240k   awstats.pl
  15       0.01re       0.00cp     2108k   ***other*
1242      53.91re      0.00cp     6081k   sshd
以结果输出的第二行为例 :
    6       0.04re       0.04cp     7240k   awstats.p
分析 :
0.04re " 实际时间 " 单位为分钟。
0.04cp 系统和用户时间总数 (CPU 时间 , 单位为分钟 )
7240K 核心使用所占的平均 CPU 时间 , 一个单元的大小为 1KB
awstats.pl 命令名。
显示每一个用户 :
# sa -u
root       0.00 cpu      595k mem accton          
root       0.00 cpu     1339k mem logrotate.gf2tt 
找出谁在占用 CPU
你可以通过查看 re, k, cp/cpu( 见上面输出解释 ) 时间来找出可疑的活动 , 或某个用户 / 命令占用了所有的 CPU 时间。如果 CPU/Memeory 使用数 ( 命令 ) 在不断增加 , 可以说明命令存在问题。

: 日志去向

Syslog 已被许多日志函数采纳,它用在许多保护措施中 -- 任何程序都可以通过 syslog 纪录事件。 Syslog 可以纪录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能纪录本地事件或通过网络纪录另一个主机上的事件。
Syslog 设备依据两个重要的文件: /etc/syslogd (守护进程)和 /etc/syslog.conf 配置文件,习惯上,多数 syslog 信息被写到 /var/adm /var/log 目录下的信息文件中( messages.* )。一个典型的 syslog 纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日之中出现)。
每个 syslog 消息被赋予下面的主要设备之一:
LOG_AUTH-- 认证系统: login su getty
LOG_AUTHPRIV-- LOG_AUTH ,但只登录到所选择的单个用户可读的文件中
LOG_CRON--cron 守护进程
LOG_DAEMON-- 其他系统守护进程,如 routed
LOG_FTP-- 文件传输协议: ftpd tftpd
LOG_KERN-- 内核产生的消息
LOG_LPR-- 系统打印机缓冲池: lpr lpd
LOG_MAIL-- 电子邮件系统
LOG_NEWS-- 网络新闻系统
LOG_SYSLOG-- syslogd 8 )产生的内部消息
LOG_USER-- 随机用户进程产生的消息
LOG_UUCP--UUCP 子系统
LOG_LOCAL0~LOG_LOCAL7-- 为本地使用保留
Syslog 为每个事件赋予几个不同的优先级:
LOG_EMERG-- 紧急情况
LOG_ALERT-- 应该被立即改正的问题,如系统数据库破坏
LOG_CRIT-- 重要情况,如硬盘错误
LOG_ERR-- 错误
LOG_WARNING-- 警告信息
LOG_NOTICE-- 不是错误情况,但是可能需要处理
LOG_INFO-- 情报信息
LOG_DEBUG-- 包含情报的信息,通常旨在调试一个程序时使用
syslog.conf 文件指明 syslogd 程序纪录日志的行为,该程序在启动时查询配置文件。该文件由不同程序或消息分类的单个条目组成,每个占一行。对每类消息提供一个选择域和一个动作域。这些域由 tab 隔开:选择域指明消息的类型和优先级;动作域指明 syslogd 接收到一个与选择标准相匹配的消息时所执行的动作。每个选项是由设备和优先级组成。当指明一个优先级时, syslogd 将纪录一个拥有相同或更高优先级的消息。
所以如果指明 "crit" ,那所有标为 crit alert emerg 的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。
例如,如果想把所有邮件消息纪录到一个文件中,如下:
#Log all the mail messages in one place
mail.* /var/log/maillog
其他设备也有自己的日志。 UUCP news 设备能产生许多外部消息。它把这些消息存到自己的日志( /var/log/spooler )中并把级别限为 "err" 或更高。例如:
# Save mail and news errors of level err and higher in aspecial file.
uucp,news.crit /var/log/spooler
当一个紧急消息到来时,可能想让所有的用户都得到。也可能想让自己的日志接收并保存。
#Everybody gets emergency messages plus log them on anther machine
*.emerg * 
*.emerg @linuxaid.com.cn
alert 消息应该写到 root tiger 的个人账号中:
#Root and Tiger get alert and higher messages
*.alert root,tiger
有时 syslogd 将产生大量的消息。例如内核( "kern" 设备)可能很冗长。用户可能想把内核消息纪录到 /dev/console 中。下面的例子表明内核日志纪录被注释掉了:
#Log all kernel messages to the console
#Logging much else clutters up the screen
#kern.* /dev/console
用户可以在一行中指明所有的设备。下面的例子把 info 或更高级别的消息送到 /var/log/messages ,除了 mail 以外。级别 "none" 禁止一个设备:
#Log anything except mail of level info or higher
#Don log private authentication messages!
*.info:mail.none;authpriv.none /var/log/messages
在有些情况下,可以把日志送到打印机,这样网络入侵者怎么修改日志都没有用了。通常要广泛纪录日志。 Syslog 设备是一个攻击者的显著目标。一个为其他主机维护日志的系统对于防范服务器攻击特别脆弱,因此要特别注意。
有个小命令 logger syslog 3 )系统日志文件提供一个 shell 命令接口,使用户能创建日志文件中的条目。用法: logger 例如: logger This is a test
它将产生一个如下的 syslog 纪录: Aug 19 22:22:34 tiger: This is a test! 
注意不要完全相信日志,因为攻击者很容易修改它的 .
 

你可能感兴趣的:(Linux日志的来龙去脉)