业务反馈现网某个目录下的文件发现两次被删除,不过没有具体的删除时间,也不知道是被什么程序删除的,所以提出一个需求是希望通过监控该目录下的相关文件,一旦发现被删除后,可以通过记录写到logfile里 。最初想到的是通过 inotify 功能实现记录,后来发现auditd记录的信息更详细一些,这里分别说下两种实现方法 。

一、inotify

notify是Linux内核2.6.13 (June 18, 2005)版本新增的一个子系统(API),它提供了一种监控文件系统(基于inode的)事件的机制,可以监控文件系统的变化如文件修改、新增、删除等,并可以将相应的事件通知给应用程序。该机制由著名的桌面搜索引擎项目beagle引入用于替代此前具有类似功能但存在诸多缺陷的dnotify。

inotify既可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。实现上来说,可以使用大名鼎鼎的inotify-tools(只能记录时间点,无法记录哪个用户和进程操作),也可以通过实pynotify模块自已实现。

二、inotify-tools

1、安装和监控

这里以 inotify-tools 为例,安装方法如下:

1# git clone https://github.com/rvoicilas/inotify-tools
2# cd inotify-tools
3# sh autogen.sh
4# ./configure
5# make && make install

inotify-tools安装完成后,会生成inotifywait和inotifywatch两个指令,其中,inotifywait用于等待文件或文件集上的一个特定事件,它可以监控任何文件和目录设置,并且可以递归地监控整个目录树。inotifywatch用于收集被监控的文件系统统计数据,包括每个inotify事件发生多少次等信息。这里使用的监控方法如下:

1/usr/local/bin/inotifywait -rd -o \
2/var/log/monitorfile/monitor.log --timefmt '%y/%m/%d %H:%M'  \
3--format '%T %w%f %e' -e \
4modify,delete,delete_self,move,moved_to,move_self  /tmp

日志内容如下:

1# more monitorfile.log
217/01/04 09:53 /tmp/xxx CREATE
317/01/04 09:53 /tmp/xxx ATTRIB
417/01/04 09:54 /tmp/xxx DELETE
517/01/04 09:54 /tmp/dirtest CREATE,ISDIR

2、参数优化

可以优化的参数如下 :

inotify定义了下列的接口参数,可以用来限制inotify消耗kernel memory的大小。由于这些参数都是内存参数,因此,可以根据应用需求,实时的调节其大小:
1、/proc/sys/fs/inotify/max_queue_events
应用程序调用inotify时需要初始化inotify实例,并时会为其设定一个事件队列,此文件中的值则是用于设定此队列长度的上限;超出此上限的事件将会被丢弃;
2、/proc/sys/fs/inotify/max_user_instances
此文件中的数值用于设定每个用户ID(以ID标识的用户)可以创建的inotify实例数目的上限;
3、/proc/sys/fs/inotify/max_user_watches
此文件中的数值用于设定每个用户ID可以监控的文件或目录数目上限;

3、inotify监控事件

inotify 可以监视的文件系统常见事件包括:

  • IN_ACCESS:文件被访问
  • IN_MODIFY:文件被修改
  • IN_ATTRIB,文件属性被修改
  • IN_CLOSE_WRITE,以可写方式打开的文件被关闭
  • IN_CLOSE_NOWRITE,以不可写方式打开的文件被关闭
  • IN_OPEN,文件被打开
  • IN_MOVED_FROM,文件被移出监控的目录
  • IN_MOVED_TO,文件被移入监控着的目录
  • IN_CREATE,在监控的目录中新建文件或子目录
  • IN_DELETE,文件或目录被删除
  • IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
  • IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

4、其他

inotify经常和 rsync配合起来用,具体格式如下:

 1#!/bin/bash
 2DESTHOST=192.168.1.100
 3DESTHOSTDIR=/www/htdocs/
 4SRCDIR=/www/htdocs/
 5inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f'  \
 6-e create,delete,modify,attrib  $SRCDIR | while read DATE TIME DIR FILE; do
 7   $FILECHANGE=${DIR}${FILE}
 8   rsync -avze 'ssh' $SRCDIR root@${DESTHOST}:${DESTHOSTDIR} &>/dev/null && \
 9      echo "At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync" >> /var/log/filesync.log
10done

三、auditd

1、auditd概述

auditd(或 auditd 守护进程)是Linux审计系统中用户空间的一个组件,其负责将审计记录写入磁盘。其可以跟踪到改变该文件的相关进程。

默认安装好后,其由以下应用程序和关键配置组成:

  • auditctl : 即时控制审计守护进程的行为的工具,比如如添加规则等等。
  • /etc/audit/rules.d/audit.rules : 记录审计规则的文件。
  • aureport : 查看和生成审计报告的工具。
  • ausearch : 查找审计事件的工具
  • auditspd : 转发事件通知给其他应用程序,而不是写入到审计日志文件中。
  • autrace : 一个用于跟踪进程的命令。
  • /etc/audit/auditd.conf : auditd工具的配置文件。

其运行流程如下:

