Unix 日志文件实用工具全解析
1. 日志文件概述
Unix 系统中有多种日志文件用于记录不同类型的系统活动,这些日志文件对于系统管理、安全审计和故障排查都非常重要。以下是一些常见的 Unix 日志文件及其用途:
-
lastlog 文件
:用于快速访问用户最后一次登录系统的时间,但不提供每个账户使用的详细历史记录。
-
utmp 文件
:记录当前登录到系统的用户信息,是一个二进制文件,通常位于 /etc、/var/adm 或 /var/run 目录下,文件大小一般不超过几 KB。
-
wtmp 文件
:记录用户的登录和注销信息,每次用户登录或注销时,该文件都会更新,文件大小会不断增长,通常位于 /var/adm 或 /var/log 目录下。
-
loginlog 文件
:在基于 System V 的 Unix 版本(包括 Solaris)中,用于记录失败的登录尝试。
-
acct 或 pacct 文件
:用于进程会计,记录每个用户运行的每个命令,可用于确定用户执行的命令、检查旧软件的使用情况或发现谁在文件服务器上玩游戏等。
-
messages 文件
:许多 Unix 版本会将系统控制台打印的任何消息的副本保存在该文件中,通常位于 /var/log/messages 或 /var/adm/messages 目录下。
-
aculog 文件
:tip 命令和 Berkeley 版本的 UUCP 命令在每次拨打电话时会将相关信息记录在此文件中。
-
sulog 文件
:某些 Unix 版本会将使用 su 命令尝试成为超级用户的信息记录在此文件中。
2. 日志文件详细介绍
2.1 lastlog 文件处理程序
程序首先检查命令行参数,如果没有提供参数,则使用默认值。然后,它会构建一个将 UID 映射到登录名的关联数组。初始化完成后,程序会从 lastlog 文件中逐行读取记录,对每个二进制记录进行解包和解码,将存储的时间解码为更易理解的格式,最后打印输出。以下是读取 lastlog 文件的脚本示例:
$host = "($host)" if $host;
($sec, $min, $hour, $mday, $mon, $year) = localtime($time);
$year += 1900;
printf "%-16s %-12s %10s %s\n",
$names{$uid}, $line, "$mday/$mon/$year", $host;
}
close LASTL;
2.2 utmp 和 wtmp 文件
2.2.1 文件内容
不同版本的 Unix 系统中,utmp 和 wtmp 文件包含的信息有所不同:
| Unix 版本 | utmp 和 wtmp 文件包含信息 |
| ---- | ---- |
| Berkeley 派生版本 | 登录使用的终端设备名称、用户名、如果通过网络登录则记录连接发起的主机名、用户登录时间 |
| System V Unix 派生版本(AT&T System V.3.2) | 用户名、终端行号、设备名称、登录 shell 的进程 ID、表示条目类型的代码、进程退出状态、条目创建时间 |
| Solaris、IRIX 等 SVR4 Unix 操作系统使用的扩展 wtmpx 文件 | 用户名(32 个字符而非 8 个)、inittab ID(表示连接类型)、终端名称(32 个字符而非 12 个)、设备名称、登录 shell 的进程 ID、表示条目类型的代码、进程退出状态、条目创建时间、会话 ID、用于未来扩展的未使用字节、如果通过网络登录则记录远程主机名 |
2.2.2 文件检查
Unix 中有多个程序通过扫描 /etc/utmp 文件来报告当前登录到系统的用户信息,如 who、whodo、w、users 和 finger 命令。write 命令会检查该文件以确定用户是否当前登录以及登录的终端。last 程序通过扫描 wtmp 文件来打印最近用户登录时间的详细报告。ps 命令比 who、whodo、users 和 finger 命令能更准确地反映当前使用系统的用户情况,但 who、users 和 finger 命令也有一些优势:
- 信息呈现格式通常比 ps 输出更易读。
- 有时包含 ps 输出中没有的信息,如远程主机名。
- 运行速度可能比 ps 快得多。
2.2.3 文件权限
utmp 文件的权限应设置为 644,并且文件所有者应为 root,否则用户可能会将自己从当前登录用户列表中移除。
2.3 su 命令与 utmp 和 wtmp 文件
使用 su 命令时,它会创建一个新进程,同时更改进程的真实 UID 和有效 UID,从而允许你访问其他用户的文件并以其他用户身份运行程序。但 su 命令不会更改你在 utmp 或 wtmp 文件中的条目,因此 finger 命令将继续显示你登录的账户,而不是你切换到的账户。许多其他程序在 su 子 shell 中使用时也可能无法正常工作,因为它们从 utmp 条目中确定你的用户名,而不是从真实或有效 UID 中确定。不同版本的 su 命令有不同的选项,例如 su - user 这种形式会使目标用户的 shell 像登录 shell 一样启动。因此,使用 su 命令时应谨慎,虽然它对于快速测试很有用,但由于它不能正确更新 utmp 和 wtmp 文件,可能会给其他用户和一些系统实用程序带来很大的困惑。
2.4 last 程序
每次用户登录或注销时,Unix 都会在 wtmp 文件中记录一条信息。last 程序以易读的形式显示该文件的内容。如果不带任何参数运行 last 命令,它将显示所有设备上的所有登录和注销信息。你可以通过按中断字符(通常是 Ctrl - C)来中止显示。例如:
% last
dpryor ttyp3 std.com Sat Mar 11 12:21 - 12:24 (00:02)
simsong ttyp2 204.17.195.43 Sat Mar 11 11:56 - 11:57 (00:00)
simsong ttyp1 204.17.195.43 Sat Mar 11 11:37 still logged in
dpryor console Wed Mar 8 10:47 - 17:41 (2+06:53)
devon console Wed Mar 8 10:43 - 10:47 (00:03)
simsong ttyp3 pleasant.cambrid Mon Mar 6 16:27 - 16:28 (00:01)
dpryor ftp mac4 Fri Mar 3 16:31 - 16:33 (00:02)
dpryor console Fri Mar 3 12:01 - 10:43 (4+22:41)
simsong ftp pleasant.cambrid Fri Mar 3 08:40 - 08:56 (00:15)
simsong ttyp2 pleasant.cambrid Thu Mar 2 20:08 - 21:08 (00:59)
last 命令允许你指定用户名或终端作为参数来减少显示的信息量。如果你提供用户名,last 将仅显示该用户的登录和注销信息;如果你提供终端名,last 将仅显示指定终端的登录和注销信息。例如:
% last dpryor
dpryor ttyp3 std.com Sat Mar 11 12:21 - 12:24 (00:02)
dpryor console Wed Mar 8 10:47 - 17:41 (2+06:53)
dpryor ftp mac4 Fri Mar 3 16:31 - 16:33 (00:02)
dpryor console Fri Mar 3 12:01 - 10:43 (4+22:41)
dpryor ftp mac4 Mon Feb 27 10:43 - 10:45 (00:01)
dpryor ttyp6 std.com Sun Feb 26 01:12 - 01:13 (00:01)
dpryor ftp mac4 Thu Feb 23 14:42 - 14:43 (00:01)
dpryor ftp mac4 Thu Feb 23 14:20 - 14:25 (00:04)
dpryor ttyp3 mac4 Wed Feb 22 13:04 - 13:06 (00:02)
dpryor console Tue Feb 21 09:57 - 12:01 (10+02:04)
你可以每天早上运行 last 命令,以查看前一晚是否有意外登录。在某些系统中,wtmp 文件还会记录系统关机和重启信息。
2.5 wtmp 文件的修剪
wtmp 文件会不断增长,直到计算机硬盘空间耗尽。因此,许多 Unix 发行版会包含 shell 脚本,通过 cron 程序定期自动清空 wtmp 文件(如每周或每月一次)。例如,一些每月执行的 shell 脚本可能包含如下语句:
# Zero the log file.
cat /dev/null >/var/adm/wtmp
为了保留前一个月的登录记录,你可以先复制 wtmp 文件,然后再清空原文件。具体操作如下:
# Make a copy of the log file and zero the old one.
mv /var/adm/wtmp /var/adm/wtmp.old
cp /dev/null /var/adm/wtmp
chmod 600 /var/adm/wtmp
大多数版本的 last 命令允许你使用 -f 选项指定要使用的文件,而不是默认的 wtmp 文件。例如:
% last -f /var/adm/wtmp.old
但有些版本的 last 命令不允许指定不同的 wtmp 文件进行搜索,在这种情况下,你需要暂时将 wtmp 文件的副本放回其原始位置。以下是一个示例 shell 脚本:
#!/bin/sh
mv /var/adm/wtmp /var/adm/wtmp.real
mv /var/adm/wtmp.old /var/adm/wtmp
last $*
mv /var/adm/wtmp /var/adm/wtmp.old
mv /var/adm/wtmp.real /var/adm/wtmp
这种方法存在一个严重问题:在命令运行期间,所有登录和注销信息将记录到 wtmp.old 文件中。
2.6 loginlog 文件
在基于 System V 的 Unix 版本(包括 Solaris)中,你可以通过以下命令创建 /var/adm/loginlog 文件来记录失败的登录尝试:
# touch /var/adm/loginlog
# chmod 600 /var/adm/loginlog
# chown root /var/adm/loginlog
创建该文件后,Unix 将记录所有失败的登录尝试。“失败的登录尝试”定义为用户尝试登录系统但连续五次输入错误密码的情况。通常,System V Unix 在第五次尝试后会挂断呼叫者(或断开 Telnet 连接)。如果该文件存在,Unix 还会记录五次错误尝试的事实。文件内容示例如下:
# cat /var/adm/loginlog
simsong:/dev/pts/8:Mon Oct 7 00:42:14 2002
simsong:/dev/pts/8:Mon Oct 7 00:42:20 2002
simsong:/dev/pts/8:Mon Oct 7 00:42:26 2002
simsong:/dev/pts/8:Mon Oct 7 00:42:39 2002
simsong:/dev/pts/8:Mon Oct 7 00:42:50 2002
#
2.7 进程会计:acct/pacct 文件
Unix 除了记录登录和注销信息外,还可以记录每个用户运行的每个命令,这种特殊的日志记录方式称为进程会计。通常,进程会计仅在根据用户消耗的 CPU 时间计费的情况下使用。acct 或 pacct 文件可在系统被入侵后用于确定用户执行的命令(前提是日志文件未被删除),也可用于其他目的,如检查是否有人使用你想删除的旧软件或谁在文件服务器上玩游戏。lastcomm 或 acctcom 程序可以将该文件的内容以人类可读的格式显示出来。例如:
% lastcomm
sendmail F root _ _ 0.05 secs Sat Mar 11 13:28
mail S daemon _ _ 0.34 secs Sat Mar 11 13:28
send dfr _ _ 0.05 secs Sat Mar 11 13:28
post dfr ttysf 0.11 secs Sat Mar 11 13:28
sendmail F root _ _ 0.09 secs Sat Mar 11 13:28
sendmail F root _ _ 0.23 secs Sat Mar 11 13:28
sendmail F root _ _ 0.02 secs Sat Mar 11 13:28
anno dfr ttys1 0.14 secs Sat Mar 11 13:28
sendmail F root _ _ 0.03 secs Sat Mar 11 13:28
mail S daemon _ _ 0.30 secs Sat Mar 11 13:28
%
如果系统中有入侵者且未编辑或删除 /var/adm/acct 文件,lastcomm 将提供入侵者使用的命令记录。但 Unix 会计不会记录入侵者输入的命令参数或命令执行的目录。因此,要注意入侵者执行的名为 vi 的程序可能实际上是重命名后的 cc 程序,仅通过检查此日志文件无法确定。在使用频率适中的系统中,/var/adm/acct 文件会快速增长,通常每天增长超过一到两兆字节。因此,大多数使用会计功能的站点会每晚运行 sa 或 runacct 命令,将 acct 或 pacct 文件中的信息处理成摘要文件,通常保存在 /var/adm/savacct 中。
2.8 messages 日志文件
许多 Unix 版本会将系统控制台打印的任何消息的副本保存在 /var/log/messages 或 /var/adm/messages 文件中。以下是一个运行 SunOS 4.1 版本的计算机的 messages 文件示例:
Mar 14 14:30:58 bolt su: 'su root' succeeded for tanya on /dev/ttyrb
Mar 14 14:33:59 bolt vmunix: /home: file system full
Mar 14 14:33:59 bolt last message repeated 8 times
Mar 14 14:33:59 bolt vmunix: /home: file system full
Mar 14 14:33:59 bolt last message repeated 16 times
从这个示例可以看出,计算机 bolt 存在磁盘已满的问题。
2.9 特定程序日志文件
根据你使用的 Unix 版本,你可能会在日志文件目录中找到许多其他日志文件。
2.9.1 aculog 日志文件
tip 命令和 Berkeley 版本的 UUCP 命令在每次拨打电话时会将相关信息记录在 aculog 文件中,包括账户名、日期、时间、用于拨打电话的 /etc/remote 文件中的条目、拨打的电话号码、实际使用的设备以及呼叫是否成功。以下是一个示例日志:
tomh (Mon Feb 13 08:43:03 1995) <cu1200, , > call aborted
tomh (Tue Mar 14 16:05:00 1995) <a9600, , /dev/cua> call completed
carol (Tue Mar 14 18:08:33 1995) <mit, 2531000, /dev/cua> call completed
在前两种情况下,用户 tomh 直接连接到调制解调器,此时未记录拨打的电话号码。许多调制解调器可以通过发送特殊的“转义序列”进入命令模式,虽然你可以禁用此功能,但许多站点并未这样做。在这种情况下,无法确定 aculog 中列出的电话号码是否确实是用户拨打的,也没有每个呼叫持续时间的详细信息。
2.9.2 sulog 日志文件
某些 Unix 版本会通过打印到控制台(因此也会记录到 messages 日志文件中)来记录使用 su 命令尝试成为超级用户的信息。此外,一些版本会专门将 su 尝试记录到 sulog 文件中。在某些与 System V 相关的 Unix 版本中,你可以通过 /etc/default/su 文件中的设置来确定日志记录方式。根据涉及的版本,你可能可以设置以下内容:
# A file to log all su attempts
SULOG=/var/adm/sulog
综上所述,Unix 系统中的各种日志文件为系统管理和安全审计提供了丰富的信息。通过合理使用这些日志文件,系统管理员可以更好地监控系统活动、排查故障和保障系统安全。
3. 不同 Unix 版本的进程会计操作
3.1 SVR4 系统的会计操作
在 SVR4 系统中,启动会计功能需要使用特定命令,并且会计文件和读取工具也有相应规定,以下是详细操作步骤:
1.
启动会计功能
:使用命令
/usr/lib/acct/startup
来启动会计功能。
2.
会计文件位置
:该系统的会计文件通常为
/var/adm/pacct
。
3.
读取会计文件
:使用
acctcom
命令读取会计文件,该命令有超过 20 个选项,可提供各种有趣的摘要信息。你可以查看系统的手册页来了解更多可能性和相关命令。
3.2 BSD 和 Linux 系统的会计操作
在 BSD 和 Linux 系统中,开启和使用会计功能的步骤如下:
1.
开启会计功能
:使用
accton
命令开启会计功能,根据 Unix 版本的不同,
accton
命令可能位于
/usr/etc
、
/usr/sbin
或
/usr/lib/acct
目录下。命令格式为
accton filename
,其中
filename
指定会计信息的存储位置,通常为
/var/adm/acct
。
2.
读取会计文件
:使用
lastcomm
命令读取会计文件。
3.3 会计文件记录内容
Unix 内核在每次进程终止时,会向
/var/adm/acct
文件写入一个 32 字节的记录,其中包含以下信息:
| 记录内容 | 说明 |
| ---- | ---- |
| 用户名称 | 运行命令的用户的名称 |
| 命令名称 | 执行的命令的名称 |
| CPU 时间 | 命令使用的 CPU 时间 |
| 退出时间 | 进程退出的时间 |
| 标志 | 包含一些特殊标志,如
s
表示命令由超级用户执行,
F
表示命令在 fork 后运行但未执行 exec,
D
表示命令退出时生成了核心文件,
X
表示命令被信号终止 |
由于会计记录是在进程终止时写入的,因此在具有长时间运行进程的系统上读取会计日志可能会比较棘手,日志通常按终止顺序排列,而不是执行顺序。
3.4 会计文件的管理
在使用频率适中的系统中,
/var/adm/acct
文件会快速增长,每天可能增长超过一到两兆字节。为了管理这些文件,大多数使用会计功能的站点会采取以下措施:
1.
定期处理
:每晚运行
sa
或
runacct
命令,将
acct
或
pacct
文件中的信息处理成摘要文件。
2.
保存摘要文件
:摘要文件通常保存在
/var/adm/savacct
中。
4. 日志文件的安全与使用建议
4.1 日志文件的安全问题
-
权限设置
:对于一些重要的日志文件,如
acct文件,为了防止入侵者查看管理员是否在监控他们,或者防止普通用户获取敏感信息,一些管理员会更改日志文件的权限模式,只允许超级用户读取其内容。 -
信息完整性
:Unix 会计不记录命令的参数和执行目录,这可能导致无法准确判断入侵者执行的命令的真实情况。例如,一个名为
vi的程序可能实际上是重命名后的cc程序。
4.2 日志文件的使用建议
-
日常监控
:
-
每天早上运行
last命令,查看前一晚是否有意外登录。 -
定期检查
messages文件,及时发现系统出现的问题,如磁盘空间不足等。
-
每天早上运行
-
数据保留
:对于
wtmp文件,建议在清空之前先进行备份,以便后续查看历史登录信息。可以使用以下脚本进行备份和清空操作:
# Make a copy of the log file and zero the old one.
mv /var/adm/wtmp /var/adm/wtmp.old
cp /dev/null /var/adm/wtmp
chmod 600 /var/adm/wtmp
-
异常处理
:如果发现系统中有入侵者,且
/var/adm/acct文件未被编辑或删除,可以使用lastcomm命令查看入侵者使用的命令记录。但要注意其局限性,不能仅凭命令名称判断命令的真实用途。
5. 总结与流程图展示
5.1 总结
Unix 系统中的日志文件是系统管理和安全审计的重要工具。不同的日志文件记录了系统的不同活动,如用户登录、命令执行、系统消息等。通过合理使用这些日志文件,系统管理员可以及时发现系统中的异常情况,保障系统的安全稳定运行。但同时也要注意日志文件的管理和安全问题,如权限设置、数据保留等。
5.2 流程图
以下是一个简单的 Unix 日志文件管理流程图,展示了日志文件的主要操作流程:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([开始]):::startend --> B(日志文件记录):::process
B --> C{日志文件类型}:::process
C -->|lastlog| D(快速访问用户最后登录时间):::process
C -->|utmp| E(记录当前登录用户信息):::process
C -->|wtmp| F(记录登录和注销信息):::process
C -->|loginlog| G(记录失败登录尝试):::process
C -->|acct/pacct| H(进程会计记录):::process
C -->|messages| I(记录系统消息):::process
C -->|aculog| J(记录电话呼叫信息):::process
C -->|sulog| K(记录 su 命令尝试):::process
D --> L(读取和分析):::process
E --> L
F --> L
G --> L
H --> L
I --> L
J --> L
K --> L
L --> M{是否有异常}:::process
M -->|是| N(采取相应措施):::process
M -->|否| O(继续监控):::process
N --> P(日志文件管理):::process
O --> P
P --> Q(备份、修剪等操作):::process
Q --> R([结束]):::startend
这个流程图展示了从日志文件记录到异常处理和日志文件管理的整个过程,帮助系统管理员更好地理解和管理 Unix 系统中的日志文件。通过对日志文件的有效利用和管理,可以提高系统的安全性和稳定性,及时发现并解决潜在的问题。
超级会员免费看
1750

被折叠的 条评论
为什么被折叠?



