웹 서버(주로 FTP 서버가 아닌 PHP/Apache 사용)를 사용하여 업로드된 모든 파일을 모니터링/추적하고 싶습니다.
나는 인터넷 검색을 통해 가능한 유일한 방법은 PHP에서 move_uploaded_file에 대한 후크를 작성하는 것임을 발견했습니다.
PHP에서 move_uploaded_file에 대한 후크 함수를 작성할 수 있다면 대상 파일 경로를 한 위치에 저장할 수 있습니다. 그러나 동일한 목표를 달성하기 위한 해결책을 찾을 수 없습니다.
누군가 나에게 방법을 제안해 줄 수 있나요?
편집: 웹 서버에는 수백 개의 호스팅 계정과 수천 개의 웹사이트가 있으므로 웹 애플리케이션을 제어할 수 없기 때문에 웹 애플리케이션을 사용하여 이를 제어하는 것은 불가능합니다.
답변1
다음 명령을 사용할 수 있습니다.inotifywatch
( inotify-tools
Debian의 내부 패키지)-r
(재귀) 매개변수 사용
예를 들어:
inotifywatch -q -e moved_to,create -r /var/www/
답변2
웹 서버를 사용하여 업로드된 모든 파일을 모니터링/추적하고 싶습니다(주로 PHP/Apache 사용).
쉬운 방법은 없어. 이 기능을 사용하여 모든 파일을 찾을 수 있지만 move_uploaded_file
이는 POST 파일 업로드만 차단합니다. HTML5/PLupload와 같은 AJAX 업로드는 인식되지 않습니다.
문제는,왜"업로드된 모든 파일"을 추적하시겠습니까? 이러한 파일이 무엇인지, 어디에 있는지조차 모르기 때문에 파일 이름, 크기, 소유권을 아는 것이 무의미해 보일 수 있습니다. 이것이 바로 얻을 수 있는 정보의 전부입니다.
시스템 변경 사항(예: 웹 공격)을 가로채려는 경우 tripwire
및/또는 일부 로그 검색 유틸리티 또는 Snort 또는 특수 보안 패키지(예: WordPress용)를 사용하면 더 나은 서비스를 받을 수 있습니다. 아니면 관심이 있거나 famd
주도적으로 배포하기로 결정할 수도 있습니다(구성 및 유지 관리) 응용 갑옷.
책임을 져야 한다면 어쨌든 업로드 스크립트를 수정해야 합니다. 여러 개의 서로 다른 업로드 프레임워크를 실행하는 경우 스크립트별로 이 작업을 수행해야 합니다.
트래픽이나 할당량을 추적하려면 다음을 사용할 수 있습니다.더 좋은 방법.
하지만 기본적으로,걱정하지 않으셔도 됩니다호스팅 사이트에 업로드된 파일과 관련하여,업스트림에 다른 문제가 없다면. 파일 업로드에 대해 걱정하다 보니 귀하의 파일 업로드가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
검문소
snapshot과 rsync --dry-run 모두 실제 데이터 없이 inode만 만들고 확인하기 때문에 매우 빠릅니다. 스냅샷에는 zfs 또는 btrfs와 같은 멋진 fs가 필요합니다.
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
접두어.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 업로드를 확인하고 이 정보를 지도, 시간 등과 결합할 수 있습니다.
단순함의 우아함... (게시된 질문에는 실시간 처리의 필요성에 대한 언급이 없으므로 파일이 업로드될 때마다 스크립트를 실행할 필요가 없다고 가정합니까? 모니터링하고 유지하기만 하면 됩니다. 로그?)
내가 틀렸다고 가정하면 inotify에 +1