一般来说,什么时候应该创建一个新的用户帐户来在服务器上运行面向互联网的软件?
例如,假设我正在使用共享的 Debian 服务器(例如通过 Dreamhost),并且我想使用 WordPress 运行一些网站,使用 Redmine 运行一些网站,使用 Ruby on Rails 运行一些网站,也许使用 Django 运行一些网站,并且我也想提供 Mercurial 存储库。
在 Dreamhost 服务器和许多其他类似设置的服务器上,这一切都可以完成单一用户帐户,但我发现这种方法也有一些缺点:
- 更长的 .bashrc
- 如果一个帐户被盗用,则该帐户下运行的所有网站也会被盗用。
另一方面,拥有大量用户帐户可能会变得有点难以跟踪,尤其是当其中一些用户在安装软件方面有相同的要求时。例如,为每个运行 WordPress 的网站设置一个帐户可能有点过分。
最佳做法是什么?这仅仅是根据用户的偏执程度按比例减少每个用户帐户托管的网站(或托管存储库等)数量的问题吗?
请发表您对此的看法并说明理由。
此外,如果您有任何理由认为私人服务器或 VPS 上采用的方法应该与共享服务器上采用的方法不同,请概述它们是什么,并再次说明您的理由。
答案1
我通常喜欢“一个用户负责打开网络上的监听套接字的任何事情”——一个用户负责 Apache,一个用户负责邮件,一个用户负责 DNS 等等。
这(据我所知)仍然是当前的最佳做法,其背后的原因很简单,就是偏执:这些服务暴露在 Big Bad Internet 中,如果有人在我有机会修补软件之前发现漏洞并加以利用,至少我会将它们限制在一个用户帐户中,并且只具有运行其负责的单个服务所需的权限。一般来说,
我认为这种隔离级别足以保护系统,尽管每个应用程序都是一个漏洞孤岛(例如,如果有人安装了一个易受攻击的 WordPress 插件全部Apache 可以访问的内容(即所有网站)一旦受到攻击,实际上很容易受到攻击。
因此,可以对该论点的扩展版本进行改进,即使用自己的 Apache 配置和用户对共享主机客户端的网站进行沙盒处理(您不必为每个网站安装完整的 Web 堆栈,只需安装单独的 Apache 配置并指定不同的用户),缺点是每个网站现在都运行着一堆 Apache 进程,因此您的 RAM 使用量会大幅增加,如果任何单个 Apache 实例/用户受到损害,那么全世界可读的内容仍然容易受到攻击。
进一步扩展将每个 Apache 置于 chroot(或 BSD 系统上的 jail)中的论点可以提高安全性,但现在您谈论的是额外的磁盘空间,因为每个 chroot/jail 都需要运行其包含的站点所需的所有软件(并且需要为每个站点更新此软件,而不是在补丁发布时仅在服务器上更新一个主副本),再加上 RAM 要求,就像您有单独的用户/apache 实例时一样。
这可以缓解除了 OS/Kernel 错误之外的所有问题,该错误允许用户摆脱 chroot(这成为在单独的物理服务器上运行每个站点的论据 - 然后成为将站点划分为不同的 vlan/子网等的论据)
与所有风险一样,您无法消除它:您只能根据入侵的潜在危害/成本、入侵的可能性以及每个级别的缓解成本将其降低到可接受的水平。
在我看来,对于非关键、非电子商务共享托管环境,基本的“一个用户使用 Apache,一个用户使用 DNS,一个用户使用邮件等”安全网就足够了。如果需要超出该级别的安全性,您的用户应该认真考虑自己的硬件。
答案2
通常我会为面向外部的服务设置一个不允许登录的用户(例如“nobody”)和一个允许登录并使用 su 或 sudo 的帐户。当然,请确保您的用户名不同且不容易猜到。
我认为没有必要为每项服务设置一个用户,除非您运行的是共享托管环境,其中每个客户都有一个登录名。如果您确实认为自己是黑客攻击的热门目标,那么最好尽可能地隔离。但是,除非您正在做一些非常有争议的事情或托管财务数据,否则您实际上并不是那么有吸引力。