Точечные проверки

Точечные проверки

Я хочу отслеживать все файлы, загруженные с помощью веб-сервера (в основном с помощью 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

Связанный контент