我有一台运行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相似。那么这两个项目如何解决这个问题?
答案 0 :(得分:3)
运行时
ps aux | grep apache2
您会注意到root拥有一个进程,我认为这可能是原因,因为此进程可以访问root拥有的文件/目录。
答案 1 :(得分:1)
只有私钥受到保护,因为证书在/ 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安装,所以我不能再测试它了。
希望有所帮助, 问候
答案 2 :(得分:0)
Root运行Apache。因此,root是其下任何其他内容的主要进程(父进程)。
当Apache starts时,它应该已经开始使用root(为什么必须使用sudo
才能正确使用系统服务)。此外,当它开始时,父进程(root用户)读取(作为root)中的配置,绑定到给定的' system ports' (通常是80和/或443)和其他任务。完成后,它会生成子进程(也可以使用" workers"通过核心modules)。
由于父进程是root,并且子/ worker在&www; www-data'下运行。 (或其他非特权用户),Apache仍然可以绑定到系统端口并以这种方式处理特权根文件,如私有SSL密钥/等。
"虽然父进程通常在Unix下以root身份启动,以便绑定到端口80,但子进程和线程已启动 由服务器作为权限较低的用户。用户和组指令 用于设置Apache HTTP Server子级的权限 流程。子进程必须能够读取所有内容 将被提供,但应该具有尽可能少的特权 可能。另外,除非使用suexec,否则这些指令也是如此 设置将由CGI脚本继承的权限。*"