![Nginx、www-data 以及对在同一父级下托管多个站点的担忧](https://linux22.com/image/703542/Nginx%E3%80%81www-data%20%E4%BB%A5%E5%8F%8A%E5%AF%B9%E5%9C%A8%E5%90%8C%E4%B8%80%E7%88%B6%E7%BA%A7%E4%B8%8B%E6%89%98%E7%AE%A1%E5%A4%9A%E4%B8%AA%E7%AB%99%E7%82%B9%E7%9A%84%E6%8B%85%E5%BF%A7.png)
我对我的 VPS 上的 Nginx 和 www-data 用户有疑问。
假设我有两个网站siteA
,它们siteB
位于一个共同的父文件夹下/var/www
。两个网站和父文件夹都有www-data
用户和组。如果siteA
受到攻击/黑客入侵,黑客是否能够访问文件siteB
?
我在另一篇文章中读到,为了防止这种情况,我应该让每个网站在其自己的用户和组下运行。我该如何使用 Nginx 实现这一点?
额外的:
siteA
是一个使用 php-fpm 的 WordPress 网站,并且siteB
将是一个 NodeJS 应用程序
答案1
首先值得注意的是,您询问的攻击类型(网站篡改)是一种相对不常见的攻击形式。黑客通常对窃取数据和/或劫持您的整个服务器更感兴趣。只需替换网站内容即可相对轻松地应对篡改。除非您有一个坚定的敌人,否则这通常会在您追踪导致篡改的漏洞时拖延您的时间。
也就是说,您描述的配置确实会比单独的站点引入更大的攻击面,并且您可以采取一些措施来减少这个攻击面。
您可以做的第一件事是使用标准 Linux 组和用户完全拒绝对所有静态网站内容和源代码的写入权限。您可以通过创建 www-admin 用户并将所有内容的权限分配给该用户来实现这一点。然后为程序和服务设置不同的用户(或多个用户)。常见的 Web 服务用户是用户 nobody,但 www 或 http 等特殊用途的用户也可以工作。将静态内容和源代码放在它们自己的目录中,由 www-admin 拥有,目录权限为 755,文件权限为 644。这将阻止对您网站的任何更改经过受感染的 Web 服务或应用程序。如果出于方便的原因,您可以根据需要通过组对此进行进一步微调,但出于安全考虑,此所有权设置将保护您的文件免受基于 Web 的篡改,并且易于实施和维护。
默认情况下,nginx 不接受 http TRACE、DELETE 或 PUT 请求。不过,最好对此进行测试:
curl -v -X TRACE "http://www.example.com"
curl -v -X DELETE "http://www.example.com/dummy-page.html"
echo evil > ./test4evil.txt
curl -v -X PUT "http://www.example.com" -F "file=./test4evil.txt"
您应该会得到这些测试的 405(不允许)响应。
如果您希望网站访问者能够上传内容,请为此创建特殊的用户内容专用目录,并将这些目录的写入权限严格分配给执行上传的应用程序或服务。严格来说,我的意思是避免向不需要写入该目录的用户或组授予写入权限。
所有这些仅针对磁盘上的文件。由于您的网站会动态生成内容,因此您还应确保解决 php 注入、sql 注入和其他与动态内容相关的潜在漏洞。但是,这是一个不同的主题,这里的问题只是如何防止更改磁盘上的文件。