我正在接受工作审计,公司要求某些服务不能以 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-data
Apache 。
但我在生产中不会这样做。上面的代码没有初始化脚本,因此您需要替换或“修复”/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.tld
或https://somewebaddress.tld
。如果他们不希望主进程以 root 身份运行,那么您必须手动更改所有权/etc/apache2/*
或为配置提供单独的数据目录,然后让所有 Apache 服务的站点监听高于 1024 的端口。
答案3
仅使用sudo
配置的 Apache 控制脚本进行访问通常被认为是最佳实践。虽然不能完全消除开始时的瞬时“根”状态,但任何不理解这一点的安全审计员都不值得他们所获得的报酬。
在用户空间安装自定义版本的 Apache 也相当简单,将所有文件所有权设置为权限较低的用户,该用户仅通过 sudo 拥有受控的提升权限。