Linux 日志剖析

Linux 系统中的日志大概可以分为以下几类:

  • 用户访问日志
  • 进程监控日志
  • 系统与服务日志

本文将对这几种日志进行详细剖析。

NOTE:
本文中的例子,如非特殊说明,均在 CentOS7 上实施。

1. 用户访问日志

用户的登录时间日志一般由 /var/log/wtmp/var/run/utmp 这两个文件记录,不过这两个文件无法直接 cat 命令查看,并且该文件由系统自动更新。这两个文件中的内容可以用 w/who/finger/id/last/ac/uptime 这几个命令来查看。 /var/log/lastlog 文件记录用户最后登录的信息,可用 lastlog 命令来查看。

日志文件是多数重用 UNIX 日志子系统的关键——保持用户登录进入和退出的纪录。有关当前登录用户的信息记录在文件 /var/run/utmp 中;登录进入和退出纪录在文件 /var/log/wtmp 中;最后一次登录文件可以用 lastlog 命令察看。数据交换、关机和重起也记录在 /var/log/wtmp 文件中。所有的纪录都包含时间戳。这些文件( /var/log/lastlog 通常不大)在具有大量用户的系统中增长十分迅速。例如wtmp文件可以无限增长,除非定期截取。许多系统以一天或者一周为单位把 /var/log/wtmp 配置成循环使用。它通常由 cron 运行的脚本来修改。这些脚本重新命名并循环使用 /var/log/wtmp 文件。通常, /var/log/wtmp 在第一天结束后命名为 wtmp.1 ;第二天后 wtmp.1变为 wtmp.2 等等,直到 wtmp.7

每次有一个用户登录时, login 程序在文件 lastlog 中察看用户的 UID 。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后 login 程序在 /var/log/lastlog中纪录新的登录时间。在新的 /var/log/lastlog 纪录写入后, /var/run/utmp 文件打开并插入用户的 utmp 纪录。该纪录一直用到用户登录退出时删除。 /var/run/utmp 文件被各种命令文件使用,包括 whowusersfinger

下一步,login 程序打开文件 /var/log/wtmp 附加用户的 utmp 纪录。当用户登录退出时,具有更新时间戳的同一 utmp 纪录附加到文件中。 /var/log/wtmp 文件被程序 lastac 使用。


1.1 who 命令

该命令查询 /var/run/utmp 文件并报告 当前登录 的每个用户。who 的缺省输出包括 用户名终端类型登录日期远程主机。例如:

1
2
3
4
➜ who
root tty1 2014-12-29 16:34
root pts/0 2014-12-29 15:48 (ses-254-254.geology.ohio-state.edu)
root pts/1 2014-12-29 16:40 (ses-254-254.geology.ohio-state.edu)

NOTE:
关于 tty/pts 的概念,可参考: Linux中tty、pty、pts的概念区别

如果指明了 wtmp 的文件名,则 who 命令查询所有以前的纪录。命令 who /var/log/wtmp 将报告 自从 /var/log/wtmp 文件创建或删改以来的每一次登录

1
2
3
4
5
6
7
8
9
10
➜ who /var/log/wtmp
root tty1 2014-10-16 17:35
root tty1 2014-10-16 19:42
root tty1 2014-10-16 20:05
root pts/0 2014-10-17 10:56 (ses-254-254.geology.ohio-state.edu)
root pts/1 2014-10-17 13:55 (ses-254-254.geology.ohio-state.edu)
root pts/1 2014-10-17 14:00 (ses-254-254.geology.ohio-state.edu)
root pts/2 2014-10-17 14:59 (ses-254-254.geology.ohio-state.edu)
root tty1 2014-10-20 17:53
......

1.2 w 命令

该命令查询 /var/log/wtmp 文件并显示 当前 系统中每个用户和它所运行的进程信息:

