Linux中的日志分析及管理
日志文件对于诊断和解决系统中的问题很有帮助,因为在Linux系统中运行的程序通常会把系统消息和错误消息写入相应的日志文件,这样系统一旦出现问题就会“有据可查”。此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹.
一、主要日志文件
在Linux系统中,日志数据主要包括以下三种类型:
【内核及系统日志】
【用户日志】
【程序日志】
Linux系统本身和大部分服务器程序的日志文件默认情况下都放置在目录“/var/log”中。一部分程序公用一个日志文件,一部分程序使用单个日志文件,而有些大型服务器程序由于日志文件不止一个,所以会在“/var/log”目录中建立相应的子目录来存放日志文件,这样既保证了日志文件目录的结构清晰,又可以快速地定位日志文件。有相当一部分日志文件只有root用户才有权限读取,这保证了相关日志信息的安全性。
例1:列表查看“/var/log”目录中的各种日志文件及子目录。
对于Linux系统中的一些常见日志文件,有必要熟悉其相应的用途,这样才能在需要的时候更快地找到问题所在,及时解决各种故障。常见的日志文件如下:
/var/log/messages:记录Linux内核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序错误等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。
/var/log/cron:记录crond计划任务产生的事件信息。
/var/log/dmesg:记录Linux系统在引导过程中的各种事件信息。
/var/log/maillog:记录进入或发出系统的电子邮件活动。
/var/log/lastlog:最近几次成功登录事件和最后一次不成功登录事件。
/var/log/rpmpkgs:记录系统中安装的各rpm包列表信息。
/var/log/secure:记录用户登录认证过程中的事件信息。
/var/log/wtmp:记录每个用户登录、注销及系统启动和停机事件。
/var/run/utmp:记录当前登录的每个用户的详细信息。
二、日志文件分析
分析日志文件的目的在于通过浏览日志查找关键信息,对系统服务进行调试,判断发生故障的原因等。
对于大多数文本格式的日志文件,只要使用tail、more、less、cat等文本处理工具就可以查看日志内容。而对于一些二进制格式的日志文件,则需要使用相应的查询命令。
1、内核及系统日志
内核及系统日志功能主要由
默认安装的sysklogd-1.4.1-39.2软件包提供,该软件包安装了klogd、syslogd两个程序,并通过syslog服务进行控制,
分别用于记录系统内核的消息和各种应用程序的消息。syslog服务所使用的配置文件为“/etc/syslog.conf”。
例2:查看日志配置文件“/etc/syslog.conf”中的内容。
从配置文件“/etc/syslog.conf”中可以看到,受syslogd服务管理的日志文件都是Linux系统中最主要的日志文件,他们记录了Linux系统中内核、用户认证、邮件、计划任务等最基本的系统消息。在Linux内核中,根据日志消息的重要程度不同,将其分为不同的优先级别(数字等级越小,优先级越高,消息越重要)。
0 EMERG(紧急):会导致主机系统不可用的情况。
1 ALERT(警告):必须马上采取措施解决的问题。
2 CRIT(严重):比较严重的情况。
3 ERR(错误):运行出现错误。
4 WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。
5 NOTICE(注意):不会影响正常功能,但是需要注意的事件。
6 INFO(信息):一般信息。
对于syslog服务统一管理的大部分日志文件,使用的日志记录格式基本上都是相同的。以下以公共日志文件“/var/log/messages”为例来简单介绍内核及系统日志记录的基本格式。
例3:查看公共日志文件“/var/log/messages”的最后3行记录。
日志文件中的每一行表示一条消息,每个消息均由四个字段的固定格式组成。
【时间标签】:消息发出的日期和时间。
【主机名】:生成消息的计算机的名称。
【子系统名称】:发出消息的应用程序的名称。
【消息】:消息的具体内容。
在有些情况下,可以设置syslog,使其在把日志信息记录到文件的同时将日志信息发送到打印机进行打印,这样无论网络入侵者怎么修改日志都不能清除入侵的痕迹。syslog日志服务是一个常会被攻击的显著目标,破坏了它将会使管理员难以发现入侵以及入侵的痕迹,因此要特别注意监控其守护进程以及配置文件。
2、用户日志
在wtmp、utmp、lastlog等日志文件中,保存了系统用户登录、退出等相关事件的事件消息。但是这些文件都是二进制的数据文件,不能直接使用tail、less等文本查看工具进行浏览,
需要使用who、w、users、last和ac等用户查询命令来获取日志信息。
【who命令】
who命令用于查询utmp文件并报告当前登录的每个用户信息。使用该命令,系统管理员可以查看当前系统存在哪些不合法用户,从而对其进行审计和处理。who的默认输出包括用户名、终端类型、登录日期及远程主机。
例4:使用who命令查看当前登录的各用户的所在终端、登录日期/时间/地点等信息。
【w命令】
用于查询utmp文件并显示当前系统中的每个用户及其所运行的进程信息。
例5:使用w命令查看当前登录的各用户信息及所运行的进程。
【users命令】
users命令用单独的一行打印出当前登录的用户,每个显示的用户名对应一个登录会话。如果一个用户有不止一个登录会话,那他的用户名将显示与其相同的次数。
例6:使用users命令查看当前的用户登录会话情况。
【last命令】
last命令用于查询wtmp文件,显示出自从该文件被创建以来登录过的所有用户记录,最近登录的用户记录将显示在最前面。
例7:使用last命令查看系统中最近的五次用户登录记录。
【ac命令】
ac命令将查询wtmp文件中的用户登录和退出情况,报告用户连接的总时间(小时)。使用用户名作为参数,在结合“-d”选项可以按每天进行统计。未指定用户名时,可以使用“-p”选项进行分别统计。
例8:统计gzj用户在每天的连接时间。
例9:分别统计各用户的总连接时间。
3、程序日志
在Linux系统中,还有相当一部分应用程序并没有使用syslog服务来管理日志,而是由程序自己维护日志记录。例如,
http网站服务程序使用两个日志文件access_log和error_log,一般存放在“/var/log/httpd/”目录中,分别记录客户访问事件、错误事件;
而FTP服务程序可以将与文件上传、下载事件相关的消息记录在xferlog文件中。由于不同应用程序的日志记录格式 差别较大,并没有严格使用统一的格式,这里不再详细进行介绍。
总的来说,作为一名合格的系统管理人员,应该提高警惕,随时注意各种可疑状况,定期并随机的检查各种系统日志文件,包括一般信息日志、网络连接日志、文件传输日志以及用户登录日志记录等。在检查这些日志时,要注意是否有不合常理的时间或操作记录。例如以下一些不合理的现象。
a、用户在非常规的时间登录,或者用户登录系统的IP地址和以往的不一样。
b、用户登录失败的日志记录,尤其是那些一再连续尝试进入失败的日志记录。
c、非法使用或不正当使用超级用户权限。
d、无故或者非法重新启动各项网络服务的记录。
e、不正常的日志记录,比如日志的残缺不全,或者是诸如wtmp这样的日志文件无故地缺少了中间的记录文件。
另外,尤其提醒管理人员注意的是:日志并不是完全可靠的,高明的黑客在入侵系统后,经常会打扫现场。所以需要综合运用以上的系统命令,全面、综合地进行审查和检测,切忌断章取义,否则将可能做出错误的判断。
三、日志管理策略
鉴于日志数据资料的重要性,对于系统运行过程中产生的各种日志文件,必须采取有针对性的管理策略,以确保日志数据的准确性、安全性和真实性。一般来说,可以从以下几个方面进行考虑。
1、日志备份和归档
2、延长日志保存期限
3、控制日志访问权限
4、集中管理日志
一、查看系统的运行级别
不同的运行级别代表了系统不同的运行状态所能运行的服务或程序会有所区别,明确当前所处的运行级别将有助于管理员对一些应用故障的排除。若未能确知当前所处的运行级别,
可以使用runlevel命令进行查询,输出结果中分别包含切换前的级别和目前的级别。
【例1】:查看系统的运行级别状态,若之前未切换过运行级别,第一列将显示“N”。
二、切换系统运行级别
当用户需要将系统转换为其他的运行级别时,可以使用init程序命令进行,只要使用与运行级别相对应的数字(0-6)作为命令参数即可。
若要设置系统开机后默认进入的运行级别,则编辑“/etc/inittab”配置文件。
【例2】:关闭当前系统。
【例3】:重启当前系统。
三、设置系统服务在不同运行级别中的状态
在Linux系统中包含了大量的服务程序,这些服务程序在切换运行级别时由rc脚本根据预设的状态进行启动或终止。当然,对于某个系统服务在特定的运行级别中是否运行,这完全可以由管理员自行决定。
需要调整各种系统服务在不同运行级别中的自启动状态时,可以使用chkconfig或者ntsysv命令进行操作。
1、使用ntsysv配置工具
ntsysv工具可以在字符模式中运行,为用户提供了交互式操作的界面,专门用于集中配置各种系统服务的启动状态。单独执行“ntsysv”命令时仅用于管理当前运行级别中的服务,若使用“--level”选项,则可以对指定运行级别中的服务进行管理。例如,执行“ntsysv --level 35”命令后,将打开一个交互式的程序界面,可以同时设置在运行级别3、5中各服务的启动状态。
操作时使用上下箭头键选择不同的服务项,按空格键切换启动状态,“[*]”表示自动启动,“[ ]”表示不要自动启动。按F1键可以获取关于某项服务的详细说明,以便决定是否应加载。
当需要同时设置大量服务的启动状态时,选择使用ntsysv配置工具要更加合适。
2、使用chkconfig配置工具
chkconfig配置工具与ntsysv的功能类似,但是并不提供交互式的操作界面,当需要设置个别服务在不同运行级别的启动状态时,选择使用chkconfig命令要更有效率。
将chkconfig命令与“--list”选项配合使用,可以查看特定服务在不同运行级别中的启动状态,若未指定服务名称,则将显示所有服务的启动状态。
【例4】:查看network服务在各运行级别中的启动状态。
【例5】:查看系统中所有服务在各运行级别中的启动状态。
将chkconfig命令与“--level”选项配合使用,可以设置指定服务在指定运行级别中的启动状态。较常用的命令格式如下:
chkconfig --level 运行级别列表 服务名称 on|off
【例6】:将network服务在运行级别2、4中的启动状态设置为off
【例7】:将network服务在运行级别2-5中的启动状态均设置为on
当缺少“--level”选项时,有时候也可以设置指定服务在不同运行级别的状态,但是这种方式的设置结果会受到该服务脚本文件中状态参数的影响,存在不确定性,因此不建议使用。
【例8】:使用不带“--level”选项的chkconfig命令将vncserver服务的启动状态设置为关闭。
1、init进程
Linux系统中的进程使用数字进行标记,每个进程的身份标记号称为PID。
在引导Linux系统的过程中,“/sbin/init”是内核第一个加载的程序,因此init进程对应的PID号永远为“1”。
init进程运行以后将陆续执行系统中的其他程序,不断生成新的进程,这些进程称为init进程的子进程,反过来说init进程是这些进程的父进程。当然,这些子进程也可以进一步生成各自对的子进程,依次不断繁衍下去,最终构成一棵枝繁叶茂的进程树,共同为用户提供服务。
init进程正是维持整个Linux系统运行的所有进程的“始祖”,因此init进程是不允许被轻易终止的。需要切换不同的系统运行状态时,可以分配给init程序正确的执行参数,由init自身来完成。
2、inittab配置文件
inittab文件位于“/etc”目录中,是init程序的配置文件,init进程运行后将按照该文件中的配置内容依次启动系统中需要运行的脚本和程序。
查看“/etc/inittab”文件中的有效配置行:
在“/etc/inittab”文件中,除了以“#”号开头的注释信息和空行以外,每一行都视为一条有效配置记录。每条配置记录中的四个字段之间使用半角的冒号“:”进行分割,基本格式如下:
id:runlevels:action:process
意思如下:
标记:运行级别:动作类型:程序或脚本
各个字段的作用如下:
【id---标记字段】
标记字段可以由1-4个字符组成,用以区别于其他行的配置。在inittab文件中每条配置记录的id标记字段应是唯一的。
【runlevels---运行级别字段】
在Linux系统中,将各种系统服务程序相互组合构成不同的搭配关系,分别满足不同的系统需求,系统在运行时,采用的每一种服务搭配称之为“运行级别”。默认的系统运行级别包括七种,其功能和服务各部相同。
0:关机状态,使用该级别时将会关闭主机。
1:单用户模式,不需要密码验证即可登录系统,多用于系统维护。
2:字符界面的多用户模式(不支持网络)。
3:字符界面的完整多用户模式,大多数服务器主机的运行在此级别。
4:未分配使用。
5:图形界面的多用户模式,提供了图形桌面操作环境。
6:重新启动,使用该级别时将会重启主机。
【action---动作类型字段】
动作类型字段描述了该行配置所对应的操作类别,一般为固定值,较常用的类型如下:
initdefault:设置初始化系统后默认进入的运行级别。
sysinit:设置系统初始化的操作脚本。
wait:init进程将等待该行配置所对应的脚本操作完成后,再继续执行其他操作。
ctrlaltdel:设置当用户按下Ctrl+Alt+Delete组合键后的操作。
powerokwait:设置当系统收到恢复供电信号时采取何种动作。
respawn:一旦该行配置所对应的进程被终止,则重新启动该进程。
【process---程序或脚本字段】
此字段用于指定该行配置所对应的实际操作,可以是具体的命令、脚本程序等。
3、rc.sysinit脚本文件
rc.sysinit是init进程所调用的系统初始化脚本,位于“/etc/rc.d/rc.sysinit”,这也是在inittab配置文件中设置好的。
rc.sysinit脚本主要完成包括设置网络、主机名、加载文件系统、设置时钟等一系列初始化工作。
4、rc脚本文件
rc脚本同样由init进程进行调用,文件位于“/etc/rc.d/rc”。
rc脚本通过指定不同的级别参数分别加载及终止不同的系统服务,进入到相应的系统运行级别。
在“/etc/rc.d/rc0.d”---“/etc/rc.d/rc6.d”目录中,保存了一些特殊的符号链接文件。
rc脚本根据这些目录中的链接文件名及其所链接到的系统服务脚本,进行启动或终止相关服务程序的操作。
“/etc/rc.d/rcX.d”目录中的链接文件具有共同的规律:文件名以K或S开头,中间是数字序号,最后是系统中的服务脚本名;所链接的原始服务脚本文件位于“/etc/rc.d/init.d”目录中,
其中以S开头的文件表示启动对应的服务,以K开头的文件表示终止对应的服务,中间的数字表示在启动或终止服务时的执行顺序。
位于“/etc/rc.d/init.d”目录中的各种系统服务脚本,基本上都可以直接执行脚本文件或通过“service’服务控制工具进行管理,例如,添加“start”、“stop”、“restart”、“status”等参数完成对应服务的启动、终止、重启、查询状态等操作。对于系统服务程序,一般建议使用这种方式启动或终止,而不是使用杀死进程的命令。对处于实际工作环境中的服务器程序,建议改用“reload”参数重新加载配置,而不是生硬地使用“restart” 重启服务,以免造成客户端访问中断,带来不必要的损失。
5、rc.local脚本文件
rc.local脚本是一个额外的启动控制文件,位于“/etc/rc.d/rc.local”。rc.local脚本通常由rc脚本在最后进行加载,其作用主要是为管理员自行设置启动命令提供一种途径。需在再开机后自动执行的一些命令操作,都可以添加到该文件中。