犹豫了很久之后,我最终订购了一个小型 VPS 供自己使用,主要是用于网络托管(我和朋友的几个网站),以及其他用途(mumble 服务器托管、wave 服务器等)。它本质上是一个基本的 LAMP 盒子。
我想为几个朋友提供一些托管空间,并允许他们对其进行调整。这意味着他们将需要自己的 FTP 访问权限,也许还需要 SSH(如果足够安全的话)。
我在 LAMP 设置/管理方面有一些经验,但在一般服务器管理(用户设置、ftp 等)方面经验不多。这就是为什么我想从基础开始,构建一些可靠且安全的东西。
用户管理
我的每个朋友在系统上都会有自己的用户,但是有什么特别的办法吗?我是否应该为每个用户创建一个组,还是他们都共享同一个组?我想只有当我允许他们通过 SSH 登录时,这种情况才会改变,但稍后我会详细介绍。
虚拟主机
我首先担心的是共享网络托管。即使我不会托管敏感数据,我也不希望用户乱动他人的文件。在使用 PHP/CGI 和 Apache 之前suexec
,我解决了这个问题,但在阅读Stuart Herbert 关于网络平台的精彩文章,我想去mpm-itk
。你对此有什么反馈吗?
由于我的目标用户有点怪异,所以我考虑让他们自己调整 php.ini。你觉得怎么样?这样做会不会有潜在的安全威胁?
例如,他们可以大幅增加内存限制并影响其他用户,但我不认为这会是个问题。
FTP
如果没有 FTP 访问权限,部署网站会很困难,对吧?我读了很多 pureftpd 教程,它们都解释了如何创建虚拟用户。但这对我来说并不适用,对吧?我只是想让用户通过 ftp 登录,将他们 chroot 到他们的主目录,就这样。还有其他方法吗(除了禁用通过 ftp 的 root 访问权限)?
SSH
这是我的主要问题。作为用户,我总是喜欢能够通过 SSH 连接到我的帐户,只需执行一些批处理操作,或直接在服务器上提取存档,而不必通过 FTP 上传每个单独的文件。但是,我不希望我的用户能够浏览整个文件系统等。我不太熟悉 SSH 配置,那么有没有办法允许用户连接并将他们“chroot”到他们的家中?
其他想法
我已经在调整自己的设置了,但我真的希望得到这里所有明智的专家的意见,告诉我如何做正确的事情,如何避免新手犯的错误。我的 VPS 管理界面上有一个易于按下的“操作系统重置”按钮,但我不想在我托管的所有网站上看到“H@ked by th3 H4xx00r5”消息后经常点击它。
答案1
我通过 SFTP、SCP 或在服务器上编辑(或通过我使用的 CMS)来部署我的所有 Web 内容。FTP、本身,应该不需要。
第二 - 如果您拥有正确的用户和组权限,他们将无法通过命令行浏览其他人的网站。
当然,应该允许通过 SSH 登录,原因正如您所说。
我个人不会让人们“调整”他们自己的 php.ini 文件 - 我不会以与您类似的方式在我运行的 VPS 上这样做(即为自己和朋友托管一些网站)。这是您的服务器,您是允许其他人使用它的人:所以让他们按照您的规则使用它。我想不出我见过的共享托管提供商允许人们调整他们的 php.ini 设置。
但到了某个时候,归根结底还是要相信你的朋友不是互相做一些卑鄙/愚蠢/残忍的事情。
如果您不信任他们 - 我就不会允许他们在 CMS 之外进行访问。
例如,我这样设置不同用户的 Web 根目录:
drwxr-x--- <user> apache
这允许 Apache 查看服务器内容,但只有用户可以进行更改。
答案2
我已经运营主机很多年了。这段时间我发现,如果你允许用户运行 CGI 脚本,那么几乎就“万事皆空”。他们不可能总是做出意想不到的事情,但你以后很可能会因为允许这样做而感到痛苦。
首先,你大大增加了安全漏洞的几率。我曾让用户安装 phpBB(在我的 suexec 包装器下),然后从不升级它……我曾让别人自己编写 CGI 脚本,而这些脚本是潜在的安全漏洞——只是因为缺乏普及才阻止了它。
我将每个用户放在他们自己的组中。当我为某个目的创建用户时(例如 MUD,当时 MUD 很流行),这很有用,然后 MUD 的所有者可以使用组权限调整文件。
无论如何,如果你愿意提供帮助,愿意花时间确保人们不会做坏事,大部分事情都很容易。在我看来,只是浪费了做更好事情的时间。
答案3
我会使用 PHP-FPM 和 nginx,这是我使用大约 20 个 PHP 专用服务器的方式,这样您就可以实现您的两个目标,PHP 将在“池”定义的用户下运行,并且您的用户可以调整他们的 php.ini(尽管在他们的文档根目录中它将被称为 .user.ini),而无需配置 suexec 的麻烦。 https://www.vultr.com/docs/use-php-fpm-pools-to-secure-multiple-web-sites
如果您决定使用 Apache HTTPD 运行 PHP-FPM,我建议使用 mpm 或事件工作者,而不是默认的 prefork 工作者。 https://www.digitalocean.com/community/tutorials/how-to-configure-apache-http-with-mpm-event-and-php-fpm-on-ubuntu-18-04
但是,PHP-FPM 仅适用于 PHP,如果您的用户想要执行其他 CGI,您将必须同样配置 suexec。
我会尽量避免使用 FTP,而选择 FTPS 或更好的 SFTP(如果您有 SSH,它已经安装好了)。
使用 SFTP,你可以通过组匹配或直接用户匹配将用户 chroot 到他们的主目录,你可以强制你的用户使用 RSA 密钥而不是密码(更安全),只需调整你的 sshd_config,https://www.tecmint.com/restrict-ssh-user-to-directory-using-chrooted-jail/
甚至,通过 chrooting,您可以决定您的用户是否应该具有 SSH 访问权限或仅具有 SFTP 访问权限。
最后,请允许我分享一下我的老系统管理员在教我时与我分享的智慧(用塞缪尔·杰克逊的声音读出):
your users are your enemy,
they will put crap on your server,
they will fill it to the brim,
they will use every watt of power it has,
they will try to access what they shouldn't,
you are ultimately responsible for your server
and what they do with it.
当然,如果您分享更多细节,例如服务器上使用的操作系统,我们可以提供更多帮助,因为这些设置位于大多数发行版的不同位置。