Quiero monitorear/realizar un seguimiento de todos los archivos cargados usando el servidor web (principalmente usando PHP/Apache y NO usando el servidor FTP).
Busqué en Google y descubrí que la única forma posible sería escribir un enlace para move_uploaded_file en PHP.
Si podemos escribir una función de enlace para move_uploaded_file en PHP, entonces podemos guardar la ruta del archivo de destino en una ubicación. Pero no encontré ninguna solución para lograr lo mismo.
¿Alguien puede sugerirme una manera de hacerlo?
Editar: el servidor web tiene cientos de cuentas de alojamiento y miles de sitios web, por lo que no es posible controlarlos mediante la aplicación web, ya que no tenemos control sobre la aplicación web.
Respuesta1
Puedes usar el comandoinotifywatch
(dentro del inotify-tools
paquete en Debian)con el -r
parámetro (recursivo)
p.ej:
inotifywatch -q -e moved_to,create -r /var/www/
Respuesta2
Quiero monitorear/realizar un seguimiento de todos los archivos cargados usando el servidor web (principalmente usando PHP/Apache
No hay manera fácil. Puede encontrar todos los archivos usando la move_uploaded_file
función, pero esto solo interceptará las cargas de archivos POST. No se reconocerán las cargas AJAX como HTML5/PLupload.
La pregunta es,por qué¿Quieres realizar un seguimiento de "todos los archivos cargados"? Como ni siquiera sabes qué son esos archivos ni dónde están, parece que no tiene mucho sentido saber los nombres, tamaños y propiedades de los archivos, que es todo lo que podrás obtener.
Si está intentando interceptar alteraciones en el sistema, por ejemplo, ataques web, entonces será mucho mejor que utilice tripwire
, y/o alguna utilidad de escaneo de registros, o posiblemente Snort, o paquetes de seguridad especializados (por ejemplo, para Wordpress). O podría estar interesado en famd
, o decidir ser proactivo e implementar (y configurar y mantener) AppArmor.
Si lo que busca es responsabilidad, deberá modificar los scripts de carga pase lo que pase. Y deberá hacerlo secuencia de comandos por secuencia de comandos si está ejecutando varios marcos de carga diferentes.
Si desea realizar un seguimiento del tráfico o las cuotas, existenmaneras mucho mejores.
Pero básicamente,no deberías tener que preocupartesobre archivos cargados en sus sitios web alojados,a menos que tengas otros problemas aguas arriba. Preocuparme por la carga de archivos me hace sospechar que el suyo, como ya se ha dicho, es unproblema xy.
Si todavía tienes la idea de monitorear archivoscreado(como se dijo antes,subidoes demasiado restrictivo), posiblemente la forma más sencilla sea configurar un strace
proceso,peroAhora depende de cómo se llame PHP: ¿es un módulo de Apache, CGI o FPM? Para el módulo Apache, suponiendo que el binario se llame httpd
:
strace -f -p "$( pidof httpd )" -e open 2>&1 | grep -F -v ', O_RDONLY'
te conseguirá algo como,
[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
Respuesta3
Verificaciones de puntos
Tanto las instantáneas como rsync --dry-run son increíblemente rápidas porque solo crean/verifican inodos, no datos reales. Las instantáneas requieren una vaca fs como zfs o btrfs.
btrfs subvolume snapshot -r / /snapshots/$(date +%Y%m%d)
rsync -ad --dry-run /var/www /snapshots/20161103/var/www
Eventos instantáneos
rastro
rastroy grep se puede utilizar para registrar todos los cambios de php en el archivo;
strace -e open php_pid 2>&1 | grep open >> log.txt
inotificar
inotificares agradable pero puede resultar pesado porque agrega un reloj para cada carpeta.
inotifywatch -v -e modify,moved_to,create -r /var/www/
PHP
La combinación de php.ini,kit de ejecución,anularyarchivo-antepuesto automáticose puede utilizar para registrar eventos de archivos, pero no puede evitar que las personas eviten el registro intencionalmente. Querrá deshabilitar exec y esperar que nadie encuentre la función renombrada;
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
anteponer.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
Como php es FLOSS, puede compilar su propio PHP personalizado, pero eso no es aconsejable antes de asegurarse absolutamente de que todas las demás opciones enumeradas no sean adecuadas.
Respuesta4
logstash / alce / kibabna...
Estoy bastante seguro de que podrás crear algunas expresiones regulares a partir de los archivos de registro...
Podrás verificar las cargas de php, cargas de webdav y luego combinar esta información con mapas, horarios, etc.
elegancia en simplicidad... (no se mencionó la necesidad de procesamiento en vivo en la pregunta publicada, así que supongo que no necesita ejecutar ningún script cada vez que se carga un archivo. Solo desea monitorear y mantener ¿un registro?)
si asumo mal, entonces +1 en inotify