【问题标题】:How does Apache access SSL certs created by root user?Apache 如何访问由 root 用户创建的 SSL 证书?
【发布时间】:2014-06-16 12:19:26
【问题描述】:

我有一个运行 Apache HTTPD 的 Debian 服务器。

我已将其配置为使用位于 /etc/ssl/private/ 中的某些 SSL 证书。只有 root 用户对该目录具有读写权限。 HTTPD 进程以 www-data 用户身份运行,但它由 root 用户使用 init.d 脚本(HTTP 安装附带)启动。

当 apache2 进程作为 www-data 运行并且 SSL 证书只能由 root 用户读取时,Apache 如何能够毫无问题地读取证书和运行?

我为使用 Python 编写的自定义服务器编写的 init.d 脚本遇到了类似的问题。只要我不使用 SSL 证书,这个 init.d 脚本就可以正常工作。一旦我添加了这些证书,该过程就不会开始,因为它无法读取证书,因为 www-data 用户无法读取证书。

我也在类似的情况下使用过 nginx,结果与使用 Apache 的结果相似。那么这两个项目是如何解决这个问题的呢?

【问题讨论】:

  • “我面临着类似的问题” > 你的第一个问题是什么——我没看到?另外,为什么您的“自定义”“服务器”初始化脚本是用 python 编写的?使用为您的操作系统提供的系统服务器初始化脚本启动 Apache;这就是它的用途,并且经过了彻底的测试。然后,您可以使用 python 与以 root 身份运行的服务器进行交互。不要以任何其他方式启动服务器!使用 python 脚本启动 Apache 或任何其他系统/根服务的原因是什么?

标签: linux apache nginx apache2 sysadmin


【解决方案1】:

当你跑步时

ps aux | grep apache2

你会注意到有一个root拥有的进程,我想可能是这个原因,因为这个进程可以访问root拥有的文件/目录。

【讨论】:

  • 嗯。可能,但仍然没有足够的证据证明这一点。 lsof -p PID_OF_ROOT_OWNED_PROCESS 没有得到任何可以表明该进程正在为证书文件保存 fd 的信息。用户可能阅读了内容然后释放了fd。但正如我所说,这不是决定性的。
  • 好答案.. 我已经扩展了为什么 Apache 是 root 而不是 'www-data' 或其他任何人。这些只是孩子/工人而不是父母。
【解决方案2】:

root 在大多数情况下运行 Apache。
因此,root 是主“父”进程的所有者。

Apache starts 时,它(通常)应该使用root 启动(部分原因是您必须使用sudo 和系统服务管理器才能正确启动它)。此外,父进程(以 root 用户身份运行)然后读取配置,绑定到给定的system ports(通常是 80 和 443)和其他任务。这些端口也被视为privileged(1024 以下的任何端口)。完成后,它会生成子进程(也可以通过核心 modules 使用“workers”)。

由于父进程是 root 并且子进程/workers 在“www-data”(或其他非特权用户)下运行,Apache 仍然可以绑定到系统端口并处理 root 特权文件,例如私有 SSL 密钥/以这种方式等。

"虽然父进程在 Unix 下通常以 root 身份启动以绑定到端口 80,但启动子进程和线程 由服务器作为权限较低的用户。用户和组指令 用于设置 Apache HTTP Server 子节点的权限 过程。子进程必须能够读取所有内容 这将被送达,但除此之外应该拥有尽可能少的特权 可能的。此外,除非使用 suexec,否则这些指令也 设置将由 CGI 脚本继承的权限。*"

发件人:https://httpd.apache.org/docs/2.4/mod/prefork.html#how-it-works

【讨论】:

  • 感谢@bshea 提供了简单而写得很好的解释,因为同样的原始问题来到这里,因为当一个人运行“apache2ctl -t”时,它会抛出一个错误“SSLCertificateKeyFile: file '/etc/ssl /private/server.key' 不存在或为空”正如预期或更好现在我明白为什么只有“sudo apache2ctl -t”可以进行语法检查,同时还可以访问需要 root 权限的文件。 :)
【解决方案3】:

只有私钥受到保护,因为证书在 /etc/ssl/certs 目录中公开可用。 /etc/ssl/private 仅 root 可读,但 ssl-cert 用户组被授予执行(ssl-cert 组 X 权限)。这个系统组可能是涉及 SSL 身份验证方法的系统组。

你可以试试:

sudo chown root:ssl-cert /etc/ssl/private/your-private.key

重新加载apache并再次检查?

我已经清除了我的服务器上的所有 Apache2 安装,所以我不能再测试了。

希望对您有所帮助, 问候

【讨论】:

  • 问题是 Apache 无法访问密钥。实际上,它能够以 root:root 所有权访问它们。 /etc/ssl 具有 root:ssl-certs 所有权,但密钥文件具有 root:root 所有权。一切正常。我遇到了这个帖子gnuwhatimsaying.com/private-key-permissions,这可能是最好的解释之一。
  • 当然它会在 root 下运行良好,但我以为你只是不希望它以 root 身份运行。
  • 因此,如果您注意到ps 命令吐出的进程列表中,Apache 是以 www-data 用户而不是 root 身份运行的。该用户也未添加到 ssl-certs 组中。因此,该用户无权访问任何证书,即私有或公共。但是,init.d 脚本始终以 root 身份运行。我假设证书是由 Apache 的 init.d 脚本获取的,并以某种方式传递给它。这听起来正确还是接近?
  • 我不明白的一点是,通常在启动时,initd 会以 root 权限启动进程。我认为 apache 开始运行 unbder root 用户,然后在 www-data 下分叉其工作程序。在 root 下的 init 应该能够读取私有安全密钥
  • 使用service命令的时候还需要root账号,所以……权限应该够了
猜你喜欢
  • 1970-01-01
  • 2015-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2014-02-08
  • 2013-06-20
  • 1970-01-01
相关资源
最近更新 更多