以非 root 用户身份运行的 apache 子进程如何访问只有 root 才有权访问的私钥(与 SSL 证书一起使用)?
确实,当 Apache 启动时,只有主进程仍以 root 身份运行。线程以非 root 用户身份运行。通常,按照安全指南,您的私钥的所有者是 root,其权限为 600。
那么这些子进程如何建立 SSL 连接?主进程和子进程之间是否有共享内存,是否有正在使用的临时文件,或者主进程是否负责建立 SSL 连接?
另外(这有点题外,但仍然很有趣)这是否意味着能够破坏 Web 服务器就意味着能够破坏私钥?例如,假设我们能够访问 PHP webshell(因为 PHP 和 Apache 通常共享同一个用户),这是否意味着我们可以(以某种方式)检索私钥?
谢谢。
答案1
还需要 root 权限才能绑定到特权 TCP 端口 80 和 443,打开日志文件,而不仅仅是读取包括公钥和私钥在内的配置文件的权限。
来自Apache 手册:
... 需要具有 root 权限才能启动 apache,以便它可以绑定到此特权端口。一旦服务器启动并执行了一些初步活动(例如打开其日志文件),它将启动几个子进程,这些子进程负责监听和响应来自客户端的请求。主 httpd 进程继续以 root 用户身份运行,但子进程以较低权限用户身份运行。这由所选的多处理模块控制。
至于 SSL 公钥和私钥文件,据我所知,它们无论如何都只能在启动时读取,之后它们将保存在内存中,并在服务器运行期间保持可用状态。(请参阅这个问题)
这就是为什么心血,这会暴露网络服务器内存的随机片段,您还需要生成新的 SSL 证书,而简单的修补是不够的。如果有足够的时间和一点运气,heartbleed 可能会暴露包含您的 SSL 私钥的内存片段。
答案2
我认为子进程根本不处理它们。由于根进程正在接管所有 TCP 连接 - 并将请求和响应转发给处理它的子进程和从处理它的子进程转发请求和响应 - 子进程永远不必处理证书。它所要做的就是处理从父进程传输的数据 - 并重新输出。
它从一开始就从未建立 ssl 连接。