在SELinux下对PHP-FPM权限的困惑
我最近在家庭实验室里搭建了一台Fedora 44服务器。我在上面启动了Apache,并安装了PHP和 PHP-FPM。我在 /var/www/html 放置了一个PHP网站(SPIP)。
该网站的所有文件和文件夹都归 apache 用户拥有,安全上下文为 system_u:object_r:httpd_sys_content:s0,除了少数几个文件夹具有 system_u:object_r:httpd_sys_rw_content:s0 的上下文。
我想确认在最坏的情况下,SELinux是否确实在限制入侵者的行为。为测试这一点,我在 /var/www/html 文件夹的根目录放置了一个简单的webshell。它会把你传给该webshell的任意内容作为参数调用PHP函数 system。这个webshell的安全上下文与其他文件相同。
令我吃惊的是,webshell能够顺利运行,我可以调用诸如 sleep 或 touch 之类的二进制文件。我查看了进程树,发现当向webshell发送命令时,正在 httpd_t 域中运行的某个php-fpm进程出现了一个子进程在运行 sh -c -- <command sent to the webshell>,它同样处于 httpd_t 域。
我的问题是:这怎么会发生?我本来预期这个webshell会完全失败,因为属于 httpd_t 域的进程不能执行类型为 bin_t 的文件。那么php-fpm如何运行属于该类型的二进制文件 /bin/sh 呢?我到底漏看了什么?
编辑:SELinux也远非我能用来强化这个Web应用的唯一工具。然而,我搭建这个实验室的原因恰恰是为了测试SELinux的特性、学习如何使用它,因此对我来说真正的问题是要理解我错过了SELinux的哪个机制。
解决方案
好吧,看来答案就在那里 那里 :根据SELinux的访问规则,处于域 httpd_t 的进程可以执行带有属性 base_ro_file_type 的二进制文件。具体地,/bin/sh 属于类型 bin_t,并具有这个属性。因此php-fpm可以毫无问题地执行 /bin/sh。