1
2
3
4
5
6
➜ w
17:00:52 up 3 days, 2:16, 3 users, load average: 0.06, 0.03, 0.05
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root tty1 16:34 26:12 0.11s 0.11s -zsh
root pts/0 15:48 4.00s 0.19s 0.02s w
root pts/1 16:57 20.00s 0.74s 0.08s zsh

1.3 users 命令

用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数:

1
2
➜ users
root root root

1.4 id 命令

与上面 users 命令类似,但可以显示更多信息:

1
2
3
4
➜ id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
➜ id root
uid=0(root) gid=0(root) 组=0(root)

id 命令可以显示用户组信息以及更为复杂的 SELinux 上下文信息(比如第一条命令,如果系统启用了 SELinux ,默认就会输出 SELinux 上下文信息);第二条命令指定输出某个用户名的信息时,则会只输出用户和组信息。

1.5 last 命令

该命令往回搜索 /var/log/wtmp 文件来显示自从该文件第一次创建以来所有登录过的用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
➜ last
root pts/1 ses-254-254.geol Mon Dec 29 16:57 still logged in
root pts/1 ses-254-254.geol Mon Dec 29 16:49 - 16:57 (00:08)
root pts/1 ses-254-254.geol Mon Dec 29 16:40 - 16:47 (00:06)
root pts/1 ses-254-254.geol Mon Dec 29 16:36 - 16:40 (00:04)
root tty1 Mon Dec 29 16:34 still logged in
root pts/1 ses-254-254.geol Mon Dec 29 16:33 - 16:33 (00:00)
root pts/0 ses-254-254.geol Mon Dec 29 15:48 still logged in
root pts/0 ses-254-254.geol Fri Dec 26 14:48 - 18:04 (03:15)
reboot system boot 3.10.0-123.13.2. Fri Dec 26 14:44 - 17:12 (3+02:27)
root pts/0 ses-254-254.geol Fri Dec 26 10:23 - down (00:07)
root tty1 Wed Dec 24 10:00 - down (2+00:30)
reboot system boot 3.10.0-123.13.2. Wed Dec 24 09:58 - 10:31 (2+00:32)
......
wtmp begins Thu Oct 16 17:33:46 2014

如果指明了用户,则该命令只显示该用户的近期活动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜ last root
root pts/1 ses-254-254.geol Mon Dec 29 16:57 still logged in
root pts/1 ses-254-254.geol Mon Dec 29 16:49 - 16:57 (00:08)
root pts/1 ses-254-254.geol Mon Dec 29 16:40 - 16:47 (00:06)
root pts/1 ses-254-254.geol Mon Dec 29 16:36 - 16:40 (00:04)
root tty1 Mon Dec 29 16:34 still logged in
root pts/1 ses-254-254.geol Mon Dec 29 16:33 - 16:33 (00:00)
root pts/0 ses-254-254.geol Mon Dec 29 15:48 still logged in
root pts/0 ses-254-254.geol Fri Dec 26 14:48 - 18:04 (03:15)
root pts/0 ses-254-254.geol Fri Dec 26 10:23 - down (00:07)
root tty1 Wed Dec 24 10:00 - down (2+00:30)
......
wtmp begins Thu Oct 16 17:33:46 2014

1.6 ac 命令

命令根据当前的 /var/log/wtmp 文件中的登录进入和退出来报告用户连结的时间(小时),如果不使用标志,则报告总的时间:

1
2
➜ ac
total 231.40

ac -p 显示每个用户的总的连接时间:

1
2
3
➜ ac -p
root 231.45
total 231.45

ac -d 显示每天总的连接时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
➜ ac -d
Oct 16 total 6.14
Oct 17 total 40.45
Oct 20 total 6.11
Oct 21 total 24.01
Oct 22 total 30.66
Dec 10 total 7.08
Dec 12 total 5.11
Dec 15 total 7.79
Dec 16 total 10.32
Dec 17 total 5.17
Dec 18 total 9.01
Dec 19 total 7.75
Dec 22 total 10.64
Dec 23 total 6.19
Dec 24 total 13.99
Dec 26 total 37.92
Today total 3.11

