Nginx中每个虚拟主机的用户


Answers:


7

否,因为Nginx配置中的所有服务器节均由同一组工作进程提供服务。此外,从安全的角度看,你要像运行它,因为它意味着内容是通过服务器自动不可写入的状态(没有愚蠢像一个chmod -R 0777),所以,如果有在nginx的漏洞,没有内容的处于危险之中。


2
因此,没有办法向其他用户隐藏用户的文件吗?www-data应该可以读取所有用户的内容吗?
Alex Netkachov 2012年

1
使文件不可访问www-data(或运行Web服务器的任何用户)都不需要文件可被系统上的其他用户访问。
womble

2
在设置虚拟主机时,为文档root 分配一组www-data权限和权限0710(因为需要root来配置nginx,因此自动化还设置必要的权限不是问题)。然后,docroot的内容只需要o+x用于目录和o+r文件。
womble

13
当心:如果PHP脚本(或cgi-bin进程)在下运行www-data,则可以提供PHP脚本或cgi-bin进程的每个用户都可以访问该www-data用户可访问的任何文件。config.php.inc对于在共享计算机上以类似方式存储数据库密码的任何人来说,这似乎都不是显而易见的。
IvanVučica2014年

2
@Ricalsin请记住,UNIX是一个多用户操作系统,服务器可以有多个用户。例如peterjohn。他们在中托管自己的网页~/public_html。缺少上面讨论此问题的任何人都没有提及的不同方法,.php脚本具有与Web服务器相同的权限,因为它也在.net下执行www-data。这意味着,就像Web服务器和PHP解释器一样,它可以读取任何其他.php脚本。
IvanVučica2014年

9

是。可能并建议使用它以提高安全性(请参阅下面的原因)。

考虑到您正在使用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仅是示例,但是任何流行的Web服务器语言都有类似的调用。作为黑客,您可以“ ls .. ”浏览所有网站,并可以“ cp / echo / mv ”在任何文件(包括另一个网站文件)中编写自己的代码。即使服务器上的所有网站都由同一人(例如您)拥有,也建议使用不同的用户来运行每个网站,因为这将阻止最终的黑客/病毒(例如Wordpress病毒)访问您的其他网站。


5

回应上述Ivan的评论,该评论似乎适用于OP。两件事情:

  1. 应用程序文档的根目录将类似于/blah/peterWeb/html/blah/johnWeb/html。NGINX和Apache2都不允许仔细阅读或在另一个目录中操作,即使它们都以组形式运行www-data。

  2. 将每个目录树置于他们自己的用户许可下将允许每个用户ssh / login到UNIX系统,并保持每个用户的目录私有-只是不要将每个用户都放入www-data组。如果您同意,那么您的句子是:

    每个可以提供PHP脚本或cgi-bin进程的用户都可以访问www-data用户可以访问的任何文件。

    可能更准确地写为:

    然后,您与apache / nginx服务器(www-data)放在同一组中的每个用户都可以在其可以访问的任何文件中进行任何想要的操作(包括运行php脚本)(这基本上就是网络上的所有内容)服务器)。

编辑1: 必须解决一些服务器管理问题,我进一步研究了本主题。我没有意识到伊万的信息有多准确!如果您打算让用户能够在共享主机配置上上载和运行脚本,请注意。这是一种方法。向Ivan表示感谢,以确保我了解此漏洞。


4
不,你想念它。PHP脚本在Apache的进程(或其他Web服务器)中执行时,将在托管进程特权下运行。在大量幼稚的设置中,该用户是www-data。如果Johnny可以创建一个脚本并使其运行www-data(可以在幼稚的设置下运行),那么Johnny的脚本可以读取Peter的脚本并将其发送回Johnny。这与群体无关。正确的解决方案是使用suPHP(如果天真的设置是不好的,因为编写得不好的代码会危害到该用户的所有文件),或者是坐牢,或者是每位用户专用的其他Web用户。
IvanVučica2014年

(此外,添加答案而不是评论是对StackOverflow类型站点的滥用,实际上您在提供答案就是
印象深刻

@IvanVučica更新并添加了支持您建议的有用链接。谢谢。
Ricalsin 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.