簡體   English   中英

阻止Apache / PHP運行影響另一個vHost的代碼

[英]Prevent Apache/PHP from running code that affects another vHost

情況

我的/var/www/目錄中有多個文件夾。

創建的用戶可以控制特定目錄... /var/www/app1屬於app1:app1www-dataapp1組的成員)。

這對我想要的工作正常。

問題

如果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/app2rm -rf /var/www/app2等,這顯然不好。

問題

如何避免Apache進程的這種交叉污染 我可以指示Apache只運行影響相關vHost根目錄及以下目錄中的文件/文件夾的PHP腳本嗎?

您應該在每個站點的vhost文件中添加一個open_basedir指令。 open_basedir指令限制站點可以訪問的目錄。

您可以在此處閱讀更多有關open_basedir的信息

盡管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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM