![不使用 root 身份运行 Apache 以实现 HTTPS](https://linux22.com/image/728357/%E4%B8%8D%E4%BD%BF%E7%94%A8%20root%20%E8%BA%AB%E4%BB%BD%E8%BF%90%E8%A1%8C%20Apache%20%E4%BB%A5%E5%AE%9E%E7%8E%B0%20HTTPS.png)
我正在尝试使用处理 TLS 相互身份验证的 Apache 服务器制作 Docker 容器映像。由于这是一个容器,因此可以让 Apache 监听一些高编号端口而不是 443,因此这应该消除了 root 执行的需要。
然而,当我尝试启用 TLS 时,我得到了以下信息:
[Thu Oct 11 09:50:50.357758 2018] [auth_digest:notice] [pid 22] AH01757: generating secret for digest authentication ...
[Thu Oct 11 09:50:50.357818 2018] [auth_digest:error] [pid 22] (13)Permission denied: AH01762: Failed to create shared memory segment on file /run/httpd/authdigest_shm.22
[Thu Oct 11 09:50:50.357825 2018] [auth_digest:error] [pid 22] (13)Permission denied: AH01760: failed to initialize shm - all nonce-count checking, one-time nonces, and MD5-sess algorithm disabled
创建共享内存是否需要 root 权限,或者是否可以修改访问权限以允许非 root 使用?
答案1
容器中的应用程序通常以 root 身份运行。但这并不意味着它们拥有完全的 root 权限。
来自docker 安全文档:
[...] 容器可以以减少的功能集运行;这意味着容器内的“root”拥有的权限比真正的“root”少得多。
只需让它以 root 身份在容器内运行。
答案2
最终弄清楚了。列出/run/httpd
节目上的访问标志:
drwx--x--- 3 root apache 4096 Sep 24 15:57 /run/httpd/
因此只有 root 可以写入。因此在 Dockerfile 中我添加了:
RUN chmod 770 /run/httpd
并且它确实有效。虽然不确定它是否是最好的解决方案,但我欢迎任何指出该解决方案存在问题的评论。