我想监视/跟踪使用 Web 服务器上传的所有文件(主要使用 PHP/Apache,不使用 FTP 服务器)。
我用 Google 搜索,发现唯一可能的方法是在 PHP 中为 move_uploaded_file 编写一个钩子。
如果我们可以在 PHP 中为 move_uploaded_file 编写一个钩子函数,那么我们就可以将目标文件路径保存在一个位置。但是,我找不到解决方案来实现相同的目标。
有人可以建议我一种方法吗?
编辑:网络服务器有数百个托管帐户和数千个网站,因此不可能使用网络应用程序控制它们,因为我们无法控制网络应用程序。
答案1
你可以使用命令inotifywatch
(inotify-tools
Debian 上的内部包)使用 -r
(递归)参数
例如:
inotifywatch -q -e moved_to,create -r /var/www/
答案2
我想监视/跟踪使用网络服务器上传的所有文件(主要使用 PHP/Apache
没有简单的方法。您可以使用该功能查找所有文件move_uploaded_file
,但这只会拦截 POST 文件上传。 HTML5/PLupload 等 AJAX 上传将无法识别。
问题是,为什么您想跟踪“所有上传的文件”吗?由于您甚至不知道这些文件是什么,也不知道它们在哪里,因此了解文件名、大小和所有权似乎没有什么意义——这就是您所能获得的全部信息。
如果您试图拦截对系统的更改(例如 Web 攻击),那么使用tripwire
、 和/或某些日志扫描实用程序、或者可能是 Snort 或专门的安全包(例如用于 Wordpress)会更好地为您服务。或者您可能感兴趣famd
,或决定主动并部署(并配置和维护)应用程序装甲。
如果您追求的是责任,那么无论如何您都需要修改上传脚本。如果您运行多个不同的上传框架,则需要逐个脚本地执行此操作。
如果您想跟踪流量或配额,可以使用更好的方法。
但基本上,你不必担心关于上传到您的托管网站上的文件,除非你上游有其他问题。担心文件上传让我怀疑你的文件上传是一个XY问题。
如果您仍然有监控文件的想法已创建(如前所述,已上传限制太多),可能最简单的方法是设置一个strace
流程,但现在取决于 PHP 的调用方式 - 它是 Apache 模块、CGI 还是 FPM?对于 Apache 模块,假设二进制文件被称为httpd
:
strace -f -p "$( pidof httpd )" -e open 2>&1 | grep -F -v ', O_RDONLY'
会给你带来类似的东西,
[pid 28882] open("/var/lib/php5/sess_8v107eun48rj0u42uf9ncplrbobj4cqackscb2thx1138k78uk01", O_RDWR|O_CREAT, 0600) = 12
[pid 29739] open("/var/lib/php5/sess_8v107eun48rj0u42uf9ncplrbobj4cqackscb2thx1138k78uk01", O_RDWR|O_CREAT, 0600) = 12
[pid 28882] open("/srv/www/wiki.matrix.boa/data/boawiki.sqlite", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 13
[pid 29739] open("/srv/www/wiki.matrix.boa/data/boawiki.sqlite", O_RDWR|O_CREAT|O_CLOEXEC, 0644) = 13
答案3
点检查
快照和 rsync --dry-run 都非常快,因为它们只使/检查 inode 没有实际数据。快照需要像 zfs 或 btrfs 这样的牛 fs。
btrfs subvolume snapshot -r / /snapshots/$(date +%Y%m%d)
rsync -ad --dry-run /var/www /snapshots/20161103/var/www
即时事件
斯特雷斯
斯特雷斯grep 可用于记录 php 的每个文件更改;
strace -e open php_pid 2>&1 | grep open >> log.txt
inotify
inotify很好,但可能很重,因为它为每个文件夹添加了一个监视。
inotifywatch -v -e modify,moved_to,create -r /var/www/
PHP
php.ini的组合,运行套件,覆盖和自动前置文件可以用来记录文件事件,但它不能阻止人们故意避免记录日志。您可能想要禁用 exec,并希望没有人找到重命名的函数;
php.ini:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
runkit.internal_override = On
auto_prepend_file = /var/www/html/prepend.php
前置.php
rename_function('move_uploaded_file', 'real_move_uploaded_file');
override_function('move_uploaded_file', '$filename,$destination', 'log ( $filename, $destination ) ; return real_move_uploaded_file ( $filename, $destination );');
rename_function("__overridden__", 'dummy_move_uploaded_file');
C
由于 php 是 FLOSS,您可以编译自己定制的 PHP,但在绝对确保所有其他列出的选项不合适之前,这是不可取的。
答案4
Logstash / 麋鹿 / kibabna...
我很确定您能够从日志文件中变出一些正则表达式......
您可以检查 php 上传、webdav 上传,然后将此信息与地图、时间等结合起来......
简单中的优雅...(在发布的问题中没有提到需要实时处理,所以我假设您不需要每次上传文件时运行任何脚本?您只想监视并保留一个日志?)
如果我假设错误,那么 inotify 上+1