[英]Prevent Apache/PHP from running code that affects another vHost
情況
我的/var/www/
目錄中有多個文件夾。
創建的用戶可以控制特定目錄... /var/www/app1
屬於app1:app1
( www-data
是app1
組的成員)。
這對我想要的工作正常。
問題
如果app1
用戶上傳了一個PHP腳本,該腳本更改了app2
目錄結構中某些內容的文件/文件夾權限,那么Apache進程(因為服務器上僅安裝了一個進程)將很樂意運行它,因為它具有必要的功能訪問/var/www/app1
和 /var/www/app2
文件夾和文件的權限。
編輯 :
據我所知,類似/var/www/app1/includes/hack.php
:
<?php
chmod("/var/www/app2", 777);
?>
Apache進程(由www-data
擁有)將運行此進程,因為它有權更改/var/www/app1
和/var/www/app2
目錄。 然后,用戶app1
將能夠cd /var/www/app2
, rm -rf /var/www/app2
等,這顯然不好。
問題
如何避免Apache進程的這種交叉污染 ? 我可以指示Apache只運行影響相關vHost根目錄及以下目錄中的文件/文件夾的PHP腳本嗎?
盡管open_basedir會有所幫助,但有幾種方法可以繞過此約束。 雖然您可以破壞php中的許多功能以關閉所有后門,但更好的解決方案是停止以具有訪問所有文件權限的用戶身份執行php。 為此,您需要為每個虛擬主機使用php-fpm和單獨的進程池/ uid / gid。
您應該仍然擁有一個獨立的uid,用於php執行,而擁有文件的uid和一個公共組的uid允許對文件進行默認的只讀訪問。
您還需要具有用於會話數據的單獨的存儲目錄。
一種更精細的機制是在每個容器的所有者前面使用Apache流量服務器之類的東西,每個站點都在其自己的Apache實例上運行-更好的隔離性,但在技術上要求較高,並且會占用更多資源。
請記住,如果您使用的是mariadb或類似文件,則DBMS也可以讀寫任意文件(SELECT INTO OUTFILE ... / LOAD DATA INFILE)
更新
通過將php-fpm uid appX的主目錄設置為vhost的基本目錄(而不應該包含document_root-參見下文),而不是維護單獨的容器,而是可以用更少的精力來實現更好的隔離。並使用apparmor限制對常見文件(例如.so libs)和@ {HOME}的訪問。 因此,每個/ var / www / appX可能包含:
.htaccess
.user.ini
data/ (writeable by fpm-appX)
html/ (the document root)
include/
sessions/ (writeable by fpm-appX)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.