通过移动具有错误上下文的文件触发 SELinux 拒绝
在此步骤中,你将看到当具有错误 SELinux 上下文的文件被移动到 Apache Web 目录时会发生什么。这是一个常见场景,如果你不了解 SELinux 上下文如何与 mv
等文件操作协同工作,可能会感到困惑。与直接在目录中创建文件(这会导致它继承父目录的默认上下文)不同,移动文件会保留其原始上下文。
首先,让我们在当前工作目录 ~/project
中创建一个新的网页 page2.html
。
echo "This is Page 2" > page2.html
现在,检查此新文件的 SELinux 上下文。由于它是在你的主项目目录中创建的,它将获得分配给用户文件的默认上下文。
ls -Z page2.html
输出将显示上下文类型为 user_home_t
或类似的类型,这是用户主目录中文件的默认设置。
system_u:object_r:user_home_t:s0 page2.html
请注意类型是 user_home_t
。这与 Apache 允许访问的 httpd_sys_content_t
不同。
接下来,使用 mv
命令将此文件移动到 Apache Web 根目录。你需要 sudo
,因为目标目录 /var/www/html
是由 root
拥有的。
sudo mv page2.html /var/www/html/
mv
命令会保留源文件的 SELinux 上下文。让我们通过检查文件在其新位置的上下文来验证这一点。
ls -Z /var/www/html/page2.html
正如你所见,上下文没有改变。即使文件现在位于 /var/www/html
目录中,它仍然是 user_home_t
。
system_u:object_r:user_home_t:s0 /var/www/html/page2.html
现在,尝试使用 curl
访问此新页面。由于上下文不匹配,SELinux 将阻止访问。
curl http://localhost/page2.html
你将从服务器收到“403 Forbidden”错误。这不是传统的文件权限问题;这是 SELinux 在强制执行其安全策略,并拒绝 httpd
进程读取具有 user_home_t
标签的文件。
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /page2.html
on this server.</p>
</body></html>
这演示了一个典型的 SELinux 问题。在下一步中,你将学习如何通过更改文件的上下文来解决此问题。