Como rastrear os nomes dos arquivos enviados em servidores Linux?

0

Eu quero monitorar / acompanhar todos os arquivos enviados usando o servidor web (principalmente usando PHP / Apache e NÃO usando o servidor FTP).

Eu pesquisei no Google e descobri que, só é possível escrever um hook para move_uploaded_file no PHP.

Se podemos escrever uma função hook para move_uploaded_file no PHP, então podemos salvar o caminho do arquivo de destino em um local. Mas não há solução que eu possa encontrar para alcançar o mesmo.

alguém pode me sugerir uma maneira de fazer isso?

Edit: O servidor web tem 100s de conta de hospedagem e milhares de sites, portanto, controlá-los usando o aplicativo da web não é possível, já que não temos controle sobre o aplicativo da web.

    
por Mani 01.11.2016 / 06:56

4 respostas

1

Você pode usar o comando inotifywatch (dentro do pacote inotify-tools no Debian) com o parâmetro -r (recursivo)

por exemplo:

inotifywatch -q -e moved_to,create -r /var/www/
    
por 07.11.2016 / 14:38
1

I want to monitor/keep track of all the files uploaded using web server (mainly using PHP/Apache

Não existe um caminho fácil . Você pode encontrar todos os arquivos usando a função move_uploaded_file , mas isso só interceptará os uploads de arquivos POST. Uploads de AJAX como HTML5 / PLupload não serão reconhecidos.

A pergunta é, por que você deseja acompanhar "todos os arquivos enviados"? Como você nem sabe quais são esses arquivos nem onde eles 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ê seria muito melhor servido por tripwire e / ou algum utilitário de verificação de log, ou possivelmente Snort, ou pacotes de segurança especializados (por exemplo, para o Wordpress). Ou talvez você esteja interessado em famd ou decida ser proativo e implantar ( e configurar e manter ) o AppArmor.

Se for da responsabilidade que você procura, você precisará modificar os scripts de upload, não importa o quê. E você precisará fazer isso em uma base de script por script, se estiver executando várias estruturas de upload diferentes.

Se você deseja acompanhar o tráfego ou as cotas, há maneiras muito melhores .

Mas basicamente, você não precisa se preocupar sobre os arquivos enviados em seus sites hospedados, , a menos que você tenha outros problemas no envio de dados . Preocupar-se com o upload de arquivos me faz suspeitar que o seu, como dito, é um problema XY .

Se você ainda tem a ideia de monitorar arquivos criados (como dito antes, carregado é muito restritivo), possivelmente a maneira mais simples é configurar um strace process, mas depende agora de como o PHP é chamado - é um módulo do Apache, ou CGI, ou FPM? Para o módulo do Apache, supondo que o binário seja chamado de httpd :

strace -f -p "$( pidof httpd )" -e open 2>&1 | grep -F -v ', O_RDONLY'

vai te dar algo parecido,

[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
    
por 07.11.2016 / 22:39
1

Verificações de pontos

ambos os instantâneos e rsync --dry-run são incrivelmente rápidos porque eles apenas fazem / verificam inodes sem dados reais. Os instantâneos exigem uma vaca 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

strace

strace e o grep podem ser usados para registrar todas as mudanças no arquivo php;

strace -e open php_pid 2>&1 | grep open >> log.txt

inotify

inotify é bom, mas pode ser pesado, porque adiciona um relógio para cada pasta.

inotifywatch -v -e modify,moved_to,create -r /var/www/

PHP

A combinação do php.ini, runkit , override e auto- prefixar-arquivo pode ser usado para registrar eventos de arquivo, mas não pode impedir que as pessoas evitem intencionalmente o registro. Você desejaria desativar 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

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');

C

Como o php é FLOSS, você pode compilar seu próprio PHP personalizado, mas isso não é aconselhável antes de se certificar absolutamente de que todas as outras opções listadas sejam inadequadas.

    
por 03.11.2016 / 14:18
0

logstash / elk / kibabna ...

Tenho certeza de que você seria capaz de recuperar alguns regex dos arquivos de log ...

você poderá verificar se há uploads de php, uploads de webdav e, em seguida, combinar essas informações com mapas, horários e assim por diante ...

elegância na simplicidade ... (não houve menção de uma necessidade de processamento ao vivo na pergunta postada, então eu estou supondo que você não precisa executar nenhum script cada vez que um arquivo é carregado? você só quer monitorar e manter um registro?)

se eu assumir errado, então +1 em inotify

    
por 08.11.2016 / 23:47