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
文件被各种命令文件使用,包括 who
、w
、users
和 finger
。
下一步,login
程序打开文件 /var/log/wtmp
附加用户的 utmp
纪录。当用户登录退出时,具有更新时间戳的同一 utmp
纪录附加到文件中。 /var/log/wtmp
文件被程序 last
和 ac
使用。
1.1 who
命令
该命令查询 /var/run/utmp
文件并报告 当前登录 的每个用户。who
的缺省输出包括 用户名、终端类型、登录日期 及 远程主机。例如:
NOTE:
关于tty/pts
的概念,可参考: Linux中tty、pty、pts的概念区别
如果指明了 wtmp
的文件名,则 who
命令查询所有以前的纪录。命令 who /var/log/wtmp
将报告 自从 /var/log/wtmp
文件创建或删改以来的每一次登录:
1.2 w
命令
该命令查询 /var/log/wtmp
文件并显示 当前 系统中每个用户和它所运行的进程信息:
1.3 users
命令
用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数:
1.4 id
命令
与上面 users
命令类似,但可以显示更多信息:
id
命令可以显示用户组信息以及更为复杂的 SELinux
上下文信息(比如第一条命令,如果系统启用了 SELinux
,默认就会输出 SELinux
上下文信息);第二条命令指定输出某个用户名的信息时,则会只输出用户和组信息。
1.5 last
命令
该命令往回搜索 /var/log/wtmp
文件来显示自从该文件第一次创建以来所有登录过的用户:
如果指明了用户,则该命令只显示该用户的近期活动:
1.6 ac
命令
命令根据当前的 /var/log/wtmp
文件中的登录进入和退出来报告用户连结的时间(小时),如果不使用标志,则报告总的时间:
ac -p
显示每个用户的总的连接时间:
ac -d
显示每天总的连接时间:
1.7 finger
命令
该命令输出用户的 注册名称、真实名称、终端名、写状态、停滞时间、登录时间、办公地点、办公电话 等信息:
1.8 uptime
命令
该命令输出系统至今的运行时间(-p
选项以可读性较好的形式输出):
1.9 lastlog
命令
/var/log/lastlog
文件在每次有用户登录时被查询。可以使用 lastlog
命令来检查某特定用户上次登录的时间,并格式化输出上次登录日志 /var/log/lastlog
的内容。它根据 UID
排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示 Never logged(从未登录过)
。注意需要以 root
运行该命令:
另外,可一加一些参数,例如:
last -u 102
将报告UID
为102
的用户;last -t 7
表示限制上一周的报告。
1.10 /var/log/secure
文件
记录登入系统存取数据的文件,例如 pop3/ssh/telnet/ftp
等都会被记录,我们可以利用此文件找出不安全的登录I该文件可以直接用编辑器打开查看,也可以用Linux中常见的文本处理工具如cat/wc/more/head/tail/awk/sed
等进行分析处理。下面是该文件的部分内容:
|
|
1.11 安全 Tips
这类日志无论在攻击和防守时都是至关重要的。从防护角度来说,假如系统遭到了黑客入侵,这类日志能辅助排查黑客登录系统相关的信息。从黑客攻击的角度来说,如果成功入侵了一个 Linux 系统的主机,在后渗透环节擦除相关日志时,一定要擦除上面这些日志中自己可能留下的痕迹。
2. 进程监控日志
2.1 系统进程监控
UNIX 可以跟踪每个用户运行的每条命令,如果想知道昨晚弄乱了哪些重要的文件,进程统计子系统可以告诉你。它还对跟踪一个侵入者有帮助。与连接时间日志不同,进程统计子系统缺省不激活,它必须手动启动。在 Linux 系统中启动进程统计使用 accton
命令,必须用 root
身份来运行。accton
命令的形式 accton file
,file
必须先存在。先使用 touch
命令来创建 pacct
文件:touch /var/log/pacct
,然后运行 accton /var/log/pacct
。一旦 accton
被激活,就可以使用 lastcomm
命令监测系统中任何时候执行的命令。若要关闭统计,可以使用不带任何参数的 accton
命令。
lastcomm
命令报告以前执行的文件。不带参数时,lastcomm
命令显示当前统计文件生命周期内纪录的所有命令的有关信息。包括 命令名、用户、tty、命令花费的CPU时间和一个时间戳。如果系统有许多用户,输入则可能很长:
|
|
2.2 Shell 命令记录
2.2.1 命令记录文件
现在大部分 Linux/Unix 系统甚至 Mac OSX ,默认 Shell 都是 bash
,bash
会在每个用户主目录里生成一个 .bash_history
文件,其中记录着用户用 bash
执行过的 Shell 命令,下面是该文件的部分内容:
如果系统默认 Shell 不是 bash
,假如是 ZSh
呢? ZSh
会在用户主目录下默认生成一个 zsh
自己的命令历史记录文件 .zsh_history
,这个文件记录着用户用 zsh
运行的 Shell 命令。不同的是, zsh
的命令历史记录文件中还记录了对应命令执行的时间戳,下面是该文件的部分内容:
2.2.2 history
命令
其实,Linux中有一个命令叫做 history
,它会列出 系统默认Shell 最近执行的1000条命令,并给日志文件中的每条命令进行编号。
如果系统 默认 Shell 是 bash
,该命令会读取当前用户主目录下的 .bash_history
文件中的内容;虽然 man history
显示该命令其实是 bash
的一个内置命令模块,但如果系统 默认 Shell 是 zsh
,该命令则会读取 .zsh_history
文件,并且不会显示该文件中的时间戳信息。下面是该命令的部分输出:
history
命令还有些 小巧 的用法。它对日志文件中的命令进行了编号,利用这些编号可以方便地执行某些命令,比如
2.2.3 安全 Tips
Shell 命令记录日志,包含了大量的敏感操作记录(看上面的示例就能发现)。从防护的角度来说,如果Linux系统主机被入侵,这些日志文件会记录下黑客登录主机后进行的操作(如果日志没被抹去的话)。从攻击的角度来说,一是这些日志能给黑客提供大量的敏感信息,方便黑客进行快速渗透;二是黑客所有的操作命令也会被记录到日志中,后渗透攻击阶段要记得抹除这些攻击日志。
3. 系统日志(syslog/rsyslog)
syslog
是一个历史悠久的日志系统,几乎所有的UNIX和Linux操作系统都是采用 syslog
进行系统日志的管理和配置。Linux 系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息。这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。而执行这个过程的程序就是 syslog
。syslog
可以根据信息的来源以及信息的重要程度将信息保存到不同的日志文件中,例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。在默认的 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
报告的认证活动,记录认证系统login
、su
、getty
等的活动信息;- authpriv —— 包括特权信息如用户名在内的认证活动,只登录到所选择的单个用户可读的文件中;
- cron - 与
cron
和at
有关的计划任务信息;- daemon -与
inetd
守护进程有关的后台进程信息;- kern - 内核信息,首先通过
klogd
传递;- lpr - 与打印服务有关的信息;
- mail - 与电子邮件有关的信息;
- mark -
syslog
内部功能用于生成时间戳;- 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 。其中 panic
、 error
、 warn
均为旧的标识符,不再建议使用。
在定义 level
级别的时候,需要注意两点:
- 优先级是由应用程序在编程的时候已经决定的,除非修改源码再编译,否则不能改变消息的优先级;
- 低的优先级包含高优先级,例如,为某个应用程序定义
info
的日志导向,则涵盖notice
、warning
、err
、crit
、alert
、emerg
等消息。(除非使用=
号定义)
3.1.3 selector
通过点号 .
把 facility
和 level
连接在一起则成为 selector(选择条件)
。可以使用分号 ;
同时定义多个选择条件。也支持三个修饰符:
*
- 所有日志信息;=
- 等于,即仅包含本优先级的日志信息;!
- 不等于,本优先级日志信息除外;
3.1.4 action
由前面选择条件定义的日志信息,可执行下面的动作:
file - 指定日志文件的绝对路径;
terminal 或 print - 发送到串行或并行设备标志符,例如/dev/ttyS2
;
@host - 远程的日志服务器;
username - 发送信息到本机的指定用户信息窗口中,但该用户必须已经登录到系统中;
named pipe - 发送到预先使用mkfifo
命令来创建的FIFO
文件的绝对路径※注意,不能通过|/var/xxx.sh
方式导向日志到其他脚本中处理。
3.1.5 配置举例
上面详细讲解了 syslog
配置文件 /etc/syslog.conf
里核心的配置方法,下面举几个例子说明一下配置项及其意义:
|
|
也就是说,假设 mail.=info
信息通过上面范例中定义的规则时,/var/adm/info
、/var/adm/mail
、/dev/tty12
,甚至 jiayu 主机都会收到相同的信息。这样看上去比较烦琐,但可以带来的好处就是保证了信息的完整性,可供不同地方进行分析。
3.2 messages 日志
/var/log/messages
,是核心系统日志文件。它包含了系统启动时的引导信息,以及系统运行时的其他状态消息,比如 mail
, cron
, daemon
,kern
和 auth
,甚至 iptables
和 SELinux
和 DHCP
服务日志,这也是它被称为杂货铺的原因。通常,该文件时在做故障诊断时首先要查看的文件,大家一般都喜欢用以下命令看最后十条日志:
该文件以用户易懂的格式明文保存文件,可以用常见的 Linux 文件处理命令来分析处理其中的日志内容。
3.3 dmesg
dmesg
提供了一个简单的方法查看系统启动信息。当 Linux 启动的时候,内核的信息被存入内核 ring
缓存和日志文件 /var/log/dmesg
当中,dmesg
可以显示缓存中的内容。默认情况下,dmesg
打印内容到屏幕上面,当然你可以重定向输出到一个文件。如果硬件损坏的话,在 dmesg
日志里是有显示的,可用以下命令来查看 dmesg | grep error
。
正常状态下,也可以用 dmesg
命令查看最后一次系统引导的日志,下面是部分输出:
3.4 日志转储
3.4.1 简介
系统工作到了一定时间后,系统日志文件的内容随着时间和访问量的增加而越来越多,日志文件也越来越大。而且当日志文件超过系统控制范围时候,还会对系统性能造成影响。转储方式可以设为每年转储、每月转储、每周转储、达到一定大小转储。在 Linux 系统,经常使用 logrotate
工具进行日志转储,结合 cron
计划任务,可以轻松实现日志文件的转储。转储方式的设置由 /etc/logrotate.conf
配置文件控制。
logrotate
程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做 转储。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron
程序来执行(/etc/cron.daily/logrotate
)。logrotate
程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。
主流 Linux 发行版上都默认安装有 logrotate
包,如果出于某种原因, logrotate
没有出现在里头,你可以使用 apt-get
或 yum
命令来安装。
在 Debian 或 Ubuntu上安装:
在 RH 系发行版(RHEL/Fedora/CentOS等)上安装:
3.4.2 配置
CentOS7
系统中默认的 /etc/logrotate.conf
文件内容是:
以上内容中部分名词解释:
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. 参考资料