日志系统
THE LOGGING SYSTEM
对于任何 Linux 用户,了解日志文件的使用是非常重要的。日志文件存储关于操作系统和应用程序运行时发生的事件的信息,包括任何错误和安全警报。您的系统将根据我将在本章中介绍的一系列规则自动记录信息。
作为黑客,日志文件可以跟踪目标的活动和身份。但是它也可以是你自己在别人系统上的活动的踪迹。因此,黑客需要知道他们可以收集什么信息,以及可以收集关于他们自己的行为和方法的什么信息,以便隐藏证据。
另一方面,任何保护 Linux 系统的人都需要知道如何管理日志记录功能,以确定系统是否受到攻击,然后破译实际发生的事情以及由谁做的。
本章向您展示如何检查和配置日志文件,以及如何删除活动的证据,甚至完全禁用日志记录。首先,我们将查看执行日志记录的守护进程。
RSYSLOG 日志记录守护进程
Linux 使用一个名为syslogd的守护进程来自动记录计算机上的事件。syslog的几个变体,包括 rsyslog 和 syslog-ng,在 Linux 的不同发行版上使用,尽管它们的操作非常相似,但仍然存在一些细微的差异。由于 Kali Linux 是在 Debian 上构建的,并且 Debian 默认情况下带有 rsyslog,所以我们将在本章重点介绍这个实用程序。如果您想使用其他发行版,那么有必要对它们的日志系统做一些研究。
让我们看看系统上的 rsyslog。我们将搜索与 rsyslog 相关的所有文件。首先,在 kali 打开一个终端,输入以下内容:
kali >locate rsyslog
/etc/rsyslog.conf
/etc/rsyslog.d
/etc/default/rsyslog
/etc/init.d/rsyslog
/etc/logcheck/ignore.d.server/rsyslog
/etc/logrotate.d/rsyslog
/etc/rc0.d/K04rsyslog
snip
如您所见,许多文件都包含关键字 rsyslog,其中一些文件比其他文件更有用。我们要检查的是配置文件 rsyslog.conf。
rsyslog 配置文件
与 Linux 中的几乎所有应用程序一样,rsyslog 由位于/etc 目录下的纯文本配置文件进行管理和配置,这在 Linux 中通常是这样的。对于 rsyslog,配置文件位于/etc/rsyslog.conf。使用任何文本编辑器打开该文件,我们将探索其中的内容(这里,我使用的是 Leafpad):
kali >leafpad /etc/rsyslog.conf
您应该看到代码如清单 11-1 所示的内容。
/etc/rsyslog.conf Configuration file for rsyslog.
# For more information see
# /usr/share/doc/rsyslogdoc/html/rsyslog_conf.html
#################
#### MODULES ####
#################
module(load="imuxsock") # provides support for local system logging
module(load="imklog") # provides kernel logging support
#module(load="immark") # provides MARK message capability
# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")
# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514")
###########################
#### GLOBAL DIRECTIVES ####
###########################
清单 11-1:rsyslog.conf 文件的内容
正如您所看到的,rsyslog.conf 文件有很多文档,其中有大量注释解释了它的用法。此时,这些信息中的大部分对您没有用处,但是如果您导航到第 50 行以下,您将找到 Rules 部分。在这里,您可以为 Linux 系统将自动为您记录的内容设置规则。
rsyslog 日志记录规则
rsyslog 规则决定记录哪种类型的信息,记录哪些程序的消息,以及将日志存储在何处。作为一名黑客,这允许您找出正在记录的日志以及这些日志的写入位置,以便您可以删除或隐藏它们。滚动到第 50 行,您将看到类似清单 11-2 的内容。
###############
#### RULES ####
###############
#
# First some standard log files. Log by facility.
#
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none /var/log/syslog
#cron.* /var/log/cron.log
daemon.* /var/log/daemon.log
kern.* /var/log/kern.log
1pr.* /var/log/lpr.log
mail.* /var/log/mail.log
user.* /var/log/user.log
#
# Logging for the mail system. Split it up so that
# it is easy to write scripts to parse these files.
#
mail.info /var/log/mail.info
mail.warn /var/log/mail.warn
mail.err /var/log/mail.err
清单 11-2:在 rsyslog.conf 中查找日志规则
每一行都是一个单独的日志记录规则,说明记录了哪些消息以及记录到哪里。这些规则的基本格式如下:
facility.priority action
facility关键字引用正在记录其消息的程序,例如邮件、内核或打印系统。priority 关键字决定为该程序记录哪种类型的消息。在最右边的 action 关键字引用将发送日志的位置。让我们更仔细地看一下每个部分,首先是 facility 关键字,它指的是生成日志的任何软件,无论是内核、邮件系统还是用户。
下面是一个有效的代码列表,可以用来代替我们的配置文件规则中的关键字 facility:
auth/authpriv安全/授权消息
cron时钟守护进程
daemon其他守护进程
kern内核消息
lpr打印系统
mail邮件系统
user常规用户级别消息
星号通配符(*)代替单词指的是所有信息。 您可以通过以逗号分隔的列表来选择多个。
优先级告诉系统要记录哪种消息。代码从最低优先级列出,从调试开始到最高优先级,以严重结束。如果优先级为*,则记录所有优先级的消息。指定优先级时,将记录该优先级及更高优先级的消息。例如,如果指定的优先级代码为告警 alert,系统将记录分类为告警和更高优先级的消息,但不会记录标记为 crit 的消息或低于警报的任何优先级。以下是有效优先级代码的完整列表:
debug
info
notice
warning
warn
error
err
crit
alert
emerg
panic
warning、warn、error、err、emerg、panic,这些都已被弃用,不应该使用。
操作通常是一个文件名和应该发送日志的位置。注意,通常,日志文件被发送到/var/log 目录,其文件名描述为生成它们的工具,如 auth。这意味着,例如,由 auth 工具生成的日志将被发送到/var/log.auth.log。
让我们看一些日志规则的例子:
mail.* /var/log/mail
这个示例将所有(*)优先级的邮件事件记录到/var/log/mail 文件中。
kern.crit /var/log/kernel
这个例子将把危险(crit)优先级或更高的内核事件记录到/var/log/kernel 中。
*.emerg *
最后一个示例将记录所有登录用户的紧急事件(emerg)优先级的所有事件。通过这些规则,黑客可以确定日志文件的位置、更改优先级,甚至禁用特定的日志规则。
使用 LOGROTATE 自动清理日志
日志文件会占用空间,所以如果不定期删除它们,它们最终会填满整个硬盘驱动器。另一方面,如果太频繁地删除日志文件,那么在将来的某个时间点就没有日志供研究了。您可以使用 logrotate 通过切割日志来确定这些符合相反需求之间的平衡。
logrotate是通过将日志文件移动到其他位置来定期归档日志文件的过程,从而为您留下一个新的日志文件。然后,在指定的一段时间之后,归档的位置将被清理。
您的系统已经在使用logrotate实用程序的 cron 作业切割转储日志文件。您可以配置logrotate实用程序,以使用/etc/logrotate.conf 文本文件选择日志转储备份的规律性。让我们用文本编辑器打开它看看:
kali >leafpad /etc/logrotate.conf
您应该看到如清单 11-3 所示的内容。
# 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
➍ # uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp we'll rotate them here
/var/log/wtmp
{ missingok
monthly
create 0664 root utmp
rotate 1
}
清单 11-3:logrotate 配置文件
第一,你可以设置的时间单位数字参考 ➊。这里的默认值是 weekly,这意味着 rotate 关键字之后的任何数字总是指 weeks(周)。
进一步往下看,你可以看到设置切割转储日志默认设置的频率是每四个星期转储日志 ➋。这个默认配置对大多数人都适用,但是如果您想让您的日志更长一些,以便进行调查,或者更短一些,以便更快地清除它们,那么您应该更改这个设置。例如,如果您每周检查日志文件并希望节省存储空间,可以将此设置更改为 rotate 1。如果您的日志有足够的存储空间,并且希望保留半永久记录以便以后进行取证分析,那么您可以将此设置更改为 rotate 26 以保存六个月的日志,或者将 rotate 52 更改为保存一年的日志。
默认情况下,创建一个新的空日志文件当做旧日志的切割备份 ➌。在配置文件中建议,你也可以选择压缩转储的日志文件 ➍。
在每个转储周期结束时,将重命名日志文件,并在创建新日志文件时将其推到日志链的末尾,以替换当前日志文件。例如,/var/log.auth 将变成/var/log.auth.1,那么/var/log.auth.2,以此类推。如果您每四周轮换一次日志,并保留四组备份,那么您将得到/var/log.auth.4,但是没有/var/log.auth.5。意思是旧的/var/log.auth.4 将被删除,而不是被推到/var/log/auth.5。您可以使用 locate 命令来查找/var/log/auth.log 的 log 文件,并使用通配符,如下所示:
kali >locate /var/log/auth.log.*
/var/log/auth.log.1
/var/log/auth.log.2
/var/log/auth.log.3
/var/log/auth.log.4
有关自定义和使用logrotate实用程序的许多方法的详细信息,请参见 man logrotate 页面。这是一个很好的资源,可以了解可以使用的函数和可以更改的变量,以定制如何处理日志。一旦您对 Linux 更加熟悉,您就会更好地了解需要多久进行一次日志记录,以及您喜欢哪些选项,因此值得重新访问logrotate.conf文件。
保持隐身
一旦您破坏了 Linux 系统,禁用日志记录并删除日志文件中您入侵的任何证据,这都是有用的,以减少被检测到的机会。有很多方法可以做到这一点,每种方法都有自己的风险和可靠性。
删除证据
首先,您需要删除活动的任何日志。您可以简单地打开日志文件,并使用在第 2 章中学习的文件删除技术,逐行准确地删除详细描述您的活动的任何日志。然而,这可能会很耗时,并在日志文件中留下时间间隔,这看起来很可疑。此外,删除的文件通常可以由一个熟练的取证调查员恢复。
更好、更安全的解决方案是分解日志文件。对于其他文件删除系统,熟练的调查员仍然能够恢复已删除的文件,但是假设有一种方法可以删除文件并多次擦写覆盖它,这使得恢复变得更加困难。幸运的是,Linux 有一个内置命令,名为shred,正是为了这个目的。
要了解shred命令是如何工作的,请输入以下命令快速查看帮助信息:
kali >shred --help
Usage: shred [OPTION]...FILE...
Overwrite the specified FILE(s) repeatedly in order to make it harder
for even very expensive hardware probing to recover data
snip
从屏幕上的完整输出可以看到,shred命令有许多选项。其最基本的形式,语法是简单的:
shred \
就其本身而言,shred将删除文件并多次覆盖它——默认情况下,shred将覆盖 4 次。通常,文件被覆盖的次数越多,恢复起来就越困难,但是请记住,每次覆盖都需要时间,因此对于非常大的文件,碎片化可能会很耗时。
要包括两个有用的选项,一个是-f选项,它更改文件的权限,以便在需要更改权限时允许覆盖;另一个是-n选项,它允许您选择覆盖文件的次数。例如,我们将使用以下命令将/var/log/auth.log 中的日志文件分解覆盖10次:
kali >shred -f -n 10 /var/log/auth.log.*
我们需要-f选项来允许我们碎片化 auth 文件,然后我们按照-n选项指定要覆盖的次数。在我们要碎片化的文件的路径之后,我们包含通配符星号,因此我们不仅要碎片化 auth.log 文件,还要覆盖使用logrotate创建的所有日志,比如 auth.log.1,auth.log.2,以此类推。
现在尝试打开一个日志文件:
kali >leafpad /var/log/auth.log.1
一旦您覆盖了一个文件,您将看到其中的内容是难以理解的乱码,如图 11-1 所示。
图 11-1:覆盖的日志文件
现在,如果安全工程师或取证调查员检查日志文件,他们将发现没有任何用处,因为没有一个是可恢复的!
禁用日志记录
另一个覆盖跟踪的选项是禁用日志记录。当黑客控制了一个系统,他们可以立即禁用日志,以防止系统跟踪他们的活动。当然,这需要root特权。
要禁用所有日志记录,黑客只需停止rsyslog守护进程。停止 Linux 中的任何服务使用相同的语法,如下所示(您将在第 2 章中了解更多):
service servicename start|stop|restart
因此,要停止日志守护进程,只需输入以下命令:
kali >service rsyslog stop
现在 Linux 将停止生成任何日志文件,直到服务重新启动,使您能够在日志文件中不留下任何证据的情况下进行操作!
总结
日志文件几乎跟踪 Linux 系统上发生的所有事情。在试图分析发生了什么,无论是故障还是黑客攻击时,它们都是非常宝贵的资源。对于黑客来说,日志文件可以作为他们活动和身份的证据。
然而,精明的黑客可以删除和覆盖这些文件,并完全禁用日志记录,因此不会留下任何证据。