1.7 finger 命令

该命令输出用户的 注册名称真实名称终端名写状态停滞时间登录时间办公地点办公电话 等信息:

1
2
3
4
5
➜ finger
Login Name Tty Idle Login Time Office Office Phone Host
root root tty1 2:25 Dec 29 16:34
root root pts/0 Dec 29 15:48 (ses-254-254.geology.ohio-state.edu)
root root pts/1 37 Dec 29 16:57 (ses-254-254.geology.ohio-state.edu)

1.8 uptime 命令

该命令输出系统至今的运行时间(-p 选项以可读性较好的形式输出):

1
2
3
4
➜ uptime
19:05:17 up 3 days, 4:21, 3 users, load average: 0.00, 0.01, 0.05
➜ uptime -p
up 3 days, 4 hours, 21 minutes

1.9 lastlog 命令

/var/log/lastlog 文件在每次有用户登录时被查询。可以使用 lastlog 命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志 /var/log/lastlog 的内容。它根据 UID 排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示 Never logged(从未登录过)。注意需要root 运行该命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
➜ lastlog
用户名 端口 来自 最后登陆时间
root pts/1 一 12月 29 17:00:01 +0800 2014
bin **从未登录过**
daemon **从未登录过**
adm **从未登录过**
lp **从未登录过**
sync **从未登录过**
shutdown **从未登录过**
halt **从未登录过**
mail **从未登录过**
operator **从未登录过**
games **从未登录过**
ftp **从未登录过**
nobody **从未登录过**
dbus **从未登录过**
apache **从未登录过**
polkitd **从未登录过**
avahi **从未登录过**
avahi-autoipd **从未登录过**
libstoragemgmt **从未登录过**
abrt **从未登录过**
tomcat **从未登录过**
pcp **从未登录过**
postfix **从未登录过**
sshd **从未登录过**
ntp **从未登录过**
chrony **从未登录过**
oprofile **从未登录过**
tcpdump **从未登录过**
saslauth **从未登录过**
mysql **从未登录过**
usbmuxd **从未登录过**

另外,可一加一些参数,例如:
last -u 102 将报告 UID102 的用户;
last -t 7 表示限制上一周的报告。

1.10 /var/log/secure 文件

记录登入系统存取数据的文件,例如 pop3/ssh/telnet/ftp 等都会被记录,我们可以利用此文件找出不安全的登录I该文件可以直接用编辑器打开查看,也可以用Linux中常见的文本处理工具如cat/wc/more/head/tail/awk/sed 等进行分析处理。下面是该文件的部分内容:

1
2
3
4
5
6
7
8
Dec 29 15:48:43 localhost sshd[13053]: Accepted password for root from 140.254.254.254 port 9891 ssh2
Dec 29 15:48:44 localhost sshd[13053]: pam_unix(sshd:session): session opened for user root by (uid=0)
Dec 29 16:30:41 localhost unix_chkpwd[15004]: password check failed for user (root)
Dec 29 16:30:41 localhost login: pam_unix(login:auth): authentication failure; logname=LOGIN uid=0 euid=0 tty=tty1 ruser= rhost= user=root
Dec 29 16:30:41 localhost login: pam_succeed_if(login:auth): requirement "uid >= 1000" not met by user "root"
Dec 29 16:30:43 localhost login: FAILED LOGIN 1 FROM tty1 FOR root, Authentication failure
Dec 29 16:30:51 localhost unix_chkpwd[15013]: password check failed for user (root)
Dec 29 16:30:51 localhost login: pam_succeed_if(login:auth): requirement "uid >= 1000" not met by user "root"

1.11 安全 Tips

这类日志无论在攻击和防守时都是至关重要的。从防护角度来说,假如系统遭到了黑客入侵,这类日志能辅助排查黑客登录系统相关的信息。从黑客攻击的角度来说,如果成功入侵了一个 Linux 系统的主机,在后渗透环节擦除相关日志时,一定要擦除上面这些日志中自己可能留下的痕迹。

