Webサーバー(主にFTPサーバーではなくPHP / Apacheを使用)を使用してアップロードされたすべてのファイルを監視/追跡したいと思います。
私はインターネット検索で可能な唯一の方法は、PHPでmove_uploaded_fileのフックを書くことであることがわかりました。
PHP で move_uploaded_file のフック関数を作成できる場合は、ターゲットファイルパスを 1 つの場所に保存できます。ただし、同じ目標を達成するための解決策が見つかりません。
誰かが私に方法を提案できますか?
編集:Webサーバーには何百ものホスティングアカウントと何千ものWebサイトがあるため、Webアプリケーションを制御できないため、Webアプリケーションを使用してそれらを制御することは不可能です。
答え1
次のコマンドを使用できます。inotifywatch
( inotify-tools
Debian の内部パッケージ)-r
(再帰)パラメータの使用
たとえば、
inotifywatch -q -e moved_to,create -r /var/www/
答え2
Webサーバーを使用してアップロードされたすべてのファイルを監視/追跡したい(主にPHP / Apacheを使用)。
簡単な方法はありません。。この機能を使用してすべてのファイルを見つけることができますが、move_uploaded_file
これはPOSTファイルのアップロードのみをブロックします。 HTML5 / PLuploadなどのAJAXアップロードは認識されません。
問題は、なぜ「アップロードされたすべてのファイル」を追跡しますか?これらのファイルが何であるか、どこにあるのかわからないので、ファイル名、サイズ、所有権を知ることは無意味に見えるかもしれません。これがすぐに得られる情報のすべてです。
システムの変更(Web攻撃など)を傍受したい場合、および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