使用 inotifywait 检测哪个命令/脚本删除了你的文件

使用 inotifywait 检测哪个命令/脚本删除了你的文件

我们的一个应用服务器定期删除里面的文件:

/home/test/data

问题是我们仍然不知道删除文件的脚本或命令,所以我们尝试使用 inotifywait。我们能够记录日期时间,但无法检索所需信息。我可以配置/自定义此 inotify 以显示删除我的文件的罪魁祸首吗?

日志样本:

/opt/asd CREATE 2017/04/03-17:49:05
/opt/asd DELETE 2017/04/03-17:49:11
/opt/wira/.bash_history MODIFY 2017/04/03-17:51:29
/opt/wira/.bash_history MODIFY 2017/04/03-17:51:29
/opt/wira/.bash_history MODIFY 2017/04/03-17:51:29
/home/test/data/test DELETE 2017/04/03-17:52:16
/home/test/data/c/test DELETE 2017/04/03-17:58:00
/home/test/data/c DELETE,ISDIR 2017/04/03-17:58:00

这是我们的配置

# specify log file
LOGFILE=/var/log/inotify.log
# specify target directory for monitoring
MONITOR=/home/test/data
# specify target events for monitoring ( comma separated )
# refer ro "man inotifywait" for kinds of events
EVENT=delete,modify,move

答案1

执行此操作的工具是审计

Linux 审计系统的用户空间组件。它负责将审计记录写入磁盘。查看日志使用 ausearch 或 aureport 实用程序完成。配置审计规则使用 auditctl 实用程序完成。在启动期间,auditctl 会读取 /etc/audit/audit.rules 中的规则。审计守护进程本身具有一些管理员可能希望自定义的配置选项。它们位于 auditd.conf 文件中。

