在linux系統上,apache是以www-data(預設)使用者運行的,同時其使用者群組也是www-data。
可是我發現apache的日誌目錄/var/log/apache是屬於root的,群組是adm
www-data對該日誌目錄是沒有寫權限的,而且它不是adm群組的用戶,甚至連讀取權限都沒有。
但是我們發現有一個apache2進程是以root運行的,應該是主進程。難道所有子進程的日誌都是先透過進程通訊傳遞給主進程,然後再記錄的嗎?還是說有其他什麼機制。
走同样的路,发现不同的人生
我這裡沒有 Apache httpd,所以我自己寫程式試了試。在 write 时是不检查权限的,也就是说只要日志文件打开成功了,那么再改变用户 ID(setuid)之後依舊可以寫入資料到該文件。當然這樣子的話,如何重新開啟日誌檔是個問題。你直接去看 Apache httpd 的源碼就好。簡單地 strace 一下也許會有發現。
write
setuid
我這裡沒有 Apache httpd,所以我自己寫程式試了試。在
write
时是不检查权限的,也就是说只要日志文件打开成功了,那么再改变用户 ID(setuid
)之後依舊可以寫入資料到該文件。當然這樣子的話,如何重新開啟日誌檔是個問題。你直接去看 Apache httpd 的源碼就好。簡單地 strace 一下也許會有發現。