linux 文件系统的监控

完整性检查是HIDS的重要组成部分之一,linux下作完整性检查的思路有3个php

一、哈希对比css

二、签名校验html

三、inotifynode

方法有2个:jquery

A、按期检测,例如经过cron或程序内置计时器linux

B、实时检测,inotifygit

一、2通常和A,3通常和B。用inotify作完整性检查的程序如今貌似还没现成比较好用的,谁推荐一个。github

内核2.6.13以上,RHEL5默认支持inotify,RHEL4不确认这个功能是否有backport,查看英文原文:Inotify: Efficient, Real-Time Linux File System Event Monitoringweb

 

做者 Michael Prokop 译者 张永利 发布于 2010年9月22日 上午12时0分正则表达式

概要 – 为何须要监控文件系统?

在平常工做中,人们每每须要知道在某些文件(夹)上都有那些变化,好比:

  • 通知配置文件的改变
  • 跟踪某些关键的系统文件的变化
  • 监控某个分区磁盘的总体使用状况
  • 系统崩溃时进行自动清理
  • 自动触发备份进程
  • 向服务器上传文件结束时发出通知

一般使用文件轮询的通知机制,可是这种机制只适用于常常改变的文件(由于它能够确保每过x秒就能够获得i/o),其余状况下都很是低效,而且有时候会丢失某些类型的变化,例如文件的修改时间没有改变。像Tripwire这样的数据完整性系统,它们基于时间调度来跟踪文件变化,可是若是想实时监控文件的变化的话,那么时间调度就一筹莫展了。Inotify就这样应运而生了。本文将简要介绍inotify,告诉咱们如何监控文件夹,如何一有变化就报告相关消息事件,并介绍了一些相关工具, 咱们能够把它们添加到本身的工具箱中。

Inotify究竟是什么?

Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入。在BSD和Mac OS系统中比较有名的是kqueue,它能够高效地实时跟踪Linux文件系统的变化。近些年来,以fsnotify做为后端,几乎全部的主流Linux发行版都支持Inotify机制。如何知道你的Linux内核是否支持Inotify机制呢?很简单,执行下面这条命令:

1
2
% grep INOTIFY_USER / boot / config - $ ( uname - r )
CONFIG_INOTIFY_USER = y

若是输出(‘CONFIG_INOTIFY_USER=y’),那么你能够立刻享受Inotify之旅了。

简单的文件变化通知样例:

好的开始是成功的一半,对于了解Inotify机制来讲,让咱们从使用inotifywait程序开始,它包含在inotify-tools工具包中。假如咱们打算监控/srv/test文件夹上的操做,只需执行:

 
1
2
3
% inotifywait - rme modify , attrib , move , close_write , create , delete , delete_self / srv / test
Setting up watches . Beware : since - r was given , this may take a while !
Watches established .

上述任务运行的同时,咱们在另外一个shell里依次执行如下操做:建立文件夹,而后在新文件夹下建立文件,接着删除新建立的文件:

 
1
2
3
% mkdir / srv / test / infoq
% echo TODO &gt ; / srv / test / infoq / article . txt
% rm / srv / test / infoq / article . txt

在运行inotifywait的shell中将会打印如下信息:

 
1
2
3
4
5
/ srv / test / CREATE , ISDIR infoq
/ srv / test / infoq / CREATE article . txt
/ srv / test / infoq / MODIFY article . txt
/ srv / test / infoq / CLOSE_WRITE , CLOSE article . txt
/ srv / test / infoq / DELETE article . txt

显而易见,只要有变化咱们就会收到相关的通知。若是想了解关于Inotify提供的事件(如modify, atrrib等)的详细信息,请参考inotifywatch的manpage。实际使用时,若是并不想监控某个大文件夹,那么就可使用inotifywait的exclude选项。例如:咱们要忽略文件夹/srv/test/large,那么就能够这样来创建监控:

 
1
2
3
% inotifywait -- exclude '^/srv/test/(large|ignore)/' - rme modify , attrib , move , close_write , create , delete , delete_self / srv / test
Setting up watches . Beware : since - r was given , this may take a while !
Watches established .

上面的例子中,在exclude选项的匹配串中咱们使用了正则表达式,由于咱们不想将名称中含有large或ignore的文件也排除掉。咱们能够测试一下:

 
1
2
3
4
% echo test &gt ; / srv / test / action . txt
% echo test &gt ; / srv / test / large / no_action . txt
% echo test &gt ; / srv / test / ignore / no_action . txt
% echo test & gt ; / srv / test / large - name - but - action . txt

这里inotifywait应该只会报告’action.txt’和’large-name-but-action.txt’两个文件的变化,而忽略子文件夹’large’和’ignore’下的文件,结果也确实如此;

 
1
2
3
4
5
6
/ srv / test / CREATE action . txt
/ srv / test / MODIFY action . txt
/ srv / test / CLOSE_WRITE , CLOSE action . txt
/ srv / test / CREATE large - name - but - action . txt
/ srv / test / MODIFY large - name - but - action . txt
/ srv / test / CLOSE_WRITE , CLOSE large - name - but - action . txt

另外,经过使用-t选项咱们还能够定义inotifywait的监控时间,既可让它执行一段时间,也可让它一直运行。util-linux-ng的logger命令也能够实现此功能,不过得先把相关的消息事件发送到syslog,而后从syslog服务器再分析整合。