(从手册)。要检测文件是否被删除,请在安装审计包并启动它,您将审核相关文件的包含文件夹,如下所示:

    
    $ 触摸 zz
    $ sudo auditctl -w /home/me -p wa
    $ rm /home/me/zz
    $ sudo cat /var/log/audit/audit.log
    类型 = DAEMON_START 消息 = 审核(1491310210.803:235):auditd 启动,ver=2.4.5 格式 = 原始内核 = 4.8.0-45-generic auid = 4294967295 pid = 29913 subj = unconfined res = 成功
    类型 = USER_AUTH msg = 审核(1491310280.366:26):pid = 30060 uid = 1000 auid = 1000 ses = 2 msg ='op = PAM:authentication acct =“e”exe =“/usr/bin/sudo”主机名 =?addr =?terminal = / dev / pts / 6 res =成功'
    类型 = USER_ACCT msg = 审计(1491310280.366:27):pid = 30060 uid = 1000 auid = 1000 ses = 2 msg ='op = PAM:accounting acct =“me”exe =“/usr/bin/sudo”主机名 =?addr =?terminal = / dev / pts / 6 res = 成功'
    类型 = USER_CMD msg = 审核(1491310280.366:28):pid = 30060 uid = 1000 auid = 1000 ses = 2 msg ='cwd =“/home/me”cmd = 617564697463746C202D77202F686F6D652F6D6172696F202D70207761 终端 = pts/6 res = 成功'
    类型 = CRED_REFR msg = 审核(1491310280.366:29):pid = 30060 uid = 0 auid = 1000 ses = 2 msg ='op = PAM:setcred acct =“root”exe =“/usr/bin/sudo”主机名 =?addr =?terminal = / dev / pts / 6 res = 成功'
    类型 = USER_START msg = 审核(1491310280.366:30):pid = 30060 uid = 0 auid = 1000 ses = 2 msg ='op = PAM:session_open acct =“root”exe =“/usr/bin/sudo”主机名 =?addr =?terminal = / dev / pts / 6 res = 成功'
    类型 = CONFIG_CHANGE 消息 = 审核(1491310280.390:31):auid = 1000 ses = 2 op =“add_rule”键 =(null)列表 = 4 res = 1
    类型 = USER_END msg = 审核(1491310280.390:32):pid = 30060 uid = 0 auid = 1000 ses = 2 msg ='op = PAM:session_close acct =“root”exe =“/usr/bin/sudo”主机名 =?addr =?terminal = / dev / pts / 6 res =成功'
    类型 = CRED_DISP msg = 审核(1491310280.390:33):pid = 30060 uid = 0 auid = 1000 ses = 2 msg ='op = PAM:setcred acct =“root”exe =“/usr/bin/sudo”主机名 =?addr =?terminal = / dev / pts / 6 res = 成功'
    类型 = SYSCALL msg = 审核(1491310299.535:34):arch = c000003e syscall = 263 成功 = 是退出 = 0 a0 = ffffff9c a1 = 21b0000 a2 = 0 a3 = 15e 项目 = 2 ppid = 2441 pid = 30087 auid = 1000 uid = 1000 gid = 1000 euid = 1000 suid = 1000 fsuid = 1000 egid = 1000 sgid = 1000 fsgid = 1000 tty = pts6 ses = 2 comm =“rm”exe =“/ bin / rm”key =(null)
    类型=CWD 消息=审核(1491310299.535:34):cwd=“/home/me”
    类型 = PATH msg = audit(1491310299.535:34): item = 0 name =“/home/me” inode = 23199747 dev = fd:00 mode = 040755 ouid = 1000 ogid = 1000 rdev = 00:00 nametype = PARENT
    类型 = PATH msg = audit(1491310299.535:34): item = 1 name =“zz” inode = 23205547 dev = fd:00 mode = 0100664 ouid = 1000 ogid = 1000 rdev = 00:00 nametype = DELETE
    类型 = PROCTITLE 消息 = 审核(1491310299.535:34): proctitle = 726D007A7A
    类型 = USER_CMD msg = 审核(1491310321.131:35):pid = 30120 uid = 1000 auid = 1000 ses = 2 msg ='cwd =“/home/me”cmd = 636174202F7661722F6C6F672F61756469742F61756469742E6C6F67 终端 = pts/6 res = 成功'
    类型 = CRED_REFR msg = 审核(1491310321.131:36):pid = 30120 uid = 0 auid = 1000 ses = 2 msg ='op = PAM:setcred acct =“root”exe =“/usr/bin/sudo”主机名 =?addr =?terminal = / dev / pts / 6 res = 成功'
    类型 = USER_START msg = audit(1491310321.131:37):pid = 30120 uid = 0 auid = 1000 ses = 2 msg ='op = PAM:session_open acct =“root”exe =“/usr/bin/sudo”主机名 =?addr =?terminal = / dev / pts / 6 res = 成功'

我使用粗体表示相关删除事件,您可以轻松看到执行删除的 PPID、PID 和用户。

答案2

使用 inotifywait 作为事件陷阱是一个不错的开始。但是,正如您所指出的,它不会告诉您谁/什么,只会告诉您何时。知道何时是缩小罪魁祸首范围的好方法。但是,您需要更多信息。

作为一种快速且(非常)粗暴的解决方案,临时更改数据目录的文件权限,以便只有特定用户或组可以修改/删除文件。这将导致错误消息的转储,因为应用程序(也许还有人)试图接触文件并受到惩罚。(警告:以 root 身份运行的任何程序都会绕过这一点,因此我建议从服务帐户运行应用程序/作业,而不是 root)。

这些错误消息将识别试图删除文件的进程,然后您可以进一步研究哪个脚本正在启动哪个进程,因为所有子进程都包含其父进程,一直到 init/0。脚本可能是 bash 的一个实例,但它们的父进程要么是 crond(定时作业),要么是应用程序。

另一个可能的途径是检查您的 cron 表,以查看在文件被删除之前立即运行了哪些 cron 作业。(如果您的应用程序运行作业而不交给 crond,请查找应用程序内的作业计划和日志。)

相关内容