fqx 2010-10-23
记录重要的系统事件是系统安全的一个重要因素。多数UNIX系统能够运行三个不同的日志子系统:使用wtmp/utmp文件的连接时间日志;使用acct或pacct文件的进程统计;经过syslog实施的错误日志。本章讲述了这些日志子系统以及允许系统或安全管理员监测、审计和维护日志的命令和程序。还讲述了几个额外的工具,从帮助查找侵入者的Zap到标准UNIXsyslog的一个安全加强版本syslog-ng。
UNIX维护了几个基本的日志文件来跟踪和记录系统中发生了什么事情,包括谁登录进入,谁退出登录,以及他们做了些什么。较新的UNIX版本还跟踪其他一些信息,如超级用户登录的次数,通过网络传输的文件,电子邮件以及其他更多方面。
日志文件对于维护系统安全很重要。它们为两个重要功能提供数据:审计和监测。它们通过提供一个历史记录—系统中关于活动的审计轨迹—允许用户或第三方回头来系统地评价安全程序的效率以及确定引起安全破坏或系统功能失效的原因。如果需要,它们还能作为呈现给权威机构的证据。
它们还能用来“实时”地监测系统状态,检测和追踪侵入者,发现bug以及阻止问题发生。用户可以通过浏览日志条目来查看自己的系统或使用Swatch这样的工具来代为查看。警告日志使用户对自己的行为负责,特别是在有较强用户授权策略的系统中。但是,总可能有一个用户冒充另一个。不要认为包含在一个日志中的信息是神圣不可侵犯的—在采取行动之前要试着通过独立手段来确认日志记录。
虽然一个日志的存在不能提供完全的可记录性,但日志能使系统管理员和安全官员做到:
(1)发现试图攻击系统安全的重复举动(也就是一个攻击者试图冒充root登录)。
(2)跟踪那些想要越权的用户(也就是那些使用sudo命令作为root执行命令的用户)。
(3)跟踪异常的使用模式(Carol从9点工作到5点而日志显示在3AM登录;Mallory贪取CPU时间)。
(4)实时跟踪侵入者。
日志能够帮助检测。当系统被攻击或有人侵入时,尽快知道是很重要的。虽然日志不能阻止一次侵入,但它能体现出基本帐户安全的一个漏洞。甚至当帐户安全失败,一个攻击者能够剥夺用户权利时,也希望这件事能记录下来。一旦知道发生了什么事,就可以采取相应的行动:切断用户、加强网络控制,监测一个侵入者以搜索证据等等。记录日志、维护日志、日志监测和审计等策略都是完整安全策略的重要组成部分。也许日志最重要的安全功能是制止。基础人类心理学指出当人类得知自己的行为被监测时会举止异常。仅仅安装日志是不够的—应该公布这件事以灌输恐惧感。应该发展通信策略以加强攻击者可能被抓住的印象。其目的是阻止一个攻击者或任性的用户到达行为的危险点。
应该宣传出去说系统建立了日志。一个有效的方式是使用登录标志警告:“警告!继续使用本系统要同意安全监测和测试。所有的用户行为都与用户名、主机名和IP地址一起记录下来”。
不幸的是,日志文件本身易被攻击。任何有能力的系统破坏者都试图通过修改日志文件或更坏情况是修改日志机制本身来掩盖自己的踪迹。有一些防范措施可以帮助保持日志子系统的完整性和可用性。这将在本章后面讲到。
提示要想知道一个破坏者在侵入UNIX系统后怎样掩盖其踪迹,可参见Phrack杂志的文章“PlayingHideandSeek,UnixStyle”,可在下面地址找到:
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这样提供网络服务的服务器也保持详细的日志。
根据不同的UNIX版本,日志文件通常写到/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文件是所有人可写的(-rw-rw-rw-)。这是不应该的,因为它使任何用户能够编辑该文件(他们可隐藏自己的存在)。新的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.3who命令
who命令查询utmp文件并报告当前每个登录的用户。who的缺省输出包括用户名、终端类型、登录日期和时间以及远程主机(如果是的话)。
$who
roottty1May1516:09
bobconsoleMay1514:49
alicettyp2May1600:13
carolttyp3May1113:20
如果指明了wtmp文件名,则who命令查询所有以前的登录。命令who/var/log/wtmp将报告自从wtmp文件创建或删改以来的每一次登录。
对于正处于危机中的用户,特殊形式whoami提供了一些安慰:
$whoami
alice
有些UNIX系统中包括一些扩充的who命令。例如HP-UX支持16个不同的标志和选项。“-a”标志产生一个“包含一切”的报告,包括用户名、终端类型、时间、空闲时间、进程ID和注释。它还显示最后一次系统启动时间及其他内容。
8.2.4w命令
w命令查询utmp文件并显示当前系统中每个用户和他所运行的进程信息。标题栏显示当前时间、系统已运行了多长时间、当前有多少用户登录以及过去1、5和15分钟内的系统平均负载。
uptime命令与w密切相关。它也输出以上的题头信息。
8.2.5users命令
users命令用单独一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示相同的次数。
$users
alicecaroldavebob
8.2.6last命令
last命令往回搜索wtmp来显示自从文件第一次创建后登录过的用户。它还报告终端类型和日期。
若使用“-R”标志(BSDish系统中为“-h”),则last命令显示用户的主机名。“-number”标志把报告的行数限制为number。
如果指明了用户,那么last只报告该用户的近期活动。
8.2.7lastb命令
有些UNIX系统还支持lastb命令,它往回搜索数据文件/var/adm/btmp并显示有关错误登录信息(就是那些口令错误的登录)。要看前面5次错误登录,可以用root登录并运行命令:
警告应该限制用户以适当的权限访问btmp文件—该文件只应由root拥有并可读,因为它也许包含口令信息(用户经常错误地把口令作为用户名输入)。
8.2.8ac命令
ac命令根据当前/var/log/wtmp文件中的登录进入和退出来报告用户连接的时间(小时)。如果不使用标志,则报告总的时间。
$ac
total136.25
“-d”标志产生每天的总的连接时间。
“-p”标志报告每个用户的总的连接时间。
8.2.9lastlog文件
如上面所述,lastlog文件在每次有用户登录时被查询。多数UNIX系统报告最后一次成功登录,并显示日期和终端类型。有些SystemV系统还报告最后一次不成功的登录。这看起来如下例所示(HP-UX登录会话):
提示每次登录时要检查一下有关成功和不成功登录的报告,让其他用户也这么做。无需多说,用户应确保没有其他人以自己用户名登录或重复尝试不成功的登录。
如果运行Linux,可以使用lastlog命令来检查某特定用户上次登录的时间,它格式化并输出上次登录日志/var/log/lastlog(在其他系统上也许是/var/adm/lastlog)的内容。它根据UID排序显示登录名、端口号(tty)和上次登录时间。如果一个用户从未登录过,lastlog显示“**
Neverlogged**”—这是多数系统用户应该看到的。注意需要以root运行该命令。
在上面例子中,lastlog报告自lastlog文件创建以来的所有用户。可以使用“-u”标志限制对某个特定用户进行报告—lastlog-u102将报告UID为102的用户。要限制为上一周的报告,可使用“-t”标志—lastlog-t7。