Security
如何限制對 daemon 使用者的 root 訪問?
我在最新的 Debian 上安裝了 Apache 2.4 和 PHP 5.5.14。根據 Apache 安全提示和技巧,我將 httpd.conf 設置為:
<Directory /> AllowOverride none Require all denied </Directory> <Directory "/var/www"> Options FollowSymLinks AllowOverride none Require all granted </Directory>
我重新啟動 Apache 伺服器並執行此 PHP 程式碼:
<?php $filename = "/etc/passwd"; $handle = fopen($filename, "r"); $contents = fread($handle, filesize($filename)); fclose($handle); echo($contents); ?>
該程式碼獲取整個 /etc/passwd 文件,我認為這是一個巨大的安全問題。現在,幾天來我一直試圖通過閱讀手冊來解決這個問題,但我還沒有運氣。我會向正確的方向推進,thanx。
但請注意,這
open_basedir
只會限制 PHP 函式等的目錄訪問,但不會限制通過 PHP 執行的外部程序。例如:<?php $file = shell_exec('cat /etc/passwd'); echo $file;
將
/etc/passwd
毫無問題地輸出文件的內容,因為文件系統訪問不是由 PHP 本身而是由cat
程序呼叫的。cat
預設情況下由www-data
使用者執行(在 Debian 上),因此此處僅適用正常的作業系統文件訪問權限(即文件所有者、組和世界的訪問權限)。為了防止這種情況,您可以
- 禁用諸如
exec()
,passthru()
,之類的函式system()
,這些函式通過您的,shell_exec()
執行 shell 命令disable_functions
php.ini
- 更改文件的權限,因此執行網路伺服器(或 PHP)的使用者沒有讀取文件的權限或
- 將 Apache 或 PHP 放入 chroot 監獄(儘管我自己從未嘗試過)。
根據您的 Apache/PHP 配置和您的需求,這
disable_functions
可能是最容易設置的,但它可能會破壞 ImageMagick 之類的東西,這通常是exec()
(比如exec('/usr/bin/convert ...')
ImageMagick)。我在 Debian Squeeze 上使用 Apache 和 PHP 作為來自儲存庫的 mod_php 以及通過 php-fpm 執行 Apache 和 PHP 的 Ubuntu 14.04 以及來自儲存庫的包進行了測試。可能這也適用於 Windows 上的 PHP,但我從未嘗試過……雖然
cat /etc/passwd
不會工作:-)