2. 进程监控日志

2.1 系统进程监控

UNIX 可以跟踪每个用户运行的每条命令,如果想知道昨晚弄乱了哪些重要的文件,进程统计子系统可以告诉你。它还对跟踪一个侵入者有帮助。与连接时间日志不同,进程统计子系统缺省不激活,它必须手动启动。在 Linux 系统中启动进程统计使用 accton 命令,必须用 root 身份来运行。accton 命令的形式 accton filefile 必须先存在。先使用 touch 命令来创建 pacct 文件:touch /var/log/pacct,然后运行 accton /var/log/pacct 。一旦 accton 被激活,就可以使用 lastcomm 命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何参数的 accton 命令。

lastcomm 命令报告以前执行的文件。不带参数时,lastcomm 命令显示当前统计文件生命周期内纪录的所有命令的有关信息。包括 命令名用户tty命令花费的CPU时间一个时间戳。如果系统有许多用户,输入则可能很长:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜ accton /var/account/pacct //开启进程统计日志监控
➜ lastcomm -f /var/log/pacct
zsh F root pts/0 0.00 secs Tue Dec 30 10:36
git root pts/0 0.00 secs Tue Dec 30 10:36
git root pts/0 0.00 secs Tue Dec 30 10:36
git root pts/0 0.00 secs Tue Dec 30 10:36
zsh F root pts/0 0.00 secs Tue Dec 30 10:36
git root pts/0 0.00 secs Tue Dec 30 10:36
git root pts/0 0.00 secs Tue Dec 30 10:36
git root pts/0 0.00 secs Tue Dec 30 10:36
zsh F root pts/0 0.00 secs Tue Dec 30 10:36
git root pts/0 0.00 secs Tue Dec 30 10:36
➜ accton off //关闭进程统计日志监控

2.2 Shell 命令记录

2.2.1 命令记录文件


现在大部分 Linux/Unix 系统甚至 Mac OSX ,默认 Shell 都是 bashbash 会在每个用户主目录里生成一个 .bash_history 文件,其中记录着用户用 bash 执行过的 Shell 命令,下面是该文件的部分内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
startx
ls
php version
php --help
java -c
java
ifconfig
vi /etc/sysconfig/network-scripts/
vi /etc/sysconfig/network-scripts/ifcfg-ens160
ls
ifconfig
vi /etc/sysconfig/network-scripts/ifcfg-ens160
vi /etc/sysconfig/grub
grub2-mkconfig --help
grub2-mkconfig -o /boot/grub2/grub.cfg
service network restart
ifconfig
vi /etc/sysconfig/network-scripts/ifcfg-ens160

如果系统默认 Shell 不是 bash,假如是 ZSh 呢? ZSh 会在用户主目录下默认生成一个 zsh 自己的命令历史记录文件 .zsh_history ,这个文件记录着用户用 zsh 运行的 Shell 命令。不同的是, zsh 的命令历史记录文件中还记录了对应命令执行的时间戳,下面是该文件的部分内容:

1
2
3
4
5
6
7
8
9
10
: 1418369144:0;wget -O .zshrc http://git.grml.org/f/grml-etc-core/etc/zsh/zshrc && source ~/.zshrc
: 1418369204:0;vim conf/httpd.conf
: 1418369266:0;la /
: 1418369314:0;wget http://sourceforge.net/projects/zsh/files/zsh/5.0.7/zsh-5.0.7.tar.bz2/download
: 1418369735:0;rm -rf .oh-my-zsh
: 1418369738:0;wget --no-check-certificate http://install.ohmyz.sh -O - | sh
: 1418369765:0;zsh
: 1418369788:0;vim .zshrc
: 1418369931:0;cd /etc/
......

2.2.2 history 命令


其实,Linux中有一个命令叫做 history ,它会列出 系统默认Shell 最近执行的1000条命令,并给日志文件中的每条命令进行编号。

