Linux系统管理工具包测试系统的有效性_第1页
Linux系统管理工具包测试系统的有效性_第2页
Linux系统管理工具包测试系统的有效性_第3页
Linux系统管理工具包测试系统的有效性_第4页
Linux系统管理工具包测试系统的有效性_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux系统管理工具包: 测试系统的有效性本书网络下载内容丰富,分享给大家学习。研究存储然后检查配置文件有效性的方法。尽管您已经拥有各种安全系统,但是某些人仍可能访问您的系统,并更改您的配置或安全设置。关于本系列典型的 UNIX 管理员拥有一套经常用于辅助管理过程的关键实用工具、诀窍和系统。存在各种用于简化不同过程的关键实用工具、命令行链和脚本。其中一些工具来自于操作系统,而大部分的诀窍则来源于长期的经验积累和减轻系统管理员工作压力的要求。本系列文章主要专注于最大限度地利用各种 UNIX 环境中可用的工具,包括简化异构环境中的管理任务的方法。验证文件内容建立组成 UNIX 系统的配置文件(必

2、要时建立应用程序文件)是您希望系统长时间无故障运行的一种方法。该方法还可以构成安全流程的关键部分,这样不仅可保障系统有效,而且还可以保护系统的安全配置。尽管您的系统可能已经非常安全,任何人都无法进入并修改配置文件,但是您需要加强自我保护,或至少能够确定某人是否进入系统,并能够验证某人是否未经授权修改了配置文件(甚至任何文件)。那么如何验证文件内容呢?这需要考虑许多不同的参数。如果在工作配置中更改了所有以下项目,则可能会导致问题:    * 文件内容    * 文件所有者    * 组所有者    * 文件权限

3、60;   * 修改时间    * 创建时间一个简单的方法是在其他计算机上保存配置文件的副本(及其关联的参数),然后对本地文件和远程文件进行常规比较。此方法带来的问题是需要占用大量的空间,更重要的是,需要花大量的时间记录和比较这些信息。此方法还可能影响以实时方式比较信息。另一个经常提议的方法是只记录文件大小、修改时间、模式和所有权信息。因为与文件全部内容相比,该信息比较短,更易于存储和快速检查和验证。问题是文件的大小无法确切指示内容是否已更改。请考虑下面这个只包含一行的文件:location:/home/mcbrown下面是一个同样大小的文件,但有一行已经更改:l

4、ocation:/home/slbrown这两个文件的长度都是 22 个字符,但是内容不同,这种看似简单的更改可能导致严重的后果,即使检查文件大小,也查不出有任何不同。至于其他参数、修改时间、文件模式和其他信息都有可能被修改。您可以使用 touch 命令更改修改时间。甚至通过更改计算机上的时间和重新创建该文件可以伪造文件创建时间。在 UNIX 系统上非常难以更改的一个项目是文件索引节点数值。索引节点数值是第一次创建文件时提供给文件的唯一 ID。基础文件系统驱动程序使用索引节点数值识别文件系统上的文件。在编辑文件后,索引节点通常会发生更改,因为大多数编辑器在删除旧文件并将新文件重命名为最初名称之

5、前会创建新文件,并将新内容写入该文件。因此,进行索引节点比较是检查文件是否已编辑的很好方法。记录这些信息片段仍然是不够的,还需要一种比较文件内容的有效方法。最好的方法可能要数使用文件校验和。文件校验和为文件创建校验和是比较文件内容是否更改的传统方法,该方法无需物理比较每个文件的每个字节。校验和的工作方法是对文件内容使用一个算法。该算法为文件内容生成几乎是唯一的指纹。可以通过许多不同的方法完成此任务。例如,可以将每个字节的值加起来,使用一种算法将复杂的计算应用到给定文件的各个位或位组。具体方法不在本文的讨论范围之内,并且使用哪种方法取决于您使用的校验和工具。UNIX 包括一个简单的校验和命令 s

