點檢查

點檢查

我想監視/追蹤使用 Web 伺服器上傳的所有檔案(主要使用 PHP/Apache,不使用 FTP 伺服器)。

我用 Google 搜索,發現唯一可能的方法是在 PHP 中為 move_uploaded_file 編寫一​​個鉤子。

如果我們可以在 PHP 中為 move_uploaded_file 編寫一​​個鉤子函數,那麼我們就可以將目標檔案路徑保存在一個位置。但是,我找不到解決方案來實現相同的目標。

有人可以建議我方法嗎?

編輯:網頁伺服器有數百個託管帳戶和數千個網站,因此不可能使用網頁應用程式控制它們,因為我們無法控制網頁應用程式。

答案1

你可以使用指令inotifywatch inotify-toolsDebian 上的內部包)使用 -r(遞歸)參數

例如:

inotifywatch -q -e moved_to,create -r /var/www/

答案2

我想監視/追蹤使用網路伺服器上傳的所有檔案(主要使用 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

點檢查

快照和 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');

C

由於 php 是 FLOSS,您可以編譯自己自訂的 PHP,但在絕對確保所有其他列出的選項不合適之前,這是不可取的。

答案4

Logstash / 麋鹿 / kibabna...

我很確定您能夠從日誌檔案中變出一些正規表示式...

您可以檢查 php 上傳、webdav 上傳,然後將此資訊與地圖、時間等結合起來...

簡單中的優雅...(在發布的問題中沒有提到需要實時處理,所以我假設您不需要每次上傳文件時運行任何腳本?您只想監視並保留一個日誌?)

如果我假設錯誤,那麼 inotify 上+1

相關內容