Linux 日志剖析 | JiaYu's Blog
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 的缺省输出包括 用户名、终端类型、登录日期 及 远程主机。例如:
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将报告UID为102的用户;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 file,file 必须先存在。先使用 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 都是 bash,bash 会在每个用户主目录里生成一个 .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条命令,并给日志文件中的每条命令进行编号。
如果系统 默认 Shell 是 bash ,该命令会读取当前用户主目录下的 .bash_history 文件中的内容;虽然 man history 显示该命令其实是 bash 的一个内置命令模块,但如果系统 默认 Shell 是 zsh ,该命令则会读取 .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 系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息。这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。而执行这个过程的程序就是 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个级别。按严重程度由高到低顺序排列为: