我正在创建一个将运行 nginx 和 php-fpm 的生产服务器。我希望在确保服务器安全的同时仍能保持良好、快速的工作流程。
现在,有一件事可以始终确保系统安全,那就是 chrooting。现在我已经阅读了很多关于这方面的文章,chrooting nginx 相当复杂。
据说一个好方法是使用 php-fpm 内置的 chroot 功能。我读过几份指南,解释了如何设置它,但我还没有读过这会带来什么影响。我甚至读到过根本没有任何影响。
好吧,我遇到的第一个问题与时间有关。解决方案是将/etc/localtime
文件夹复制/usr/share/zoneinfo
到 chroot 目录中。
没有任何指南告诉您这一点,这是您注意到的第一个错误。
现在我遇到了麻烦file_get_contents
,出现以下错误:
无法打开流:php_network_getaddresses:getaddrinfo 失败:名称或服务未知
我猜解决办法是将更多文件添加到 chroot 中。我真的不想对我开发的每个网站都这样做。
问题
现在,即使在 php-fpm 中,chrooting 也是这种情况吗?还是我做错了什么?我是否必须启用某些功能才能使一切正常运行,或者我应该将所有内容移到目录中。
答案1
是的,您需要 chroot 目录中的基本功能文件系统。不,您不应该移动(或链接)所有内容 - 否则将完全违背 chroot 的整个目的。
本质上,chroot 中需要存在的资源是服务器在运行时需要访问的资源 - 任何动态加载的库、日志目录以及服务器执行任何操作所需的支持结构。
在这种情况下,您缺少基本的名称解析配置 - /etc/resolv.conf
、、/etc/nsswitch.conf
和 nss/dns/resolv 相关内容/lib
将是一个良好的开端。
答案2
复印解析库和/etc 文件其实没有必要,如果你可以运行神经胶质细胞在您的服务器上。
基本思想是将 nscd 的 Unix 域套接字(通常是 /var/run/nscd/socket)绑定挂载到 chroot 中。(e)glibc 将尝试联系它来解析用户名、主机名等。只有当 nscd 没有运行时,(e)glibc 才会自行解决问题。
关于这个问题的更多细节,以及在 chroot 中运行 PHP 时可能需要修复的其他问题,可以参阅我的博客文章: