Security

Nginx 中每個虛擬主機的使用者

  • February 1, 2022

是否可以在 nginx 中為每個虛擬主機配置不同的使用者?

就像是

server {
    user myprojectuser myprojectgroup;
    ...
}

不,因為 nginx 配置中的所有伺服器節都由同一組工作程序提供服務。此外,從安全的角度來看,您最好這樣執行它,因為這意味著網路伺服器自動無法寫入內容(沒有像 a 這樣的愚蠢行為chmod -R 0777),因此如果 nginx 中存在漏洞,則沒有內容有風險。

是的。它是可能的,並建議額外的安全性(請參閱下面的原因)。

考慮到您正在使用 PHP-FPM(您可能是,因為它是最常見的),您可以為每個域創建一個由不同使用者擁有的假離線。

***PS:***我在這裡寫了一個詳細的分步教程:

https://learnwithdaniel.com/2019/06/user-per-virtual-host-nginx/

1. 創建線軸:

將線軸添加到每個新線軸/etc/php/7.0/fpm/pool.d/www.conf或為每個新線軸創建一個新.conf文件。

線軸 #1 (myuser1):

[myprojectuser1]
user = myuser1
group = myprojectgroup
..
listen = /run/php/myuser1.sock
...  
listen.owner = www-data
listen.group = www-data

假離線 #2 (myuser2):

[myprojectuser2]
user = myuser2
group = myprojectgroup
..
listen = /run/php/myuser2.sock
...  
listen.owner = www-data
listen.group = www-data

PS:將您的 listen.owner/listen.group 保留給同一個 nginx 使用者(通常是www-data)。

2. 將每個假離線分配給它的伺服器塊(apache 使用者的虛擬主機):

主機1:

server {
 ...
 location ~ \.php$ {
   fastcgi_pass unix:/run/php/myuser1.sock;
 }
 ...
}

主持人2:

server {
 ...
 location ~ \.php$ {
   fastcgi_pass unix:/run/php/myuser2.sock;
 }
 ...
}

重啟 FPM 和 NGINX 服務

sudo /etc/init.d/php7.0-fpm restart
sudo service nginx restart

測試:

創建將顯示目前程序使用者的pinfo.php(或任何名稱)文件:

<?php 
echo str_replace("\n", '<br>', shell_exec('ps -u -p '.getmypid()));

或者通過 bash創建pinfo.php文件:

echo "<?php echo str_replace(\"\\n\", '<br>', shell_exec('ps -u -p '.getmypid()));" > pinfo.php

然後在瀏覽器上打開“ http://…/pinfo.php ”。


為什麼要使用多個使用者(安全原因):

如果您在同一使用者 ( www-data ) 下執行所有網站,則對 system()/passthru()/exec() 的 PHP 呼叫將可以訪問所有網站!**NGINX 不會保護您免受這種情況的影響。**PHP 只是一個例子,但任何流行的網路伺服器語言都有類似的呼叫。作為黑客,您可以“ ls .. ”瀏覽所有網站,“ cp/echo/mv ”可以在任何文件(包括其他網站文件)中編寫自己的程式碼。即使伺服器上的所有網站都歸同一個人(例如您)所有,建議使用不同的使用者執行每個網站,因為這樣可以防止最終的黑客/病毒(例如 Wordpress 病毒)訪問您的其他網站。

引用自:https://serverfault.com/questions/370820