如果系统 默认 Shellbash ,该命令会读取当前用户主目录下的 .bash_history 文件中的内容;虽然 man history 显示该命令其实是 bash 的一个内置命令模块,但如果系统 默认 Shellzsh ,该命令则会读取 .zsh_history 文件,并且不会显示该文件中的时间戳信息。下面是该命令的部分输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
➜ history| more
1 wget -O .zshrc http://git.grml.org/f/grml-etc-core/etc/zsh/zshrc && source ~/.zshrc
2 vim conf/httpd.conf
3 la /
4 wget http://sourceforge.net/projects/zsh/files/zsh/5.0.7/zsh-5.0.7.tar.bz2/download
5 rm -rf .oh-my-zsh
6 wget --no-check-certificate http://install.ohmyz.sh -O - | sh
7 zsh
8 vim .zshrc
9 cd /etc/
10 cd
11 cd .oh-my-zsh
12 vim themes/robbyrussell.zsh-theme
13 cd themes
14 cp robbyrussell.zsh-theme robbyrussell.zsh-theme_bak
15 ls
16 vim robbyrussell.zsh-theme
17 scp --h
18 scp root@.140.0.105.2:/root/.oh-my-zsh/themes/robbyrussell.zsh-theme ./robby.bak
19 scp root@140.0.105.2:/root/.oh-my-zsh/themes/robbyrussell.zsh-theme ./robby.bak
20 vim robby.bak
21 vim robbyrussell.zsh-theme
22 cd
23 source .zshrc
24 ls
25 cd .oh-my-zsh
26 cd themes
27 rm robby.bak robbyrussell.zsh-theme_bak
28 ps aux | grep firewall

history 命令还有些 小巧 的用法。它对日志文件中的命令进行了编号,利用这些编号可以方便地执行某些命令,比如

1
2
➜ !31 //执行第31条命令
➜ !! //执行上一条命令

2.2.3 安全 Tips

Shell 命令记录日志,包含了大量的敏感操作记录(看上面的示例就能发现)。从防护的角度来说,如果Linux系统主机被入侵,这些日志文件会记录下黑客登录主机后进行的操作(如果日志没被抹去的话)。从攻击的角度来说,一是这些日志能给黑客提供大量的敏感信息,方便黑客进行快速渗透;二是黑客所有的操作命令也会被记录到日志中,后渗透攻击阶段要记得抹除这些攻击日志。

3. 系统日志(syslog/rsyslog)

syslog 是一个历史悠久的日志系统,几乎所有的UNIX和Linux操作系统都是采用 syslog 进行系统日志的管理和配置。Linux 系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息。这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。而执行这个过程的程序就是 syslogsyslog 可以根据信息的来源以及信息的重要程度将信息保存到不同的日志文件中,例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。在默认的 syslog 配置下,日志文件通常都保存在 /var/log 目录下。syslog 的守护进程为 syslogd ,系统启动时,默认会自动运行 syslogd 守护进程。

syslog 已被许多日志函数采纳,它用在许多保护措施中。任何程序都可以通过 syslog 记录事件。syslog 可以记录系统事件,可以写到一个文件或设备中,或给用户发送一个信息。它能记录本地事件或通过网络记录另一个主机上的事件。

syslog 设备依据两个重要的文件:/etc/syslogd(守护进程)/etc/syslog.conf 配置文件。习惯上,多数 syslog 信息被写到 /var/adm/var/log 目录下的信息文件中。一个典型的 syslog 记录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日志中出现)。

Linux 系统日志配置机器存放位置大致如下图所示:

而现在,syslog 有了一个多线程升级版:rsyslog,它比 syslog 功能更强大也更高效,CentOS7 默认的系统日志服务就是rsyslog。它的基础功能与 syslog 一样,配置的方法与里面的概念也无二致,不同的是,其配置文件变成了 /etc/rsyslog.conf本小节依然以 syslog 为例讲解

3.1 syslog 配置

