Unix 日志文件实用工具全解析
在 Unix 系统的管理和维护中,日志文件起着至关重要的作用。它记录了系统的各种活动和事件,为系统管理员提供了监控系统状态、排查问题以及进行安全审计的重要依据。本文将详细介绍 Unix 系统中一些常用的日志文件实用工具,包括 syslog、newsyslog、Swatch 以及 lastlog 文件的相关知识。
1. syslog 配置与使用
syslog 是 Unix 系统中用于记录系统日志的标准工具,它可以将不同来源的日志消息发送到指定的目标。通过编辑 syslog.conf 文件,可以灵活配置日志消息的处理规则。
以下是一些常见的配置示例:
- lpr.* /var/log/lpd-errs :将行式打印机系统的所有消息追加到 /var/log/lpd-errs 文件中。
- auth.* root,nosmis :将授权系统的所有消息发送给用户 root 和 nosmis ,但如果用户未登录,消息将丢失。
- auth.* @prep.ai.mit.edu :将所有授权消息发送到 prep.ai.mit.edu 计算机上的 syslog 守护进程。
- *.emerg * :将所有紧急消息显示在每个用户的终端上。
- *.alert |dectalker :将所有警报消息发送给 dectalker 程序,该程序可能会通过公共广播系统广播消息。
- mark.* /dev/console :每 20 分钟在系统控制台上打印一次时间。
在网络环境中使用 syslog 时,可以通过 syslog.conf 文件将部分或全部日志消息发送到其他机器。但 syslog 系统存在一个问题,即没有明显的方法来限制传入的日志消息。大多数版本的 syslog 只有 -r 标志来进行一定的控制,在某些系统上指定该标志会使 syslogd 拒绝所有远程消息,而在大多数 Linux 系统上则会接受。
为了防止拒绝服务攻击和虚假日志记录,需要对网络进行适当的筛选,或者使用基于主机的防火墙,只接受来自安全主机的 UDP 端口 514 上的消息。如果担心攻击者窃听 syslog 数据包,可以使用 netcat 等程序通过 TCP 传输日志,并通过 SSH 或 SSL 隧道提供加密和完整性保护。
可以通过以下步骤配置机器将所有日志消息发送到远程日志主机:
1. 打开 syslogd.conf 文件。
2. 添加 *.* @loghost 这一行。
2. 将 syslog 集成到自己的程序中
syslog 网络协议已成为在互联网上记录程序和服务器信息的事实上的标准。许多路由器、交换机和远程访问设备都会传输 syslog 消息,并且各种计算机都有可用的 syslog 服务器。
可以使用 openlog() 和 syslog() 函数将 syslog 调用插入到自己的程序中。以下是一个示例程序,它将 “Hi Mom!” 以 info 优先级记录到 local0 设施中:
#include <syslog.h>
#include <stdarg.h>
int main(int argc,char **argv)
{
openlog(argv[0],LOG_PID,LOG_LOCAL0);
syslog(LOG_INFO,"Hi Mom!");
return(0);
}
编译并运行该程序:
[simsong@r2 ~] 303 % cc -o mom mom.c
[simsong@r2 ~] 304 % ./mom
[simsong@r2 ~] 305 % tail -1 /var/log/local0.log
Aug 18 23:44:46 <local0.info> r2 ./mom[6581]: Hi Mom!
如果编写 shell 脚本,也可以使用 logger 命令将日志记录到 syslog 中。例如,记录一个关于用户尝试使用无效参数执行 shell 文件的警告消息:
logger -t ThisProg -p user.notice "Called without required # of parameters"
3. 警惕虚假的 syslog 日志条目
Unix 的 syslog 设施允许任何用户创建日志条目,这就存在将虚假数据输入到日志中的可能性。下面是一个有趣的案例:
一位 Unix 系统管理员为了报复一个讨厌的学生,通过运行一个脚本定期向 /dev/console 重定向输出,模拟该学生执行 su 命令失败和成功的消息,导致系统管理员误判并采取了过激行动。
这个案例告诉我们,在处理审计跟踪时要保持警惕,不要轻易恐慌。
4. 使用 newsyslog 旋转日志
日志文件会随着时间的推移而不断增长,如果不进行处理,最终会填满所在的分区。早期的 Unix 系统依赖人工手动修剪日志文件,但这是一项繁琐的任务。后来,许多站点开发了自动滚动日志文件的软件。
newsyslog 程序提供了一个统一的系统来旋转日志文件,它每小时运行一次,读取配置文件以确定哪些日志文件需要旋转以及如何旋转。 newsyslog 具有以下特点:
- 可以根据日志文件达到一定大小、一定年龄或预定时间自动旋转。
- 旋转后的日志文件会被赋予合理的名称,如 logfile 、 logfile.0 、 logfile.1 等。
- 可以自动设置旋转后日志文件的模式、所有者和组。
- 可以选择对旋转后的日志文件进行压缩。
- 在文件旋转时,会自动向 syslog 进程发送 kill 信号。
- 如果进程的 PID 存储在文件中(这是 Unix 的惯例),可以在日志文件滚动时向其他进程发送信号。
newsyslog 通常通过 cron 每小时运行一次。其配置文件 /etc/newsyslog.conf 每行的格式如下表所示:
| Column | Purpose | Example |
| ---- | ---- | ---- |
| logfilename | 要旋转的日志文件的名称 | /var/log/messages |
| [owner:group] | 旋转后日志文件的可选所有者和组 | root:wheel |
| mode | 旋转后日志文件的八进制模式 | 600 |
| count | 要保留的旋转后日志文件的数量 | 3 |
| size | 日志文件应旋转的大小(以千字节为单位),使用 * 忽略大小 | 100 |
| when | 日志文件应旋转的时间,数字表示小时数,使用 * 忽略时间 | 168 (weekly) |
| [ZJB] | Z :使用 gzip 压缩归档; J :使用 bzip2 压缩文件; B :指定文件为二进制,防止 newsyslog 插入文本消息 | Z |
| [pidfile] | 指定一个可选文件,其中包含在相应日志文件旋转时要发送信号的进程的 PID | /var/run/httpd.pid |
| [sig_num] | 指定在日志文件旋转时要发送给进程的信号编号,默认发送信号 1 (SIGHUP) | 1 |
以下是一个示例配置文件:
# logfilename [owner:group] mode count size when [ZJB] [pidfile] [sig_num]
/var/log/cron 600 3 100 * Z
/var/log/amd.log 644 7 100 * Z
/var/log/kerberos.log 644 7 100 * Z
/var/log/lpd-errs 644 7 100 * Z
/var/log/maillog 644 7 * 168 Z
/var/log/messages 644 5 100 * Z
/var/log/all.log 600 7 * @T00 Z
/var/log/slip.log 600 3 100 * Z
/var/log/ppp.log 600 3 100 * Z
/var/log/security 600 10 100 * Z
/var/log/wtmp 644 3 1000 * B
/var/log/daily.log 640 7 * @T00 Z
/var/log/weekly.log 640 5 1 $W6D0 Z
/var/log/monthly.log 640 12 * $M1D0 Z
/var/log/console.log 640 5 100 * Z
许多站点可能希望修改 /etc/newsyslog.conf 配置文件,以延长日志的保存时间。日志旋转应与其他备份程序协调,以便可以访问连续的日志历史记录。此外,在日志旋转时生成 MD5 或 SHA - 1 加密校验和可以验证其未来的完整性。
5. Swatch:日志文件分析工具
Swatch 是由斯坦福大学 EE 计算机设施的 E. Todd Atkins 开发的系统看门狗,它是一个简单的 Perl 程序,用于监控日志文件,并在发现特定模式时发出警报。Swatch 具有很大的灵活性,虽然它目前不是任何 Unix 发行版的标准软件,但可以从 http://www.oit.ucsb.edu/~eta/swatch/ 获得。它适合运行 1 到 20 台服务器的组织。
5.1 运行 Swatch
Swatch 有两种运行模式:批量模式和实时监控模式。可以通过以下命令从命令行运行 Swatch:
% swatch options input-source
常用选项如下:
- -c config_file :指定要使用的配置文件,默认使用 ~/.swatchrc 。
- -r restart_time :允许指定 Swatch 在一定时间后重新启动,时间可以是绝对时间(如 hh:mm[am|pm] )或相对时间(如 +hh:mm )。
输入源的指定参数如下:
- -f filename :指定 Swatch 要检查的文件,Swatch 将对文件进行单次扫描。
- -p program :指定 Swatch 要运行的程序,并检查其结果。
- -t filename :指定 Swatch 要持续检查的文件,Swatch 将在每行文本添加时进行检查。
- -I input_separator :指定 Swatch 用于分隔输入文件中每个输入记录的分隔符,默认使用换行符。
5.2 Swatch 配置文件
Swatch 的操作由配置文件控制,文件的每一行由四个制表符分隔的字段组成,格式如下:
/pattern/[,/pattern/,...] action[,action,...] [[[HH:]MM:]SS] [start:length]
- 第一个字段指定在日志文件的每一行上扫描的模式,采用 Perl 正则表达式的形式,类似于
egrep使用的正则表达式。如果指定多个模式,任何一个模式匹配即表示匹配成功。 - 第二个字段指定每次第一个字段中的模式匹配时要采取的动作,Swatch 支持以下动作:
-
echo[=mode]:打印匹配的行,可以指定可选模式,如normal、bold、underscore、blink或inverse。 -
bell[=N]:打印匹配的行并响铃,可以指定响铃次数N。 -
exec=command:执行指定的命令,如果在配置文件中指定$0或$*,将被替换为日志文件中的整行;如果指定$N,将被替换为日志文件行中的第N个字段。 -
system=command:类似于exec=动作,但在命令执行完成之前,Swatch 不会处理日志文件中的其他行。 -
ignore:忽略匹配的行。 -
mail[=address:address:...]:将匹配的行通过电子邮件发送到指定地址,如果未指定地址,将发送给运行程序的用户。 -
pipe=command:将匹配的行通过管道传递给指定的命令。 -
write[=user:user:...]:使用write命令将匹配的行写入用户的终端。 - 第三个和第四个字段是可选的,用于控制发送到日志文件的相同行。如果指定时间,Swatch 将在指定时间段内不会为相同的行发出警报,而是仅在第一行触发时通知,然后在指定时间段过后再次通知。第四个字段指定日志文件中时间戳的位置。
例如,对于以下重复的日志消息:
Apr 3 01:01:00 next routed[9055]: bind: Bad file number
Apr 3 02:01:00 next routed[9135]: bind: Bad file number
Apr 3 03:01:00 next routed[9198]: bind: Bad file number
Apr 3 04:01:00 next routed[9273]: bind: Bad file number
可以使用以下 Swatch 配置行来捕获:
/routed.*bind/ echo 24:00:00 0:16
这将使 Swatch 每天只报告一次 routed 消息:
*** The following was seen 20 times in the last 24 hours(s):
==> next routed[9273]: bind: Bad file number
需要注意的是,在配置文件中必须使用制表符分隔字段,否则可能会出现解析错误。
6. lastlog 文件
Unix 系统将每个用户最后一次登录系统的时间记录在 lastlog 日志文件中,每次登录时会显示该时间,使用 finger 命令也可以查看。一些基于 System V Unix 的版本在用户登录时会显示最后一次成功登录和最后一次失败登录的时间。
为了安全起见,建议教导用户每次登录时检查最后登录时间。如果显示的时间与用户上次使用系统的时间不符,可能有人在使用他的账户,用户应立即通知系统管理员。
然而, lastlog 机制的设计存在缺陷,每次登录时会覆盖文件的先前内容。如果用户稍有疏忽或登录消息清屏,可能会错过可疑时间,而且系统管理员也无法再查看该时间。
为了弥补这一缺陷,可以通过 cron 定期创建文件的磁盘副本。例如,每六小时运行一次以下 shell 脚本:
mv /var/log/lastlog.3 /var/log/lastlog.4
mv /var/log/lastlog.2 /var/log/lastlog.3
mv /var/log/lastlog.1 /var/log/lastlog.2
cp /var/log/lastlog /var/log/lastlog.1
这样可以以六小时为周期保存文件内容。如果每天进行备份,文件也会在备份中保留以供后续检查。
如果有保存的 lastlog 文件副本,需要编写自己的脚本来读取其内容。以下是一个适用于 Linux 系统的 Perl 脚本:
#!/usr/local/bin/perl
$fname = (shift || "/var/log/lastlog");
setpwent;
while (($name, $junk, $uid) = getpwent) {
$names{$uid} = $name;
}
endpwent;
# Size of the "line" and "host" fields, in bytes.
# These values are for Linux. On Solaris, use 8 and 16, respectively.
$linesize = 32;
$hostsize = 256;
$recordsize = $linesize + $hostsize + 4; # 4 bytes for the time value
$unpacktemplate = "l A$linesize A$hostsize";
open(LASTL, $fname);
for ($uid = 0; read(LASTL, $record, $recordsize); $uid++) {
($time, $line, $host) = unpack($unpacktemplate, $record);
next unless $time;
通过合理使用这些日志文件实用工具,系统管理员可以更好地管理和维护 Unix 系统,确保系统的安全和稳定运行。
Unix 日志文件实用工具全解析
7. 日志工具使用流程总结
为了更清晰地展示各个日志工具的使用流程,下面通过 mermaid 流程图来呈现:
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px
A([开始]):::startend --> B{选择工具}:::decision
B -->|syslog| C(配置syslog.conf文件):::process
C --> D(设置日志消息处理规则):::process
D --> E{网络环境?}:::decision
E -->|是| F(配置远程日志主机):::process
E -->|否| G(本地日志处理):::process
F --> H(考虑安全防护):::process
B -->|newsyslog| I(配置/etc/newsyslog.conf文件):::process
I --> J(设置日志旋转规则):::process
J --> K(通过cron定时运行):::process
B -->|Swatch| L(选择运行模式):::process
L --> M(配置Swatch参数):::process
M --> N(编写配置文件):::process
N --> O(监控日志文件):::process
B -->|lastlog| P(定期备份lastlog文件):::process
P --> Q(编写脚本读取备份文件):::process
G & H & K & O & Q --> R([结束]):::startend
这个流程图展示了在使用不同日志工具时的主要步骤。从开始选择工具,到针对不同工具进行具体的配置和操作,最后完成相应的日志处理任务。
8. 各工具优缺点对比
| 工具名称 | 优点 | 缺点 |
|---|---|---|
| syslog | - 是 Unix 系统标准日志工具,广泛支持。 - 可灵活配置日志消息处理规则。 - 支持网络传输日志消息。 | - 缺乏明显的限制传入日志消息的方法。 - 易受拒绝服务攻击和虚假日志记录影响。 |
| newsyslog | - 提供统一的日志文件旋转系统。 - 可根据多种条件自动旋转日志文件。 - 能设置旋转后日志文件的多种属性。 | - 默认配置较为保守。 - 不同系统可能有不同的实现细节。 |
| Swatch | - 灵活的日志文件监控和报警机制。 - 支持多种匹配模式和动作。 | - 不是 Unix 发行版的标准软件。 - 需要一定的正则表达式和脚本编写能力。 |
| lastlog 文件 | - 记录用户最后登录时间,有助于安全检查。 | - 设计存在缺陷,每次登录会覆盖旧记录。 - 没有标准的读取备份文件的工具,需自行编写脚本。 |
9. 实际应用场景分析
9.1 系统监控场景
在一个拥有多台服务器的企业环境中,需要实时监控系统的运行状态。可以使用 syslog 将各服务器的日志消息集中发送到一台中央日志服务器,便于统一管理和查看。同时,使用 Swatch 监控中央日志服务器上的日志文件,当发现特定的错误模式(如数据库连接失败、服务崩溃等)时,及时发出警报,通知系统管理员进行处理。
具体操作步骤如下:
1. 在各服务器的 syslog.conf 文件中添加配置,将需要监控的日志消息发送到中央日志服务器。例如:
auth.* @central_log_server
- 在中央日志服务器上运行 Swatch,配置监控规则。例如,监控数据库连接失败的消息:
/database connection failed/ mail=admin@example.com
9.2 日志管理场景
在一个长期运行的系统中,日志文件会不断增长,占用大量磁盘空间。使用 newsyslog 可以定期旋转日志文件,避免磁盘空间被占满。同时,结合备份策略,确保日志文件的完整性和可追溯性。
具体操作步骤如下:
1. 编辑 /etc/newsyslog.conf 文件,配置日志旋转规则。例如:
/var/log/messages root:wheel 644 5 100 * Z
- 确保
newsyslog通过cron每小时运行一次,以执行日志旋转任务。
9.3 用户安全检查场景
为了保障用户账户的安全,需要检查用户的登录时间。可以利用 lastlog 文件记录的信息,教导用户每次登录时检查最后登录时间。同时,定期备份 lastlog 文件,以便在发现异常时进行追溯。
具体操作步骤如下:
1. 编写 cron 任务,定期备份 lastlog 文件。例如,每六小时运行一次以下脚本:
mv /var/log/lastlog.3 /var/log/lastlog.4
mv /var/log/lastlog.2 /var/log/lastlog.3
mv /var/log/lastlog.1 /var/log/lastlog.2
cp /var/log/lastlog /var/log/lastlog.1
- 当用户发现最后登录时间异常时,系统管理员可以使用编写好的 Perl 脚本读取备份的
lastlog文件,进行详细检查。
10. 总结与建议
通过对 Unix 系统中常用的日志文件实用工具的介绍,我们了解到这些工具在系统管理、监控和安全方面的重要作用。在实际使用中,需要根据具体的需求和场景,合理选择和配置这些工具。
为了更好地使用这些工具,提出以下建议:
- 对于 syslog,要注意网络安全,采取必要的防护措施,避免受到攻击和虚假日志记录的影响。
- 使用 newsyslog 时,根据实际情况调整配置文件,延长日志保存时间,确保日志的完整性和可追溯性。
- 在使用 Swatch 时,要熟练掌握正则表达式和脚本编写,以便灵活配置监控规则和动作。
- 对于 lastlog 文件,要定期备份,并编写好读取备份文件的脚本,以便在需要时进行安全检查。
总之,合理运用这些日志工具,可以帮助系统管理员更好地管理和维护 Unix 系统,及时发现和解决问题,保障系统的安全和稳定运行。
超级会员免费看
1750

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



