我正在接受工作审核,公司要求某些服务不能作为 Linux 系统的 root 用户运行。Apache 以 root 用户身份启动第一个进程以绑定到端口 80(或 443),然后将其余进程生成为 www-data。有没有办法将 apache 和 Ubuntu (14.04) 也配置为 www-data 启动第一个进程?
Oli*_*Oli 18
我不同意现有的答案(以及互联网上的一百个答案)。
这不是默认情况下的情况,而是 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
Run Code Online (Sandbox Code Playgroud)
或者您可以使用 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
Run Code Online (Sandbox Code Playgroud)
你就在那里。像坏蛋一样运行 Apache www-data。
但我不会在生产中这样做。我上面的代码没有初始化脚本,因此您需要替换或“修复”/etc/init.d/apache2以停止正在运行的 root 运行版本,并启动您的 www-data 版本。这不是一件小事。看剧本。
最重要的是,Apache 一直使用的权限降级模型经过了实战测试。多年。其他服务器也是这样做的。这不是邪恶的。
如果您的管理员对您正在运行的内容感到非常紧张,您有几个选择:
在 VM 中执行此操作(就像我为测试此答案所做的那样)。lxc, docker, etc, etc. 最小的设置,可爱的光线和干净,可以作为“普通”用户在外面运行,而在里面看起来像裸机。
使用不需要 root 的 httpd。Apache 有一个完整的生态系统,它期望某些东西,所以它不是一个好的选择。但是无论您选择哪个,您都可能不得不与他们的 init 脚本作斗争。
如果您只需要非私有端口上的超级基本内容,您可以运行:
python -m SimpleHTTPServer 8000
Run Code Online (Sandbox Code Playgroud)简短的回答:
您不能以一种理智的方式让第一个主 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 服务器在这些端口上正常工作。
Master 进程并没有做更多的事情,实际上,它不处理来自客户端的实际请求,也不实际与 web docroots 等交互。
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 的端口。
| 归档时间: |
|
| 查看次数: |
35305 次 |
| 最近记录: |