/etc/syslog.conf 根据如下的格式定义规则:facility.level action ,即
设备.优先级 动作facility.level 字段也被称为 seletor(选择条件),选择条件动作 之间用空格或 tab 分割开;facility 可以理解成日志对应的类型;action 可以理解为日志的处理方式。

3.1.1 facility

facility 定义日志消息的范围种类,其可使用的 key有一下几种:

  • auth —— 由 pam_pwdb 报告的认证活动,记录认证系统 loginsugetty 等的活动信息;
  • authpriv —— 包括特权信息如用户名在内的认证活动,只登录到所选择的单个用户可读的文件中;
  • cron - 与 cronat 有关的计划任务信息;
  • daemon -与 inetd 守护进程有关的后台进程信息;
  • kern - 内核信息,首先通过 klogd 传递;
  • lpr - 与打印服务有关的信息;
  • mail - 与电子邮件有关的信息;
  • marksyslog 内部功能用于生成时间戳;
  • news - 来自新闻服务器的信息;
  • syslog - 由 syslog 生成的信息;
  • user - 由用户程序生成的信息;
  • uucp -由 uucp 生成的信息;
  • local0~local7 -与自定义程序使用。

* 通配符代表除了 mark 以外的所有功能。除 mark 为内部使用外,还有 security 为一个旧的 key 定义,等同于 auth ,已经不再建议使用。

3.1.2 level

level 定义消息的紧急程度,共有8个级别。按严重程度由高到低顺序排列为:

  • emerg - 该系统不可用,等同 panic
  • alert - 需要立即被修改的条件;
  • crit - 阻止某些工具或子系统功能实现的错误条件;
  • err - 阻止工具或某些子系统部分功能实现的错误条件,等同 error
  • warning - 预警信息,等同 warn
  • notice - 具有重要性的普通条件;
  • info -提供信息的消息;
  • debug - 不包含函数条件或问题的其他信息;
  • none - 没有重要级,通常用于排错。

通配符 * 表示所有级别,除了 none 。其中 panicerrorwarn 均为旧的标识符,不再建议使用。

在定义 level 级别的时候,需要注意两点:

  1. 优先级是由应用程序在编程的时候已经决定的,除非修改源码再编译,否则不能改变消息的优先级;
  2. 低的优先级包含高优先级,例如,为某个应用程序定义 info 的日志导向,则涵盖 noticewarningerrcritalertemerg 等消息。(除非使用 = 号定义)

3.1.3 selector

通过点号 .facilitylevel 连接在一起则成为 selector(选择条件)。可以使用分号 ; 同时定义多个选择条件。也支持三个修饰符:

* - 所有日志信息;
= - 等于,即仅包含本优先级的日志信息;
! - 不等于,本优先级日志信息除外;

3.1.4 action

由前面选择条件定义的日志信息,可执行下面的动作:

file - 指定日志文件的绝对路径;
terminalprint - 发送到串行或并行设备标志符,例如 /dev/ttyS2
@host - 远程的日志服务器;
username - 发送信息到本机的指定用户信息窗口中,但该用户必须已经登录到系统中;
named pipe - 发送到预先使用 mkfifo 命令来创建的 FIFO 文件的绝对路径※注意,不能通过 |/var/xxx.sh 方式导向日志到其他脚本中处理。

3.1.5 配置举例

上面详细讲解了 syslog 配置文件 /etc/syslog.conf 里核心的配置方法,下面举几个例子说明一下配置项及其意义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#把除 邮件、新闻、授权信息、计划任务信息等意外的所有 `info` 类消息都存入 /var/log/messages 文件
*.info;mail.none;news.none;authpriv.none;cron.none /var/log/messages
#把邮件、新闻组中仅 info 消息写入info文件,其他信息不写入
mail,news.=info /var/adm/info
#把邮件除 info 消息的所有消息存入 mail 文件
mail.*;mail.!=info /var/adm/mail
#仅把邮件的通知性消息发送到t ty12 终端设备
mail.=info /dev/tty12
#如果 root 和 jiayu 用户已经登录到系统,则把所有紧急信息通知他们
*.alert root,joey
#把所有信息都导向到 jiayu 主机(通过 /etc/hosts 或 dns 解析其IP地址)※注意:每条消息均会经过所有规则的,并不是唯一匹配的。
*.* @jiayu

