记录重要的系统事件是系统安全的一个重要因素。多数U N I X 系统能够运行三个不同的日志子系统:使用wtmp / utmp 文件的连接时间日志;使用acct 或pacct 文件的进程统计;经过syslog 实施的错误日志。本章讲述了这些日志子系统以及允许系统或安全管理员监测、审计和维护日志的命令和程序。还讲述了几个额外的工具,从帮助查找侵入者的Zap 到标准UNIX syslog 的一个安全加强版本syslog-ng 。
UNIX 维护了几个基本的日志文件来跟踪和记录系统中发生了什么事情,包括谁登录进入,谁退出登录,以及他们做了些什么。较新的U N I X 版本还跟踪其他一些信息,如超级用户登录的次数,通过网络传输的文件,电子邮件以及其他更多方面。
日志文件对于维护系统安全很重要。它们为两个重要功能提供数据:审计和监测。它们通过提供一个历史记录—系统中关于活动的审计轨迹—允许用户或第三方回头来系统地评价安全程序的效率以及确定引起安全破坏或系统功能失效的原因。如果需要,它们还能作为呈现给权威机构的证据。
它们还能用来“实时”地监测系统状态,检测和追踪侵入者,发现bug 以及阻止问题发生。用户可以通过浏览日志条目来查看自己的系统或使用Swatch这样的工具来代为查看。警告日志使用户对自己的行为负责,特别是在有较强用户授权策略的系统中。但是,总可能有一个用户冒充另一个。不要认为包含在一个日志中的信息是神圣不可侵犯的—在采取行动之前要试着通过独立手段来确认日志记录。
虽然一个日志的存在不能提供完全的可记录性,但日志能使系统管理员和安全官员做到:
(1)发现试图攻击系统安全的重复举动(也就是一个攻击者试图冒充root 登录)。
(2)跟踪那些想要越权的用户(也就是那些使用sudo 命令作为root 执行命令的用户)。
(3)跟踪异常的使用模式(Carol 从9 点工作到5 点而日志显示在 3AM 登录;Mallory 贪取CPU时间)。
(4)实时跟踪侵入者。
日志能够帮助检测。当系统被攻击或有人侵入时,尽快知道是很重要的。虽然日志不能阻止一次侵入,但它能体现出基本帐户安全的一个漏洞。甚至当帐户安全失败,一个攻击者能够剥夺用户权利时,也希望这件事能记录下来。一旦知道发生了什么事,就可以采取相应的行动:切断用户、加强网络控制,监测一个侵入者以搜索证据等等。记录日志、维护日志、日志监测和审计等策略都是完整安全策略的重要组成部分。也许日志最重要的安全功能是制止。基础人类心理学指出当人类得知自己的行为被监测时会举止异常。仅仅安装日志是不够的—应该公布这件事以灌输恐惧感。应该发展通信策略以加强攻击者可能被抓住的印象。其目的是阻止一个攻击者或任性的用户到达行为的危险点。
应该宣传出去说系统建立了日志。一个有效的方式是使用登录标志警告:“警告!继续使用本系统要同意安全监测和测试。所有的用户行为都与用户名、主机名和IP 地址一起记录下来”。
不幸的是,日志文件本身易被攻击。任何有能力的系统破坏者都试图通过修改日志文件或更坏情况是修改日志机制本身来掩盖自己的踪迹。有一些防范措施可以帮助保持日志子系统的完整性和可用性。这将在本章后面讲到。
提示要想知道一个破坏者在侵入UNIX 系统后怎样掩盖其踪迹,可参见Phrack 杂志的文章“Playing Hide and Seek, Unix Style ”,可在下面地址找到:
http://www.fish.com/security/hide-n-seek.html .
8.1 日志子系统
在多数UNIX 系统中,有三个主要的日志子系统:
(1) 连接时间日志—由多个程序执行,把记录写入到/var/log/wtmp (或/var/adm/Wtmp )和/var/run/utmp (可以是/etc/utmp 或/var/adm/utmp)。login 等程序更新wtmp 和utmp 文件,使系统管理员能跟踪谁在何时登录进入系统。
(2) 进程统计—由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct )中写一个记录。进程统计的主要目的是为系统中的基本服务提供命令使用统计。
(3) 错误日志—由syslogd 执行。各种系统守护程序、用户程序和内核通过syslog 向文件/var/adm/messages 和/var/log/syslog 报告值得注意的事件。另外有许多UNIX 程序创建日志。像HTTP 或FTP 这样提供网络服务的服务器也保持详细的日志。
根据不同的U N I X 版本,日志文件通常写到/var/log 、/var/adm 、/usr/adm 或有时/etc 目录中。
多数Linux 系统在/var/log 中保存主要的日志—我将在多数例子中使用该习惯。常用的日志文件在表1 中总结。
表1 常用UNIX 日志文件
日志文件 目标
access-log 记录HTTP/web的传输
acct/pacct 记录用户命令
aculog 记录调制解调器的活动
btmp 记录失败的登录
lastlog 记录最近几次成功登录的时间和最后一次不成功的登录
messages 从syslog中记录信息(通常链接到syslog 文件)
sudolog 记录使用sudo 发出的命令
sulog 记录su 命令的使用
syslog 从syslog 中记录信息(通常链接到message 文件)
utmp 记录当前登录的每个用户
wtmp 一个用户每次登录进入和退出时间的永久记录
xferlog 记录FTP会话
8.2 登录记录
utmp 、wtmp 和lastlog 日志文件是多数重要UNIX 日志子系统的关键—保持用户登录进入和退出的记录。有关当前登录用户的信息记录在文件utmp 中;登录进入和退出记录在文件wtmp 中;最后一次登录在文件lastlog 中。数据交换、关机和重启也记录在wtmp 文件中。所有的记录都包含时间戳。
这些文件(除了lastlog )在具有大量用户的繁忙系统中增长得很迅速。例如wtmp 文件可以无限制增长,除非定期进行截取。许多系统以一天或一周为单位把wtmp 配置成循环使用。它通常由cron 运行的脚本来删改。这些脚本重命名并循环使用wtmp 文件,能保持一周有价值的数据。通常,wtmp 在第一天结束后重命名为wtmp.1 ;第二天后wtmp.1 变为wtmp.2 等等,直到wtmp.7 。
警告如果/var/log/wtmp 文件不存在,则不执行登录和连接时间统计。它必须手工进行创建(touch /var/log/wtmp )。
8.2.1 基本机制
每次有一个用户登录时,login 程序在文件lastlog 中查看用户的UID 。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后login 程序在lastlog 中记录新的登录时间。
在新的lastlog 记录写入后,utmp 文件打开并插入用户的utmp 记录。该记录一直到用户登录退出时删除。utmp 文件被各种命令使用,包括who 、w 、users 和finger (参见下面讲到的这些命令)。
下一步,login 程序打开文件wtmp 附加用户的utmp 记录。当用户登录退出时,具有更新时间戳的同一utmp 记录附加到文件中。wtmp 文件被程序lost 和ac 使用(参见下面)。
警告在老的UNIX 版本中,/etc/utmp 文件是所有人可写的(- r w - r w - r w -)。这是不应该的,因为它使任何用户能够编辑该文件(他们可隐藏自己的存在)。新的UNIX 系统对/etc/utmp 进行更严格的限制(-rw-r--r--)。
8.2.2 使用基于utmp/wtmp 的命令进行监测
wtmp 和utmp 文件都是二进制格式,它们不能被剪贴(使用tail 命令)或合并(使用cat 命令)。用户需要几个命令之一,包括who 、w 、users 、last 和ac —来使用这两个文件包含的信息。
一个系统管理员应该通过定期检查谁曾登录过,以及做了些什么事来监测系统的安全,尤其是一个安全机密系统或者有许多用户的系统。
如是否有人在假期里登录?
是否有个业务经理编译程序?
是否有一个程序员在早上9 点进入?
要精心观察,就像一个店主警惕谁进来或离开了商店那样。要在每天第一次登录和最后一个退出之前运行w 。要观察失败的登录—它们可能预示有人侵入。运行ac 来看谁偷取了系统资源,是一个电子邮件使用者在提交大量的工作吗?不放松警惕是安全的一部分。
警告日志中的一个漏洞是su 命令。当一个用户用一个有效的UID 代替另一个时,它不更新utmp 和wtmp 。这可能导致一些奇怪地结果,例如一个使用su 的用户运行mail 或其他使用utmp 文件的程序。幸运的是,su 维护它自己的日志(参见8.5.1 节)。
8.2.3 who 命令
who 命令查询utmp 文件并报告当前每个登录的用户。who 的缺省输出包括用户名、终端类型、登录日期和时间以及远程主机(如果是的话)。
$who
root tty1 May 15 16:09
bob console May 15 14:49
alice ttyp2 May 16 00:13
carol ttyp3 May 11 13:20
如果指明了wtmp 文件名,则who 命令查询所有以前的登录。命令who /var/log/wtmp 将报告自从wtmp 文件创建或删改以来的每一次登录。
对于正处于危机中的用户,特殊形式whoami 提供了一些安慰:
$ whoami
alice
有些UNIX 系统中包括一些扩充的who 命令。例如HP-UX 支持16 个不同的标志和选项。“-a ”标志产生一个“包含一切”的报告,包括用户名、终端类型、时间、空闲时间、进程ID 和注释。它还显示最后一次系统启动时间及其他内容。
8.2.4 w 命令
w 命令查询utmp 文件并显示当前系统中每个用户和他所运行的进程信息。标题栏显示当前时间、系统已运行了多长时间、当前有多少用户登录以及过去1 、5 和1 5 分钟内的系统平均负载。
uptime 命令与w 密切相关。它也输出以上的题头信息。
8.2.5 users 命令
users 命令用单独一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。
$ users
alice carol dave bob
8.2.6 last 命令
last 命令往回搜索wtmp 来显示自从文件第一次创建后登录过的用户。它还报告终端类型和日期。
若使用“-R ”标志(BSDish 系统中为“-h ”),则last 命令显示用户的主机名。“-number”标志把报告的行数限制为number 。
如果指明了用户,那么last 只报告该用户的近期活动。
8.2.7 lastb 命令
有些UNIX 系统还支持lastb 命令,它往回搜索数据文件/var/adm/btmp 并显示有关错误登录信息(就是那些口令错误的登录)。要看前面5 次错误登录,可以用root 登录并运行命令:
警告应该限制用户以适当的权限访问btmp 文件—该文件只应由root 拥有并可读,因为它也许包含口令信息(用户经常错误地把口令作为用户名输入)。
8.2.8 ac 命令
ac 命令根据当前/var/log/wtmp 文件中的登录进入和退出来报告用户连接的时间(小时)。如果不使用标志,则报告总的时间。
$ ac
total 136.25
“-d ”标志产生每天的总的连接时间。
“-p ”标志报告每个用户的总的连接时间。
8.2.9 lastlog 文件
如上面所述,lastlog 文件在每次有用户登录时被查询。多数UNIX 系统报告最后一次成功登录,并显示日期和终端类型。有些System V 系统还报告最后一次不成功的登录。这看起来如下例所示(H P - U X 登录会话):
提示每次登录时要检查一下有关成功和不成功登录的报告,让其他用户也这么做。无需多说,用户应确保没有其他人以自己用户名登录或重复尝试不成功的登录。
如果运行Linux ,可以使用lastlog 命令来检查某特定用户上次登录的时间,它格式化并输出上次登录日志/var/log/lastlog (在其他系统上也许是/var/adm/lastlog )的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog 显示“* *
Never logged**”—这是多数系统用户应该看到的。注意需要以root 运行该命令。
在上面例子中,lastlog 报告自lastlog 文件创建以来的所有用户。可以使用“-u”标志限制对某个特定用户进行报告—lastlog -u 102 将报告UID 为102 的用户。要限制为上一周的报告,可使用“-t”标志—lastlog -t 7 。
UNIX 维护了几个基本的日志文件来跟踪和记录系统中发生了什么事情,包括谁登录进入,谁退出登录,以及他们做了些什么。较新的U N I X 版本还跟踪其他一些信息,如超级用户登录的次数,通过网络传输的文件,电子邮件以及其他更多方面。
日志文件对于维护系统安全很重要。它们为两个重要功能提供数据:审计和监测。它们通过提供一个历史记录—系统中关于活动的审计轨迹—允许用户或第三方回头来系统地评价安全程序的效率以及确定引起安全破坏或系统功能失效的原因。如果需要,它们还能作为呈现给权威机构的证据。
它们还能用来“实时”地监测系统状态,检测和追踪侵入者,发现bug 以及阻止问题发生。用户可以通过浏览日志条目来查看自己的系统或使用Swatch这样的工具来代为查看。警告日志使用户对自己的行为负责,特别是在有较强用户授权策略的系统中。但是,总可能有一个用户冒充另一个。不要认为包含在一个日志中的信息是神圣不可侵犯的—在采取行动之前要试着通过独立手段来确认日志记录。
虽然一个日志的存在不能提供完全的可记录性,但日志能使系统管理员和安全官员做到:
(1)发现试图攻击系统安全的重复举动(也就是一个攻击者试图冒充root 登录)。
(2)跟踪那些想要越权的用户(也就是那些使用sudo 命令作为root 执行命令的用户)。
(3)跟踪异常的使用模式(Carol 从9 点工作到5 点而日志显示在 3AM 登录;Mallory 贪取CPU时间)。
(4)实时跟踪侵入者。
日志能够帮助检测。当系统被攻击或有人侵入时,尽快知道是很重要的。虽然日志不能阻止一次侵入,但它能体现出基本帐户安全的一个漏洞。甚至当帐户安全失败,一个攻击者能够剥夺用户权利时,也希望这件事能记录下来。一旦知道发生了什么事,就可以采取相应的行动:切断用户、加强网络控制,监测一个侵入者以搜索证据等等。记录日志、维护日志、日志监测和审计等策略都是完整安全策略的重要组成部分。也许日志最重要的安全功能是制止。基础人类心理学指出当人类得知自己的行为被监测时会举止异常。仅仅安装日志是不够的—应该公布这件事以灌输恐惧感。应该发展通信策略以加强攻击者可能被抓住的印象。其目的是阻止一个攻击者或任性的用户到达行为的危险点。
应该宣传出去说系统建立了日志。一个有效的方式是使用登录标志警告:“警告!继续使用本系统要同意安全监测和测试。所有的用户行为都与用户名、主机名和IP 地址一起记录下来”。
不幸的是,日志文件本身易被攻击。任何有能力的系统破坏者都试图通过修改日志文件或更坏情况是修改日志机制本身来掩盖自己的踪迹。有一些防范措施可以帮助保持日志子系统的完整性和可用性。这将在本章后面讲到。
提示要想知道一个破坏者在侵入UNIX 系统后怎样掩盖其踪迹,可参见Phrack 杂志的文章“Playing Hide and Seek, Unix Style ”,可在下面地址找到:
http://www.fish.com/security/hide-n-seek.html .
8.1 日志子系统
在多数UNIX 系统中,有三个主要的日志子系统:
(1) 连接时间日志—由多个程序执行,把记录写入到/var/log/wtmp (或/var/adm/Wtmp )和/var/run/utmp (可以是/etc/utmp 或/var/adm/utmp)。login 等程序更新wtmp 和utmp 文件,使系统管理员能跟踪谁在何时登录进入系统。
(2) 进程统计—由系统内核执行。当一个进程终止时,为每个进程往进程统计文件(pacct或acct )中写一个记录。进程统计的主要目的是为系统中的基本服务提供命令使用统计。
(3) 错误日志—由syslogd 执行。各种系统守护程序、用户程序和内核通过syslog 向文件/var/adm/messages 和/var/log/syslog 报告值得注意的事件。另外有许多UNIX 程序创建日志。像HTTP 或FTP 这样提供网络服务的服务器也保持详细的日志。
根据不同的U N I X 版本,日志文件通常写到/var/log 、/var/adm 、/usr/adm 或有时/etc 目录中。
多数Linux 系统在/var/log 中保存主要的日志—我将在多数例子中使用该习惯。常用的日志文件在表1 中总结。
表1 常用UNIX 日志文件
日志文件 目标
access-log 记录HTTP/web的传输
acct/pacct 记录用户命令
aculog 记录调制解调器的活动
btmp 记录失败的登录
lastlog 记录最近几次成功登录的时间和最后一次不成功的登录
messages 从syslog中记录信息(通常链接到syslog 文件)
sudolog 记录使用sudo 发出的命令
sulog 记录su 命令的使用
syslog 从syslog 中记录信息(通常链接到message 文件)
utmp 记录当前登录的每个用户
wtmp 一个用户每次登录进入和退出时间的永久记录
xferlog 记录FTP会话
8.2 登录记录
utmp 、wtmp 和lastlog 日志文件是多数重要UNIX 日志子系统的关键—保持用户登录进入和退出的记录。有关当前登录用户的信息记录在文件utmp 中;登录进入和退出记录在文件wtmp 中;最后一次登录在文件lastlog 中。数据交换、关机和重启也记录在wtmp 文件中。所有的记录都包含时间戳。
这些文件(除了lastlog )在具有大量用户的繁忙系统中增长得很迅速。例如wtmp 文件可以无限制增长,除非定期进行截取。许多系统以一天或一周为单位把wtmp 配置成循环使用。它通常由cron 运行的脚本来删改。这些脚本重命名并循环使用wtmp 文件,能保持一周有价值的数据。通常,wtmp 在第一天结束后重命名为wtmp.1 ;第二天后wtmp.1 变为wtmp.2 等等,直到wtmp.7 。
警告如果/var/log/wtmp 文件不存在,则不执行登录和连接时间统计。它必须手工进行创建(touch /var/log/wtmp )。
8.2.1 基本机制
每次有一个用户登录时,login 程序在文件lastlog 中查看用户的UID 。如果找到了,则把用户上次登录、退出时间和主机名写到标准输出中,然后login 程序在lastlog 中记录新的登录时间。
在新的lastlog 记录写入后,utmp 文件打开并插入用户的utmp 记录。该记录一直到用户登录退出时删除。utmp 文件被各种命令使用,包括who 、w 、users 和finger (参见下面讲到的这些命令)。
下一步,login 程序打开文件wtmp 附加用户的utmp 记录。当用户登录退出时,具有更新时间戳的同一utmp 记录附加到文件中。wtmp 文件被程序lost 和ac 使用(参见下面)。
警告在老的UNIX 版本中,/etc/utmp 文件是所有人可写的(- r w - r w - r w -)。这是不应该的,因为它使任何用户能够编辑该文件(他们可隐藏自己的存在)。新的UNIX 系统对/etc/utmp 进行更严格的限制(-rw-r--r--)。
8.2.2 使用基于utmp/wtmp 的命令进行监测
wtmp 和utmp 文件都是二进制格式,它们不能被剪贴(使用tail 命令)或合并(使用cat 命令)。用户需要几个命令之一,包括who 、w 、users 、last 和ac —来使用这两个文件包含的信息。
一个系统管理员应该通过定期检查谁曾登录过,以及做了些什么事来监测系统的安全,尤其是一个安全机密系统或者有许多用户的系统。
如是否有人在假期里登录?
是否有个业务经理编译程序?
是否有一个程序员在早上9 点进入?
要精心观察,就像一个店主警惕谁进来或离开了商店那样。要在每天第一次登录和最后一个退出之前运行w 。要观察失败的登录—它们可能预示有人侵入。运行ac 来看谁偷取了系统资源,是一个电子邮件使用者在提交大量的工作吗?不放松警惕是安全的一部分。
警告日志中的一个漏洞是su 命令。当一个用户用一个有效的UID 代替另一个时,它不更新utmp 和wtmp 。这可能导致一些奇怪地结果,例如一个使用su 的用户运行mail 或其他使用utmp 文件的程序。幸运的是,su 维护它自己的日志(参见8.5.1 节)。
8.2.3 who 命令
who 命令查询utmp 文件并报告当前每个登录的用户。who 的缺省输出包括用户名、终端类型、登录日期和时间以及远程主机(如果是的话)。
$who
root tty1 May 15 16:09
bob console May 15 14:49
alice ttyp2 May 16 00:13
carol ttyp3 May 11 13:20
如果指明了wtmp 文件名,则who 命令查询所有以前的登录。命令who /var/log/wtmp 将报告自从wtmp 文件创建或删改以来的每一次登录。
对于正处于危机中的用户,特殊形式whoami 提供了一些安慰:
$ whoami
alice
有些UNIX 系统中包括一些扩充的who 命令。例如HP-UX 支持16 个不同的标志和选项。“-a ”标志产生一个“包含一切”的报告,包括用户名、终端类型、时间、空闲时间、进程ID 和注释。它还显示最后一次系统启动时间及其他内容。
8.2.4 w 命令
w 命令查询utmp 文件并显示当前系统中每个用户和他所运行的进程信息。标题栏显示当前时间、系统已运行了多长时间、当前有多少用户登录以及过去1 、5 和1 5 分钟内的系统平均负载。
uptime 命令与w 密切相关。它也输出以上的题头信息。
8.2.5 users 命令
users 命令用单独一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。
$ users
alice carol dave bob
8.2.6 last 命令
last 命令往回搜索wtmp 来显示自从文件第一次创建后登录过的用户。它还报告终端类型和日期。
若使用“-R ”标志(BSDish 系统中为“-h ”),则last 命令显示用户的主机名。“-number”标志把报告的行数限制为number 。
如果指明了用户,那么last 只报告该用户的近期活动。
8.2.7 lastb 命令
有些UNIX 系统还支持lastb 命令,它往回搜索数据文件/var/adm/btmp 并显示有关错误登录信息(就是那些口令错误的登录)。要看前面5 次错误登录,可以用root 登录并运行命令:
警告应该限制用户以适当的权限访问btmp 文件—该文件只应由root 拥有并可读,因为它也许包含口令信息(用户经常错误地把口令作为用户名输入)。
8.2.8 ac 命令
ac 命令根据当前/var/log/wtmp 文件中的登录进入和退出来报告用户连接的时间(小时)。如果不使用标志,则报告总的时间。
$ ac
total 136.25
“-d ”标志产生每天的总的连接时间。
“-p ”标志报告每个用户的总的连接时间。
8.2.9 lastlog 文件
如上面所述,lastlog 文件在每次有用户登录时被查询。多数UNIX 系统报告最后一次成功登录,并显示日期和终端类型。有些System V 系统还报告最后一次不成功的登录。这看起来如下例所示(H P - U X 登录会话):
提示每次登录时要检查一下有关成功和不成功登录的报告,让其他用户也这么做。无需多说,用户应确保没有其他人以自己用户名登录或重复尝试不成功的登录。
如果运行Linux ,可以使用lastlog 命令来检查某特定用户上次登录的时间,它格式化并输出上次登录日志/var/log/lastlog (在其他系统上也许是/var/adm/lastlog )的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog 显示“* *
Never logged**”—这是多数系统用户应该看到的。注意需要以root 运行该命令。
在上面例子中,lastlog 报告自lastlog 文件创建以来的所有用户。可以使用“-u”标志限制对某个特定用户进行报告—lastlog -u 102 将报告UID 为102 的用户。要限制为上一周的报告,可使用“-t”标志—lastlog -t 7 。