通过移动带有错误上下文的文件触发 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 问题。在下一步中,你将学习如何通过更改文件的上下文来修复此问题。