也就是说,假设 mail.=info 信息通过上面范例中定义的规则时,/var/adm/info/var/adm/mail/dev/tty12,甚至 jiayu 主机都会收到相同的信息。这样看上去比较烦琐,但可以带来的好处就是保证了信息的完整性,可供不同地方进行分析。

3.2 messages 日志

/var/log/messages,是核心系统日志文件。它包含了系统启动时的引导信息,以及系统运行时的其他状态消息,比如 mailcrondaemon ,kernauth ,甚至 iptablesSELinuxDHCP 服务日志,这也是它被称为杂货铺的原因。通常,该文件时在做故障诊断时首先要查看的文件,大家一般都喜欢用以下命令看最后十条日志:

1
tail -n10 /var/log/messages

该文件以用户易懂的格式明文保存文件,可以用常见的 Linux 文件处理命令来分析处理其中的日志内容。

3.3 dmesg

dmesg 提供了一个简单的方法查看系统启动信息。当 Linux 启动的时候,内核的信息被存入内核 ring 缓存和日志文件 /var/log/dmesg 当中,dmesg 可以显示缓存中的内容。默认情况下,dmesg 打印内容到屏幕上面,当然你可以重定向输出到一个文件。如果硬件损坏的话,在 dmesg 日志里是有显示的,可用以下命令来查看 dmesg | grep error

正常状态下,也可以用 dmesg 命令查看最后一次系统引导的日志,下面是部分输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
➜ dmesg| more
[ 0.000000] Initializing cgroup subsys cpuset
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Initializing cgroup subsys cpuacct
[ 0.000000] Linux version 3.10.0-123.13.2.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) ) #1 SMP Thu Dec 18 14:09:13 UTC 2014
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.10.0-123.13.2.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/swap vconsole.font=latarcyrheb-sun16 net.ifnames=0 biosdevname=0
rd.lvm.lv=centos/root crashkernel=auto vconsole.keymap=us rhgb quiet LANG=zh_CN.UTF-8
[ 0.000000] Disabled fast string operations
[ 0.000000] e820: BIOS-provided physical RAM map:
[ 0.000000] BIOS-e820: [mem 0x0000000000000000-0x000000000009f7ff] usable
[ 0.000000] BIOS-e820: [mem 0x000000000009f800-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000ca000-0x00000000000cbfff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000dc000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000000100000-0x000000003feeffff] usable
[ 0.000000] BIOS-e820: [mem 0x000000003fef0000-0x000000003fefefff] ACPI data
[ 0.000000] BIOS-e820: [mem 0x000000003feff000-0x000000003fefffff] ACPI NVS
[ 0.000000] BIOS-e820: [mem 0x000000003ff00000-0x000000003fffffff] usable
......

3.4 日志转储

3.4.1 简介

系统工作到了一定时间后,系统日志文件的内容随着时间和访问量的增加而越来越多,日志文件也越来越大。而且当日志文件超过系统控制范围时候,还会对系统性能造成影响。转储方式可以设为每年转储每月转储每周转储、达到一定大小转储。在 Linux 系统,经常使用 logrotate 工具进行日志转储,结合 cron 计划任务,可以轻松实现日志文件的转储。转储方式的设置由 /etc/logrotate.conf 配置文件控制。

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做 转储。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行(/etc/cron.daily/logrotate)。logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。

主流 Linux 发行版上都默认安装有 logrotate 包,如果出于某种原因, logrotate 没有出现在里头,你可以使用 apt-getyum 命令来安装。

在 Debian 或 Ubuntu上安装:

1
# apt-get install logrotate cron

在 RH 系发行版(RHEL/Fedora/CentOS等)上安装:

1
# yum install logrotate crontabs

3.4.2 配置

CentOS7 系统中默认的 /etc/logrotate.conf 文件内容是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
size 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.

以上内容中部分名词解释:

weekly —— 日志将按周转储,其他可用值为 daily/monthly/yearly
rotate 4 —— 一次转储4个归档日志,对于第5个,时间最久,将被删除;
create [mode owner group] —— 转储文件时若文件不存在则创建它,mode为文件权限,owner文件属主,group 为文件属组;
compress —— 在转储任务完成后,已转储的归档将用 gzip 进行压缩;
dateext —— 切换后的日志文件会附加上一个短横线和 YYYYMMDD 格式的日期,没有这个配置项会附加一个小数点加一个数字序号;
include —— 引用其他日志转储配置文件;
size —— 当日志文件到达指定的大小时才转储,size 可以指定 bytes (缺省)以及KB (sizek)或者 MB (sizem);
missingok —— 在日志轮循期间,任何错误将被忽略,例如 文件无法找到 之类的错误。

其实可用配置项远不止这些,全部的配置项请参考:http://linux.die.net/man/8/logrotate

4. 日志统计与分析

Linux 系统中的日志统计与分析,主要借助于各式各样的日志辅助工具。这些工具按照面向的日志种类可分为 系统日志分析工具Web日志分析工具;按照工具实现的形式可以分为 命令行工具Web前端工具(以Web界面展示日志信息,类似 phpMyAdmin桌面工具(GUI)。下面将通过表格介绍几款常用的日志统计与分析工具:

名称 形式 面向日志种类 特性
Xlogmaster 桌面/命令行 系统
System Log Viewer 桌面 系统 基于 Gnome 桌面环境
lwatch 命令行 系统 C语言编写,性能好
Webalizer 命令行 Web C语言编写,性能好;多平台;报表输出;国际化支持
GoAccess 命令行 Web 速度快,可即时生成报表;配置方便,支持常见 Web 服务器 Apache/Nginx/IIS
Graylog2 命令行/Web 系统 将系统日志转存到 MongoDB 中,在 Web 前端显示
LogAnalyzer Web 系统
Swatch 命令行 系统
logwatch 命令行 系统
Analog 命令行 Web
logcheck 命令行 系统 自动地检查日志文件,定期检查日志文件以发现违反安全规则以及异常的活动
cronolog 命令行 Web日志切割工具 切割大日志文件
Awstats 命令行 Web 久负盛名,功能丰富而强大

上面只是一部分常用的日志统计与分析工具,其他还有很多,有待发掘。

随着 Web 应用程序越来越强大,应用越来越广,Web 日志分析技术渐渐成了独立于系统日志分析的一个庞杂分支。这其中主要得益于大数据相关技术的发展:分布式存储、并行计算、大规模实时处理系统、数据挖掘等等技术功不可没。在这种背景下,Web 日志统计与分析在 日志搜集、日志存储、日志数据挖掘和日志数据可视化方面都有了长足发展,出现了很多高性能的一体化日志分析框架,从功能和处理数据的规模来说,都不是上面单个简单的日志分析小工具所能相比的。而且不同的功能针对不同的应用场景:网站运营、服务器运维、安全分析等等。这部分内容不在此细说,想了解的可以查阅参考资料中的第 9、10、11 条连接,也可以自行查阅其他资料。

##5. 参考资料

  1. Linux 日志管理详解
  2. Linux 系统日志分析大全
  3. 明明白白你的Linux服务器——日志篇
  4. Linux 系统常见的日志文件和常用命令
  5. Linux 日志文件系统总结
  6. Linux 日志文件总管——logrotate
  7. Linux 中 tty、pty、pts 的概念区别
  8. Linux 中 history 历史命令使用方法详解
  9. Web 攻击日志分析的过去现在与未来
  10. 大数据安全分析:我们从日志中得到的(一)
  11. 大数据安全分析:我们从日志中得到的(二)