我有两个相同的文件(文件内容只是asd
),具有644
权限并由所有root:root
,一个创建于 19:24,另一个创建于 19:25。
第一个文件通过 SFTP 上传,root
另一个文件由 sudoer 直接在服务器上创建。然后,这两个文件被移动到文档根目录,其中一个文件名为index.html
。
如果第一个文件名为index.html
,则访问我的网站时会收到 403 响应:
禁止
您无权访问此服务器上的 /index.html。
但是,如果第二个文件被命名,index.html
它将按预期提供,并且我可以asd
在页面上看到。
我完全惊呆了。这是怎么回事?
答案1
文件的属性比ls -l
显示的要多。例如,许多文件系统有多个“标志”属性来更改文件的行为(在 中可见lsattr
),许多文件系统可以以扩展属性的形式存储任意数据(在 中可见getfattr
)。
Linux 也不仅限于三类权限;文件可以具有列表分配给它的用户和组——这将通过标准权限旁边的加号表示+
,并且整个列表将在中可见getfacl
。
但在本例中,.
文件权限旁边的点表示该文件具有安全上下文标签应用于该文件,指示该文件的用途。您应该能够在ls -Z
它通常被“强制访问控制”模块使用SELinux或者有时是 SMACK – 强制限制哪些进程可以访问它即使所有者已将它们设置为全世界可读的。
虽然 SELinux 通常可以根据文件创建所在的目录自动为文件应用正确的标签,但如果文件最初是在其他地方创建的,后来才移动到最终位置,则此方法不起作用。因此,如果您运行,ls -lZ
您可能会看到无法访问的文件具有与其他文件完全不同的标签。
要解决这个问题,你应该能够运行restorecon
在文件上,它将根据已安装的 SELinux 策略设置正确的上下文。
答案2
ACL 后面的点表示有扩展权限。
getfacl index.html*
应该显示差异...