Я хочу отслеживать все файлы, загруженные с помощью веб-сервера (в основном с помощью PHP/Apache, а НЕ с помощью FTP-сервера).
Я погуглил и обнаружил, что единственным возможным способом было бы написать хук для move_uploaded_file в PHP.
Если мы можем написать функцию-хук для move_uploaded_file в PHP, то мы можем сохранить путь к файлу назначения в одном месте. Но я не нашел решения, чтобы добиться того же.
может кто-нибудь подсказать мне, как это сделать?
Редактировать: На веб-сервере имеется сотни учетных записей хостинга и тысячи веб-сайтов, поэтому контролировать их с помощью веб-приложения невозможно, поскольку у нас нет контроля над веб-приложением.
решение1
Вы можете использовать командуinotifywatch
(внутри inotify-tools
пакета в Debian)с -r
(рекурсивным) параметром
например:
inotifywatch -q -e moved_to,create -r /var/www/
решение2
Я хочу отслеживать все файлы, загруженные с помощью веб-сервера (в основном с помощью PHP/Apache
Нет легкого пути. Вы можете найти все файлы с помощью move_uploaded_file
функции, но это перехватит только загрузки файлов POST. Загрузки AJAX, такие как HTML5/PLupload, не будут распознаны.
Вопрос в том,почемувы хотите отслеживать "все загруженные файлы"? Поскольку вы даже не знаете, что это за файлы и где они находятся, кажется, нет смысла знать имена файлов, их размеры и владельцев - это все, что вы сможете получить.
Если вы пытаетесь перехватить изменения в системе, например, веб-атаки, то вам будет гораздо лучше использовать tripwire
, и/или какую-нибудь утилиту сканирования журналов, или, возможно, Snort, или специализированные пакеты безопасности (например, для Wordpress). Или вы можете быть заинтересованы в famd
, или решить проявить инициативу и развернуть (и настраивать, и поддерживать) AppArmor.
Если вы ищете подотчетность, вам нужно будет изменить скрипты загрузки, несмотря ни на что. И вам нужно будет сделать это на основе скрипт за скриптом, если вы используете несколько различных фреймворков загрузки.
Если вы хотите отслеживать трафик или квоты, естьгораздо лучшие способы.
Но в основном,вам не о чем беспокоитьсяо файлах, загруженных на размещенные вами веб-сайты,если у вас нет других проблем выше по течению. Беспокойство по поводу загрузки файлов заставляет меня подозревать, что ваша, как я уже сказал, являетсяпроблема 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 невероятно быстры, потому что они только создают / проверяют inodes, а не фактические данные. Для снимков требуется коровья fs, например zfs или btrfs.
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
prepend.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');
С
Поскольку PHP — это FLOSS, вы можете скомпилировать свой собственный PHP, но делать это не рекомендуется, пока вы не убедитесь, что все остальные перечисленные варианты не подходят.
решение4
логсташ / лось / кибабна...
Я почти уверен, что вы сможете извлечь какое-нибудь регулярное выражение из файлов журналов...
вы сможете проверить наличие загрузок php, загрузок webdav, а затем объединить эту информацию с картами, временем и т. д.
элегантность в простоте... (в опубликованном вопросе не упоминалось о необходимости обработки в реальном времени, поэтому я предполагаю, что вам не нужно запускать какие-либо скрипты каждый раз при загрузке файла? вы просто хотите отслеживать и вести журнал?)
если я не прав, то +1 на inotify