웹 서버(주로 PHP/Apache를 사용하고 FTP 서버를 사용하지 않음)를 사용하여 업로드된 모든 파일을 모니터링/추적하고 싶습니다.
나는 인터넷 검색을 통해 PHP에서 move_uploaded_file에 대한 후크를 작성하는 것이 유일한 방법임을 발견했습니다.
PHP에서 move_uploaded_file에 대한 후크 함수를 작성할 수 있다면 대상 파일 경로를 한 위치에 저장할 수 있습니다. 그러나 동일한 결과를 얻을 수 있는 해결책은 없습니다.
누군가 나에게 그 방법을 제안해 줄 수 있나요?
편집: 웹 서버에는 100개의 호스팅 계정과 1000개의 웹사이트가 있으므로 웹 애플리케이션을 사용하여 이를 제어하는 것은 불가능합니다. 우리는 웹 애플리케이션을 제어할 수 없기 때문입니다.
답변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
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 업로드를 확인한 다음 이 정보를 지도, 시간 등과 결합할 수 있습니다.
단순함 속의 우아함... (게시된 질문에는 실시간 처리가 필요하다는 언급이 없었기 때문에 파일이 업로드될 때마다 스크립트를 실행할 필요가 없다고 가정합니까? 모니터링하고 유지하기만 하면 됩니다. 로그?)
내가 틀렸다고 가정하면 inotify에 +1