auditd
auditd

2、audit rule规则配置

默认安装完成后,没有规则存在,可以通过如下命令查看:

1[root@361way ~]# auditctl  -l
2No rules
3[root@361way ~]# auditctl  -s    //查看状态
4AUDIT_STATUS: enabled=0 flag=1 pid=0 rate_limit=0 backlog_limit=64 lost=0 backlog=0

同样通过auditctl 命令配置rule规则,如下:

1# auditctl -w /etc/passwd -p rwxa
2# auditctl -w /data/ -p wx

-w path : 指定要监控的路径;-p : 指定触发审计的文件/目录的访问权限;rwxa : 指定的触发条件,r 读取权限,w 写入权限,x 执行权限,a 属性(attr)。

不过上面的操作方法是立即生效的,一旦重启服务后,规则就不存在了。可以将规则写入到配置 /etc/audit/rules.d/audit.rules 中永久生效。类似如下:

1-w /dir1/ -p wa
2-a exit,always -F dir=/dir2/ -F perm=wa
3-a exit,never -F dir=/directory/directory-to-exclude/
4-a exit,never -F path=/directory/file-to-exclude
5-a exit,always -F dir=/directory/ -F perm=wa

3、auditd 审计日志

默认审计日志存放的位置为/var/log/audit/audit.log,以下在我在/data目录下创建文件和删除文件产生的日志:

1type=SYSCALL msg=audit(1484223891.733:40): arch=c000003e syscall=2 success=yes exit=3 a0=7fff796768aa a1=941 a2=1b6 a3=3596b8f14c items=2 ppid=29386 pid=29408 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=18292 comm="touch" exe="/bin/touch" key=(null)
2type=CWD msg=audit(1484223891.733:40):  cwd="/data"
3type=PATH msg=audit(1484223891.733:40): item=0 name="/data" inode=655797 dev=ca:01 mode=040755 ouid=0 ogid=0 rdev=00:00 nametype=PARENT
4type=PATH msg=audit(1484223891.733:40): item=1 name="testfile" inode=668372 dev=ca:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=CREATE
5type=SYSCALL msg=audit(1484223899.143:41): arch=c000003e syscall=263 success=yes exit=0 a0=ffffffffffffff9c a1=6c40c0 a2=0 a3=20 items=2 ppid=29386 pid=29409 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=18292 comm="rm" exe="/bin/rm" key=(null)
6type=CWD msg=audit(1484223899.143:41):  cwd="/data"
7type=PATH msg=audit(1484223899.143:41): item=0 name="/data" inode=655797 dev=ca:01 mode=040755 ouid=0 ogid=0 rdev=00:00 nametype=PARENT
8type=PATH msg=audit(1484223899.143:41): item=1 name="testfile" inode=668372 dev=ca:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=DELETE

这个输出结果并不友好,可以通过ausearch命令搜索想要的内容:

 1[root@361way data]# ausearch -f /data
 2----
 3time->Thu Jan 12 20:24:51 2017
 4type=PATH msg=audit(1484223891.733:40): item=1 name="testfile" inode=668372 dev=ca:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=CREATE
 5type=PATH msg=audit(1484223891.733:40): item=0 name="/data" inode=655797 dev=ca:01 mode=040755 ouid=0 ogid=0 rdev=00:00 nametype=PARENT
 6type=CWD msg=audit(1484223891.733:40):  cwd="/data"
 7type=SYSCALL msg=audit(1484223891.733:40): arch=c000003e syscall=2 success=yes exit=3 a0=7fff796768aa a1=941 a2=1b6 a3=3596b8f14c items=2 ppid=29386 pid=29408 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=18292 comm="touch" exe="/bin/touch" key=(null)
 8----
 9time->Thu Jan 12 20:24:59 2017
10type=PATH msg=audit(1484223899.143:41): item=1 name="testfile" inode=668372 dev=ca:01 mode=0100644 ouid=0 ogid=0 rdev=00:00 nametype=DELETE
11type=PATH msg=audit(1484223899.143:41): item=0 name="/data" inode=655797 dev=ca:01 mode=040755 ouid=0 ogid=0 rdev=00:00 nametype=PARENT
12type=CWD msg=audit(1484223899.143:41):  cwd="/data"
13type=SYSCALL msg=audit(1484223899.143:41): arch=c000003e syscall=263 success=yes exit=0 a0=ffffffffffffff9c a1=6c40c0 a2=0 a3=20 items=2 ppid=29386 pid=29409 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts1 ses=18292 comm="rm" exe="/bin/rm" key=(null)

其中相关参数部分如下:

  • time : 审计时间。
  • name : 审计对象
  • cwd : 当前路径
  • syscall : 相关的系统调用
  • auid : 审计用户ID
  • uid 和 gid : 访问文件的用户ID和用户组ID
  • comm : 用户访问文件的命令
  • exe : 上面命令的可执行文件路径

通过aureport命令可以产生审计规则,aureport -au可以查看授权失败的信息,aureport -m产生内账户修改相关的事件。