非 root 用户运行 Apache

非 root 用户运行 Apache

我正在接受工作审计,公司要求某些服务不能以 Linux 系统的 root 用户身份运行。Apache 以 root 用户身份启动第一个进程以绑定到端口 80(或 443),然后将其余进程生成为 www-data。有没有办法配置 apache 和 Ubuntu(14.04)以将第一个进程也作为 www-data 启动?

答案1

我不同意现有的答案(以及互联网上的一百个答案)。

可以以非 root 用户身份运行 Apache2。

但默认情况下情况并非如此,Ubuntu 附带的默认行为确实给您带来了麻烦。其所有脚本和配置都预期使用 root-then-drop-privileges 模型。

我只想解决通常被称为“绝对需要 root”的事情(上面和其他地方):

  • 端口 80暂时忘记你可能想在非特权端口上运行(有些人这样做,我曾经在 Nginx 后面像这样运行 Apache)...你可以仍然使用 Linux 功能框架以非 root 身份绑定低端口(自2.6.24);赋予 Apache 绑定到其喜欢的任何端口的权限,无论用户是谁:

    sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/apache2
    

    或者您可以使用 iptables 将端口 80 重定向到非特权端口。

  • 读取配置文件和证书默认情况下,任何用户都可以读取配置。如果您阻止www-data(或任何运行 Apache 的用户)读取配置或证书(您可以这样做),您将破坏服务器。

    有些人谈论初始 root 进程,好像它可以用来获取特权启动。事实并非如此。那将非常不安全。它只是编组非特权子进程。

事实是,你可以破坏一些东西来让这个工作正常进行。不要这样做。至少在你读完整篇文章之前不要这样做。

sudo setcap 'cap_net_bind_service=+ep' /usr/sbin/apache2
sudo /etc/init.d/apache2 stop
sudo chown -R www-data: /var/{log,run}/apache2/
sudo -u www-data apache2ctl start

现在你就完成了。像 一样运行www-dataApache 。

在此处输入图片描述

但我在生产中不会这样做。上面的代码没有初始化脚本,因此您需要替换或“修复”/etc/init.d/apache2以停止正在运行的 root-run 版本,并启动您的 www-data 版本。这不是一项小任务;看看脚本。

最重要的是,Apache 使用的权限降级模型已经经过实战检验。多年来。其他服务器也采用这种方式。这不是邪恶的

如果您的管理员对您正在运行的内容感到非常恼火,您有以下几种选择:

  • 在虚拟机中执行此操作(就像我测试这个答案时所做的那样)。lxc,,docker等等,等等。最小设置,可爱的轻巧干净,可以在外部作为“普通”用户运行,而在内部看起来像裸机。

  • 使用不需要 root 权限的 httpd。Apache 拥有一个完整的生态系统,它需要某些东西,所以它不是一个好的选择。但无论你选择哪一个,你都可能需要对抗它们的初始化脚本。

  • 如果您只需要非私有端口上的超基本内容,您可以运行:

    python -m SimpleHTTPServer 8000
    

答案2

简短答案

您无法以合理的方式让第一个主 Apache 进程以非 root 身份启动。这是因为主进程需要以超级用户身份运行,以便绑定到端口 80 (HTTP) 和 443 (HTTPS),并访问配置文件(默认情况下/etc/apache2/),这样工作者才知道他们应该做什么。

下面详细介绍了这一点,并且存储库中的许多 Web 服务器都有类似的设置类型(NGINX 也按照相同的基本原理运行)。



细节


Apache 主进程 - 访问配置文件并将工作进程绑定到 <= 1024 的端口:

Apache 的主进程需要以 身份运行root

这是因为其中的所有配置文件/etc/apache2/...通常都由 root 拥有,并且为了访问(某些)SSL 私有证书数据(/etc/ssl/private/...通常),它需要超级用户权限。

为了绑定到小于 1024 的端口(包括端口 80(HTTP)和 443(HTTPS),还需要管理访问权限,以便使用典型 HTTP / HTTPS 端口的 Web 服务器能够在这些端口上正常工作。

实际上,主进程所做的并不比这些多,它不处理来自客户端的实际请求,也不实际上与 Web 文档根目录等进行交互。


Apache 工作进程 - 它们处理来自 Web 浏览器的请求和响应:

Apache 的工作器实际上处理进入 Web 服务器的请求,并处理访问系统上的数据并将响应发送给客户端。我相信,这就是您的 IT 策略真正谈论以非 root 身份运行的地方。

此进程以www-data非管理员级帐户的身份运行,并且没有提升的权限。此时可以使用系统上的标准访问控制,这实际上就是“无法以 root 身份运行”限制所涵盖的内容 - 因为您不希望工作进程以 root/超级用户身份运行。


为什么我认为您与政策之间存在沟通不畅,或者为什么我认为您的 IT 政策需要重新审视,并且您应该与您环境中的 IT 人员进行沟通:

如果您的公司/工作场所声明“我们根本不能让 Apache 以 root 身份运行”,请咨询公司的 IT 人员。

这是“糟糕”或“误解”政策的原因在于,如果 Apache 无法分别绑定到端口 80 或 443,您就无法在您的域上使用http://somewebaddress.tldhttps://somewebaddress.tld。如果他们不希望主进程以 root 身份运行,那么您必须手动更改所有权/etc/apache2/*或为配置提供单独的数据目录,然后让所有 Apache 服务的站点监听高于 1024 的端口。

答案3

仅使用sudo配置的 Apache 控制脚本进行访问通常被认为是最佳实践。虽然不能完全消除开始时的瞬时“根”状态,但任何不理解这一点的安全审计员都不值得他们所获得的报酬。

在用户空间安装自定义版本的 Apache 也相当简单,将所有文件所有权设置为权限较低的用户,该用户仅通过 sudo 拥有受控的提升权限。

相关内容