Quero monitorar/acompanhar todos os arquivos enviados usando o servidor web (principalmente usando PHP/Apache e NÃO usando o servidor FTP).
Pesquisei no Google e descobri que a única maneira possível seria escrever um gancho para move_uploaded_file em PHP.
Se pudermos escrever uma função de gancho para move_uploaded_file em PHP, poderemos salvar o caminho do arquivo de destino em um local. Mas não há solução que eu possa encontrar para conseguir o mesmo.
alguém pode me sugerir uma maneira de fazer isso?
Editar: O servidor web tem centenas de contas de hospedagem e milhares de sites, portanto, não é possível controlá-los usando o aplicativo da web, pois não temos controle sobre o aplicativo da web.
Responder1
Você pode usar o comandoinotifywatch
(dentro inotify-tools
do pacote no Debian)com o -r
parâmetro (recursivo)
por exemplo:
inotifywatch -q -e moved_to,create -r /var/www/
Responder2
Quero monitorar/acompanhar todos os arquivos enviados usando o servidor web (principalmente usando PHP/Apache
Não há maneira fácil. Você pode encontrar todos os arquivos usando a move_uploaded_file
função, mas isso interceptará apenas uploads de arquivos POST. Uploads AJAX como HTML5/PLupload não serão reconhecidos.
A questão é,por quevocê deseja rastrear "todos os arquivos enviados"? Como você nem sabe o que são esses arquivos nem onde estão, parece não haver sentido em saber os nomes, tamanhos e propriedades dos arquivos - que é tudo o que você conseguirá obter.
Se você está tentando interceptar alterações no sistema, por exemplo, ataques na web, então você será muito melhor atendido por tripwire
, e/ou algum utilitário de verificação de log, ou possivelmente Snort, ou pacotes de segurança especializados (por exemplo, para Wordpress). Ou você pode estar interessado famd
ou decidir ser proativo e implantar (e configurar e manter) AppArmor.
Se você procura responsabilidade, precisará modificar os scripts de upload, não importa o que aconteça. E você precisará fazer isso script por script se estiver executando várias estruturas de upload diferentes.
Se você deseja rastrear tráfego ou cotas, existemmaneiras muito melhores.
Mas basicamente,você não deveria se preocuparsobre arquivos carregados em seus sites hospedados,a menos que você tenha outros problemas no upstream. A preocupação com uploads de arquivos me faz suspeitar que o seu, como afirmado, é umProblema XY.
Se você ainda tem ideia de monitorar arquivoscriada(como dito antes,carregadoé muito restritivo), possivelmente a maneira mais simples é configurar um strace
processo,masdepende agora de como o PHP é chamado - é um módulo Apache, ou CGI, ou FPM? Para o módulo Apache, assumindo que o binário é chamado httpd
:
strace -f -p "$( pidof httpd )" -e open 2>&1 | grep -F -v ', O_RDONLY'
você vai 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
Responder3
Verificações de pontos
ambos os snapshots e rsync --dry-run são incrivelmente rápidos porque apenas criam/verificam inodes sem dados reais. Os instantâneos requerem um cow fs como zfs ou btrfs.
btrfs subvolume snapshot -r / /snapshots/$(date +%Y%m%d)
rsync -ad --dry-run /var/www /snapshots/20161103/var/www
Eventos instantâneos
traço
traçoe grep pode ser usado para registrar todas as alterações do arquivo php;
strace -e open php_pid 2>&1 | grep open >> log.txt
notificar
notificaré bom, mas pode ser pesado porque adiciona um watch para cada pasta.
inotifywatch -v -e modify,moved_to,create -r /var/www/
PHP
A combinação de php.ini,kit de execução,sobreporearquivo de acréscimo automáticopode ser usado para registrar eventos de arquivos, mas não pode impedir que as pessoas evitem intencionalmente o log. Você gostaria de desabilitar o exec e esperar que ninguém encontre a função renomeada;
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
preceder.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 é FLOSS você pode compilar seu próprio PHP personalizado, mas isso não é aconselhável antes de ter certeza absoluta de que todas as outras opções listadas são inadequadas.
Responder4
logstash / alce / kibabna...
Tenho certeza de que você conseguiria criar algum regex dos arquivos de log ...
você seria capaz de verificar uploads de php, uploads de webdav e combinar essas informações com mapas, horários e assim por diante ...
elegância na simplicidade... (não houve menção à necessidade de processamento ao vivo na pergunta postada, então presumo que você não precise executar nenhum script cada vez que um arquivo é carregado? você só deseja monitorar e manter um registo?)
se eu presumir errado, marque +1 no inotify