Linux 上的不可变目录

Linux 上的不可变目录

我希望了解设置了不可变位的目录在 Linux 上的行为方式。对于文件来说这很简单,但是目录本身具有两个方面(目录本身及其内容)的性质使其更加令人困惑。假设我有一个如下所示的目录:

${ROOT}/
    build/
    config/
    src/
    Makefile
    README

不可变位是否可以以这样的方式使用,以便使${ROOT}${ROOT}/build${ROOT}/config${ROOT}/src${ROOT}/Makefile${ROOT}/README只读(即权限、所有者、扩展属性和名称不能更改,也不能删除或添加文件/目录),除了文件和目录可以在${ROOT}/build${ROOT}/config?下自由添加、删除和修改。我想这可以通过运行chattr -R +i ${ROOT}; chattr -R -i ${ROOT}/build ${ROOT}/config或 来实现chattr -R +i ${ROOT}; chattr -R -i ${ROOT}/build/* ${ROOT}/config/*,但是目录在这方面的行为对我来说是不明确的。一个潜在的用例是,如果管理员希望其他用户无法修改该项目的源代码、makefile、自述文件和顶级目录结构,同时仍允许他们在其中进行构建。

答案1

出于访问控制的目的,目录的内容是其中包含的文件名。要添加、删除或重命名文件,需要对目录进行写访问。 (要列出文件名,需要读取访问权限。)此外,+t目录还有粘滞位 ( ),它进一步限制文件所有者和目录所有者的文件删除。 IOW,它可以防止删除其他人拥有的文件,即使您具有对该目录的写访问权限并且可以修改其内容。

至于权限,只有所有者才能更改,并且文件的所有者只能由 root 更改。我认为编辑扩展属性与写访问权限相关,因此您不能真正单独禁止它。

至于您的要求,如果我理解正确的话,您希望允许在${ROOT}/build和内创建文件${ROOT}/config,但不允许在 下的其他目录中创建文件${ROOT}。这可以简单地通过以下方式完成:

chmod a+rX -R ${ROOT}
chmod o-w -R ${ROOT}
chmod o+w -R ${ROOT}/build ${ROOT}/config
# chmod +t -R ${ROOT}/build ${ROOT}/config

这里确实没有必要使用不可变位,它是特定于文件系统的,并且平等地限制所有用户,包括所有者和根用户。

然而,如果构建发生在内部${ROOT}/build,仍然存在多个用户无法在不破坏彼此文件的情况下工作的问题。为了解决这个问题,您可以修改构建系统以支持在任意输出目录中进行构建,或者只是让每个用户制作自己的源树副本并在其主目录中编译它。

相关内容