我想在 VPS(LAMP 堆栈 - Ubuntu 20.04 LTS)上托管多个网站。出于安全原因,我想将每个网站/虚拟主机彼此正确隔离,并防止访问其他/系统文件。这将减轻网站访问者利用一个网站的漏洞操纵其他网站的文件或访问系统上的任意文件的风险。
- 防止访问其他/系统文件:
- 阿帕奇:每个网站的虚拟主机配置文件中指定的指令
DocumentRoot
设置了 Apache 可以提供文件的目录[1]。这足以阻止 Apache 访问 之外的文件DocumentRoot
(例如/var/www/site1
)吗/var/www/site2
?因为从技术上讲,Apache 用户(www-data)也具有对系统上其他文件的读取权限。但我猜这是两件不同的事情?意思是,Apache 的编程方式是只向网站访问者提供来自指定目录的文件,而 Apache 本身不会提供任何其他文件,即使它具有访问/读取系统上其他文件所需的权限www-data
? - PHP的:该
open_basedir
指令将 PHP 可以访问的文件限制在指定的目录树中[2]/var/www/site1
。在网站 1 的 vhost 配置文件中(分别在网站 2 的 vhost 文件中等)设置此指令是否足以/var/www/site2
阻止 PHP 访问这些指定目录之外的任何文件?此外,如果我以这种方式限制 PHP 对文件的访问,我是否还需要指定网站根目录以外的目录才能使 PHP 正常工作?
- 阿帕奇:每个网站的虚拟主机配置文件中指定的指令
- 防止网站之间互相访问:
- 阿帕奇:是否可以为每个网站创建独立的 Apache 进程/用户?当我进行研究时,所有虚拟主机都使用同一个 Apache 用户。这是否意味着网站彼此隔离,Apache 不需要分开?
- PHP的:据我所知,每个网站都可以使用单独的 PHP-FPM 池,以完全将它们彼此隔离(隔离的 PHP 环境)。这样对吗?我是否还需要为每个网站创建文件夹来存储各自的 PHP 会话数据?或者 PHP 会话数据默认是隔离的,即每个网站独有的(每个域和子域独有的)?我不希望出现两个网站共享相同会话数据的情况。例如,如果我有两个子域
sub1.example.com
,sub2.example.com
并且两个站点都安装了 WordPress,我不希望在 sub1 上登录的用户也自动登录 sub2。
如果有人能告诉我这些措施是否足以安全地隔离一台服务器上托管的多个网站,我将不胜感激 - 如果不能,请指出我遗漏的内容。
最后,我想所有网站都使用同一个 MariaDB 数据库服务器可以吗?对于每个网站,我都会创建一个数据库和一个相应的数据库用户。
提前感谢您的任何回复!
答案1
2022 年,Docker 几乎可以实现完美的隔离。说真的,我不会再尝试其他任何东西了。每个人都走这条路,你会发现广泛的社区和商业支持。
例如,有一个已经安装了 Wordpress 的 Docker 镜像,它是由 Wordpress 开发人员制作的,因此您可以直接使用它,而不必费心配置 PHP 和 Apache。
除此之外,您还需要一个反向代理,它可以检测对不同网站的请求并将其定向到不同的容器。
我不希望在 sub1 上登录的用户也自动在 sub2 上登录。
这是完全不同的问题。它不依赖于从操作系统角度隔离进程,而是依赖于浏览器发送 cookie 时的行为(例如将哪些 cookie 发送到哪里)。我建议询问这部分网站管理员。