我有一台运行 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 的结果相似。那么这两个项目是如何解决这个问题的呢?
当你跑步时
ps aux | grep apache2
你会注意到有一个root拥有的进程,我想这可能是原因,因为这个进程可以访问root拥有的文件/目录。
在大多数情况下,Root 会启动 Apache。
因此,root 是主“父”进程的所有者:
当 Apache 启动时,它(通常)应该使用 root 启动(这也是为什么您必须将
sudo
与系统服务管理器一起使用才能正确启动它的原因)。此外,父进程(以 root 用户身份运行)然后读取配置,绑定到给定的“系统端口”(通常为 80 和 443)和其他任务。这些端口也被视为“特权端口”(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
只有私钥受到保护,因为证书在 /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 安装,因此我无法再对此进行测试。
希望有帮助, 问候