6、um。此命令非常简单,但是它提供了可用于识别大多数文件之间差异的近乎唯一的数值。不过,此算法也存在一些局限性。许多现代解决方案提供了 md5 命令。后者生成一个文件的 128 位指纹,并且可以在理论上为任意大小的任何文件生成唯一的签名。生成校验和信息的 md5 算法最初是为在加密文件之前生成文件的唯一指纹而开发的,这样可以保证解密文件的有效性。可以将 md5 生成的校验和表示为二进制字符串、十六进制字符串或 base64 编码字符串。在 MIME 电子邮件中使用了后一格式,以确保唯一地标识文件中不同的附件。为文件创建校验和因为存在用于创建校验和信息的命令行解决方案,所以可以直接在命令行上创建任

7、何文件的校验和。校验和信息唯一程度的一个很好示例是使用先前演示的文件示例,该示例具有相同的物理长度和内容,但只有字符不同。您可以使用一个命令获得两个文件的校验和,如清单 1 所示。清单 1. 使用一个命令获得两个文件的校验和1. $ sum old new2. 50093 1 old3. 62381 1 new复制代码即使清单 1 中只有两个字符不同,但获得的校验和数字却大相径庭。清单 2 显示了相同的文件,这次是使用 md5 检查的。清单 2. 使用 md5 检查文件1. $ md5 old new2. MD5 (old = 602f604720d3b57925e99bcaa7d931a43

8、. MD5 (new = c3f06c217a0f26c16f8d030837d8718b复制代码这里的校验和明显不同,毫无疑问相关文件在某些方面存在不同。创建校验和的另一个解决方案是使用 Perl 生成校验和信息。Perl 使用的一个模块是 Digest:MD5,该模块可以从数据的任何字符串或提供的文件生成 MD5 校验和。清单 3 显示了一个简单的脚本,该脚本为命令行上作为十六进制字符串提供的文件返回 MD5 校验和(与清单 2 显示的格式完全相同)。清单 3. 返回 MD5 校验和的脚本1. use Digest:MD5;2. use IO:File;3. 4. my $chk = Di

9、gest:MD5->new(;5. 6. foreach my $file (ARGV7. 8.     $chk->addfile(IO:File->new($file;9. 10.     print "$file -> ",$chk->hexdigest,"n"11. 复制代码您可以像前面一样在相同文件上运行脚本,并且应该获得完全相同的信息,如清单 4 所示。清单 4. 在相同的文件上运行 Digest:MD51. $ simpmd5.pl old new2. old ->

10、 602f604720d3b57925e99bcaa7d931a43. new -> c3f06c217a0f26c16f8d030837d8718b复制代码为使此流程派上用场,需要将信息记录到文件中,这样可以将该信息与以后的信息进行比较。在执行此操作之前,将需要比较的其他信息(修改时间、文件大小、所有权、索引节点等)添加到存储数据中。将其他数据添加到报告中Perl stat( 函数可以从给定的文件获取完整的信息(可以使用其中的大多数信息)。清单 5 显示了可以从该文件获取的信息列表。清单 5. Perl stat( 函数       

11、        0 dev      device number of filesystem1 ino      inode number2 mode     file mode  (type and permissions3 nlink    number of (hard links to the file4 uid      num

12、eric user ID of file's owner5 gid      numeric group ID of file's owner6 rdev     the device identifier (special files only7 size     total size of file, in bytes8 atime    last access time in seconds since the epoch9 mtim

13、e    last modify time in seconds since the epoch10 ctime    inode change time in seconds since the epoch (*11 blksize  preferred block size for file system I/O12 blocks   actual number of blocks allocated您几乎可以记录所有这些信息,但是其中一些信息是毫无使用价值的,因为这些信息或者更改得太频繁,或者在重新启动过程中

14、不一致。应该忽略以下字段:    * rdev因为它仅对于特殊文件是唯一的(通常为驱动器或管道),所以可以忽略它。    * atime每次访问文件后,文件的最后访问时间都会更改。这意味着该文件很可能会更改,即使从未使用任何方式修改过该文件也会如此。在差异报告中记录该信息可能会导致误确认。    * blksize用于文件系统 I/O 的块大小。尽管它可能不会有更改,但是除文件修改外的其他因素也可能导致此值的更改,因此,逐文件记录该值没有任何意义。    * blocks在文件系统上为该文件分配的块数。此信息特定于

15、某个文件,但是如果还记录文件大小,则同时记录二者没有什么必要。以下字段对记录某些特定原因非常有用:    * dev假设您没有经常安装和卸载文件系统,则在重新引导过程中文件系统的设备号应该是一致的。如果在每次重新启动时文件系统是按同一顺序安装的,则设备号应该一致。    * nlink文件的硬链接数可以帮助识别是否有人在可以覆盖文件的位置创建了文件的硬链接并绕过了原始文件的权限。您无法使用与原始文件不同的所有权和权限创建文件的硬链接。    * ctime索引节点更改时间将随创建文件的时间或更改所有权或模式信息的时间而改变。如果此值已

16、更改,则它可能指示上述值已改变,即使这些值稍后返回到正常值也是如此。清单 6 显示了将文件路径、校验和与其他数据写入标准输出的脚本,并使用冒号将信息的每个字段隔开。对于校验和,不仅对文件内容执行校验和,而且还将其他信息添加到校验和数据,这样仅通过比较校验和,就可以确定是否存在差异。清单 6. 将文件路径、校验和与其他数据写入标准输出1. #!/usr/local/bin/perl2. 3. use Digest:MD5;4. use IO:File;5. use strict;6. use File:Find (;7. 8. my $chksumfile = 'chksums.dat&

17、#39;9. 10. use vars qw/*name *dir *prune/;11. *name   = *File:Find:name;12. *dir    = *File:Find:dir;13. *prune  = *File:Find:prune;14. 15. File:Find:find(wanted => &wanted, $ARGV0;16. 17. sub wanted 18.     next unless (-f $name;19. 20.     m

18、y $fileinfo = genchksuminfo($name;21. 22.     printf ("%sn",$fileinfo;23. 24. 25. sub genchksuminfo26. 27.     my ($file = _;28. 29.     my $chk = Digest:MD5->new(;30. 31.     my (statinfo = stat($file;32.     33.     $chk

19、->add(statinfo0,1,2,3,4,5,7,9,10;34.     $chk->addfile(IO:File->new($file;35.     return sprintf("%s:%s:%s",36.                    $file,$chk->hexdigest,37.          &#

20、160;         join(':',statinfo0,1,2,3,4,5,9,10;38. 复制代码该脚本使用 Perl 中的 File:Find 模块,该模块可以遍历目录并从基本点发现每个文件和目录。对于每个文件,都会调用 wanted( 函数,并且在针对每个文件的该函数中,都会调用 genchksuminfo( 函数。该函数获取 stat( 的信息,并在一行中创建文件路径、校验和与其他信息,然后返回该信息。在此脚本中,该信息仅输出到标准输出。该命令接受要扫描的目录,因此可以生成校验和信息。对于 /etc,将使用清单

21、 7 中显示的命令。清单 7. 扫描 /etc1. $ perl savemd5.pl /etc2. /private/etc/6to4.conf:e6b1ba3e7683a0df9be21c9e9f5d1f6a:234881026:46788:3.                33188:1:0:0:1152674600:11559140284. /private/etc/afpovertcp.cfg:dc7c89b0626d6e603131902d387816f7:234881026:30

22、152:5.                33188:1:0:0:1151780398:11661940176. /private/etc/aliases:de483c306c03f35dcbd45d609f8e68ce:234881026:47440:7.               33188:1:0:0:1151828538:11559140288. /private/etc/aliase

23、s.db:aa95ae673dcb6ba89684a6f4bbe3dba5:234881026:47437:9.               33188:1:0:0:1151828588:115591402810. /private/etc/authorization:39f7938ae1df629d422b27ec1a17f3dd:234881026:950752:11.              

24、60;33188:1:0:0:1162503594:116250359412. /private/etc/auto.mnt:3da7579cdc03c529059a42de51c6679e:234881026:1013554:13.               33188:1:0:0:1162728759:116272875914. /private/etc/auto.mnt:54d856aa344d03a6084d63c9dd7e1d9c:234881026:1013530:15.  

25、;             33188:1:0:0:1162728576:116272857616. /private/etc/bashrc:fb23bdcacf23f69f1ce92e3b910c03b9:234881026:42880:17.               33188:1:0:0:1151805563:115591402818. /private/etc/compilers:363c627

26、92a79df85cd0c8d71ff274495:234881026:821586:19.               33188:1:0:0:1159026690:116250315020. /private/etc/crontab:b9af1eb506bd68a43465789174bfe5e1:234881026:29678:21.               33188:1:0:0:11

27、51800085:116619373622. .复制代码此流程的最后一个阶段是存储信息,并提供将当前信息与存储的信息进行比较的方法。验证校验和信息最后一个脚本基于清单 6 中的脚本。该脚本对原始脚本进行了显著扩展,合并了许多新功能:    * 使用 Getopt:Long 模块分析的命令行选项。这使您能够指定校验和文件(存储您计算的校验和与其他信息)、是否比较新信息和旧信息(通过阅读校验和文件的内容)和指定要搜索的基本目录。如果比较该文件,将会更新数据并仅报告差异。    * loadchksumdata( 函数,该函数以方便比较新信息和旧信息的方法加载

28、和分析现有数据文件。    * gendiff report( 函数,该函数将所存储信息的各个字段与当前信息进行实际比较,告诉您更改了哪些内容。仅当确定已存在某种差异时,才调用此函数。      清单 8. 最终脚本1.       #!/usr/local/bin/perl 2. 3.       use Digest:MD5;4.       use IO:File;5.    &#

29、160;  use strict;6.       use File:Find (;7.       use Getopt:Long;8. 9.       my $chksumfile = 'chksums.dat'10.       my $compare = 0;11.       my $basedir = '/etc'12. 13.  

30、     use vars qw/*name *dir *prune/;14.       *name   = *File:Find:name;15.       *dir    = *File:Find:dir;16.       *prune  = *File:Find:prune;17. 18.       GetOptions("

31、chksumfile=s" => $chksumfile,19.                  "compare" => $compare,20.                  "basedir=s" => $basedir;21. 22.      &

32、#160;my $chksumdata = ;23. 24.       if ($compare25.       26.           loadchksumdata($chksumfile;27.       28. 29.       my $outfile = ''30. 31.       if (!$co

33、mpare32.       33.           $outfile = IO:File->new($chksumfile,"w"34.       35. 36.       File:Find:find(wanted => &wanted, $basedir;37. 38.       if ($compare39.  

34、;     40.           foreach my $file (keys %$chksumdata41.           42.               print STDERR "Couldn't find $file, but have the info on recordn"43.  

35、         44.       45. 46.       sub loadchksumdata47.       48.           my ($file = _;49. 50.           open(DATA,$file or die "Cannot open check s

36、um file $file: $!n"51.           while( 52.           53.               chomp;54.               my ($filename,$rest = split(/:/,$_,2;55

37、.               $chksumdata->$filename = $_;56.           57.           close(DATA;58.       59. 60.       sub wanted 61.       

38、;    next unless (-f $name;62. 63.           my $fileinfo = genchksuminfo($name;64. 65.           if ($compare66.           67.               if (exis

39、ts($chksumdata->$name68.               69.                   if ($chksumdata->$name ne $fileinfo70.                   71. &#

40、160;                     print STDERR "Warning: $name differs from that on recordn"72.                       gendiffreport($chksumdata->$name, $fileinfo

41、;73.                   74.                   delete($chksumdata->$name;75.               76.         &

42、#160;     else77.               78.                   print STDERR "Warning: Couldn't find $name in existing recordsn"79.         &

43、#160;     80.           81.           else82.           83.               printf $outfile ("%sn",$fileinfo;84.     

44、      85.       86. 87.       sub gendiffreport88.       89.           my ($orig,$curr = _;90. 91.           my fields = qw/filename chksum device inode mode nlink u

45、id gid size mtime ctime/;92. 93.           my origfields = split(/:/,$orig;94.           my currfields = split(/:/,$curr;95. 96.           for(my $i=0;$i 97.           98.   &

46、#160;           if ($origfields$i ne $currfields$i99.               100.                   print STDERR "t$fields$i differ; was $origfields$i,

47、60;101.                                    now $currfields$in"102.               103.           104. 105.   &#

48、160;   106. 107.       sub genchksuminfo108.       109.           my ($file = _;110. 111.           my $chk = Digest:MD5->new(;112. 113.           my (statin

49、fo = stat($file;114. 115.           $chk->add(statinfo0,1,2,3,4,5,7,9,10;116.           $chk->addfile(IO:File->new($file;117.           return sprintf("%s:%s:%s",118.                          $file,$chk->hexdigest,119.                 

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论