Web サーバー (主に PHP/Apache を使用し、FTP サーバーは使用しない) を使用してアップロードされたすべてのファイルを監視/追跡したいと考えています。
Google で検索してみたところ、唯一の方法は 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
ウェブサーバー(主にPHP/Apacheを使用)を使用してアップロードされたすべてのファイルを監視/追跡したい
簡単な方法はない関数を使用してすべてのファイルを見つけることができますmove_uploaded_file
が、これは POST ファイルのアップロードのみをインターセプトします。HTML5/PLupload などの AJAX アップロードは認識されません。
質問は、なぜ「アップロードされたすべてのファイル」を追跡しますか? それらのファイルが何であるか、またどこにあるかさえわからないので、ファイル名、サイズ、所有権を知ってもあまり意味がないようです。これらが取得できる情報すべてです。
システムの変更、例えばウェブ攻撃を阻止しようとしている場合は、tripwire
やログスキャンユーティリティ、あるいは Snort、あるいは特殊なセキュリティパッケージ(Wordpress 用など)を利用する方がはるかに効果的です。あるいは、 に興味があるかもしれませんfamd
し、積極的に を導入することを決めるかもしれません(構成、保守) AppArmor。
説明責任が目的であれば、アップロード スクリプトを必ず変更する必要があります。また、複数の異なるアップロード フレームワークを実行している場合は、スクリプトごとに変更する必要があります。
トラフィックやクォータを追跡したい場合は、より良い方法。
しかし基本的には、心配する必要はないホストされているウェブサイトにアップロードされたファイルについて上流に他の問題がない限りファイルのアップロードを心配すると、あなたのものは、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
ポイントチェック
スナップショットと rsync --dry-run はどちらも、実際のデータではなく inode の作成とチェックのみを行うため、非常に高速です。スナップショットには、zfs や btrfs などの cow 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
通知
通知便利ですが、フォルダごとにウォッチを追加するため、重くなる可能性があります。
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');
C
php は FLOSS なので、独自にカスタマイズした PHP をコンパイルすることもできますが、リストされている他のすべてのオプションが不適切であることを完全に確認するまでは、この方法はお勧めできません。
答え4
ログスタッシュ / エルク / キバブナ...
ログ ファイルから何らかの正規表現を魔法のように作成できると確信しています...
PHP アップロード、WebDAV アップロードをチェックし、この情報をマップ、時間などと組み合わせることができます...
シンプルさの中に優雅さが... (投稿された質問にはライブ処理の必要性については何も言及されていなかったので、ファイルがアップロードされるたびにスクリプトを実行する必要はないと想定しています。監視してログを保持したいだけでしょうか?)
もし私の推測が間違っているなら、inotify に +1 します