apache的作为非root用户运行的孩子如何访问只有root用户才能访问的私钥(与SSL证书一起使用)?
事实上,当Apache启动时,只有主进程仍以root身份运行。 线程正在以非root用户身份运行。 通常,按照安全指南,您的私钥的所有者是root,并且其权限为600。
那么这些孩子们怎么能够build立一个SSL连接呢? 主进程和subprocess之间是否有共享内存,有没有使用临时文件,还是负责build立SSL连接的主进程?
另外(这有点偏离主题,但仍然很有趣)是否意味着能够妥协一个Web服务器意味着能够破坏私钥? 例如,假设我们可以访问PHP的webshell(因为PHP和Apache经常共享同一个用户),这是否意味着我们可以检索(这种或那种)私钥?
谢谢。
根权限也需要绑定到特权的TCP端口80和443,打开日志文件,而不仅仅是读取包括公钥和私钥在内的configuration文件的权限。
从Apache手册 :
…为了启动Apache,必须拥有root权限,以便它可以绑定到这个特权端口。 一旦服务器启动并执行了一些诸如打开其日志文件的初步活动,它将启动几个subprocess,这些subprocess负责监听和响应来自客户端的请求。 主httpd进程继续以root用户身份运行 ,但是subprocess作为一个权限较低的用户运行。 这由选定的多处理模块控制。
关于SSL公钥和私钥文件,AFAIK只有在启动时才会被读取,之后它们在内存中并在服务器保持运行期间保持可用状态。 (看这个问题 )
这就是为什么在暴露无遗的Web服务器内存之后,您还需要生成新的SSL证书,并且仅仅进行修补是不够的。 有足够的时间和一点运气heartbleed可能已经暴露内存碎片包含您的SSL私钥。
恕我直言,孩子们根本不处理他们。 由于根进程正在采取所有的TCP连接,并将请求转发给处理该请求的孩子,并且从孩子处理该请求 – 孩子从来不必处理证书。 它只需要处理从父进程传来的数据,然后重新输出。
它从来没有build立一个ssl连接开始。