inotify与Auditd实现文件操作记录和审计
业务反馈现网某个目录下的文件发现两次被删除,不过没有具体的删除时间,也不知道是被什么程序删除的,所以提出一个需求是希望通过监控该目录下的相关文件,一旦发现被删除后,可以通过记录写到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工具的配置文件。
其运行流程如下:
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产生内账户修改相关的事件。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/inotify-auditd/5337.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.