Inotifywatch – 使用inotify来统计文件系统访问信息

Inotify-tools中还有一个工具叫inotifywatch,它会先监听文件系统的消息事件,而后统计每一个被监听文件或文件夹的消息事件,以后输出统计信息。好比咱们想知道某个文件夹上有那些操做:

 
1
2
3
4
5
6
7
8
9
% inotifywatch - v - e access - e modify - t 120 - r ~ / InfoQ
Establishing watches . . .
Setting up watch ( es ) on / home / mika / InfoQ
OK , / home / mika / InfoQ is now being watched .
Total of 58 watches .
Finished establishing watches , now collecting statistics .
Will listen for events for 120 seconds .
total modify filename
2 2 / home / mika / InfoQ / inotify /

很显然,这里咱们监控的是~/InfoQ文件夹,而且能够看到/home/mika/InfoQ/inotify上发生了两个事件。方法虽简单,但却颇有效。

Inotify的配置选项

使用Inotify时,要特别注意内核中关于它的两个配置。首先/proc/sys/fs/inotify/max_user_instances 规定了每一个用户所能建立的Inotify实例的上限;其次/proc/sys/fs/inotify/max_user_watches规定了每一个Inotify实例最多能关联几个监控(watch)。你能够很容易地试验在运行过程当中达到上限,如:

 
1
2
3
4
% inotifywait - r /
Setting up watches . Beware : since - r was given , this may take a while !
Failed to watch / ; upper limit on inotify watches reached !
Please increase the amount of inotify watches allowed per user via ` / proc / sys / fs / inotify / max_user_watches' .

若是要改变这些配置,只要向相应的文件写入新值便可,以下所示:

 
1
2
3
4
5
# cat /proc/sys/fs/inotify/max_user_watches
8192
# echo 16000 > /proc/sys/fs/inotify/max_user_watches
# cat /proc/sys/fs/inotify/max_user_watches
16000

 

使用Inotify的一些工具

近一段时间出现了不少基于Inotify的超炫的工具,如incron,它是一个相似于cron的守护进程(daemon),传统的cron守护进程都是在规定的某个时间段内执行,而incron因为使用了Inotify,能够由事件触发执行。同时incron的安装简单而直观,好比在debian上,首先在/etc/incron.allow中添加使用incron的用户(debian默认不容许用户使用incron,由于若是incron使用不慎的话,例如造成死循环,则会致使系统宕机): 

 
1
# echo username > /etc/incron.allow

而后调用”incrontab -e“, 在弹出的编辑器中插入咱们本身的规则,例以下面的这条简单的规则,文件一变化incron就会发邮件通知咱们:

 
1
/ srv / test / IN_CLOSE_WRITE mail - s "$@/$#\n" root

从如今开始,一旦/src/test文件夹中的文件被修改,就会发送一封邮件。可是注意不要让incron监控整个子目录树,由于Inotify只关注inodes,而不在意是文件仍是文件夹,因此基于Inotify的软件都须要本身来处理/预防递归问题。关于incontab详细使用,请参考incrontab的manpage。

若是你还要处理incoming文件夹,那么你可能须要inoticoming。当有文件进入incoming文件夹时Inoticoming就会执行某些动做,从而能够用inoticoming来管理debian的软件仓库(例如软件仓库中一旦有上传源码包或是新添加的二进制包就马上自动进行编译),另外,还能够用它来监控系统是否有新上传文件,若是有就发送通知。相似的工具还有(它们都各有专长):inosync(基于消息通知机制的文件夹同步服务),iwatch(基于Inotify的程序,对文件系统进行实时监控),以及lsyncd(一个守护进程(daemon),使用rsync同步本地文件夹)。

Inotify甚至对传统的Unix工具也进行了改进,例如tail。使用inotail,同时加上-f选项,就能够取代每秒轮询文件的作法。此外,GNU 的coreutils从版本7.5开始也支持Inotify了,咱们能够运行下面的命令来确认:

 
1
2
3
4
# strace -e inotify_init,inotify_add_watch tail -f ~log/syslog
[ . . . ]
inotify_init ( ) = 4
inotify_add_watch ( 4 , "/var/log/syslog" , IN_MODIFY | IN_ATTRIB | IN_DELETE_SELF | IN_MOVE_SELF ) = 1

从如今开始,经过轮询来确实文件是否须要从新读取的方法应该做为古董了。

在脚本中使用Inotify

Inotify机制并不局限于工具,在脚本语言中也彻底能够享受Inotify的乐趣,如Python中可使用pyinotifyinotifyx,Perl中有Filesys-Notify-SimpleLinux-Inotify2,Inotify的Ruby版有ruby-inotifyrb-inotyfssm

总结

综上所述,Inotify为Linux提供了一套高效监控和跟踪文件变化的机制,它能够实时地处理、调试以及监控文件变化,而轮询是一种延迟机制。对于系统管理员,关于实现事件驱动的服务如系统备份,构建服务以及基于文件操做的程序调试等,Inotify无疑提供了强大的支持。

包子猜您可能还喜欢下列文章:

  1. AdviceIOPerfomance
  2. 解决Out of socket memory
  3. adore-ng也能够经过echo或者cat进行控制
  4. 一个提权技巧和两个本地后门技巧 zz from xiaoyu
  5. chroot ssh
相关文章
相关标签/搜索