使目录除 root 之外不可修改或不可删除

使目录除 root 之外不可修改或不可删除

我想防止目录被删除,假设该目录有这个路径

~/foo

有没有办法让它只能由root用户删除,不使用 sudo 且不成为 root 用户

例如,这应该有效:

sudo chown -R root:root ~/foo

但如果我不使用 sudo,上面的命令将会失败

chown -R root:root ~/foo # 失败

chown:更改“/home/olegzandr/foo/bar”的所有权:不允许操作

是否可以在不使用 sudo 的情况下使文件除 root 用户之外不可删除?

(我还阅读了有关该chattr命令的信息,但标签不可用,因此我无法chattr向问题添加标签。)

如果我尝试这个:

在此输入图像描述

它似乎不起作用,因为没有抛出权限错误。

答案1

对于你的第一个问题,请使用这样的粘性位:

chmod o+t ~/foo

它将使其无法被除所有者和 root 之外的任何用户删除

对于该chown命令,如果没有超级用户权限,则无法更改所有者

答案2

目录的所有者通常可以删除和重命名该目录中的文件和子目录。 Linux 安全模块和文件属性(如果启用且可用)可能会增加额外的限制。


编辑以反映问题的变化:

普通用户可以轻松创建一个目录,排除除以下用户之外的所有用户他们自己和根。例如:

mkdir -m 0700 ~/foo

创建一个只有所有者用户 ( drwx------) 和 root 可以访问的目录;然而

mkdir -m 0770 ~/foo

创建一个只有所有者用户和组成员 ( drwxrwx---) 以及 root 可以访问的目录。

除了可能使用的任何 Linux 安全模块(例如 SELinux)设置的例外之外,root 可以访问系统上的所有文件。毕竟,这就是为什么他们是超级用户。

如果你运行命令id -un,你可以看到你当前的真实用户名。该命令id -gn报告您的真实组以及id -Gn您所属的补充组的名称。如果您是目录的所有者用户,则可以使用命令将任何文件或子目录的组更改为您所属的任何组chgrp

因此,假设您是用户grand并且属于组marinatorino。如果您想创建目录games-marina,并且games-torino只有您和属于这两个组的任何用户可以访问(但其他人只能读取,不能修改或删除任何内容),那么请执行以下操作

mkdir                 games-marina
chgrp  marina         games-marina
chmod  u=rwx,g=rx,o=  games-marina

mkdir                 games-torino
chgrp  torino         games-torino
chmod  u=rwx,g=rx,o=  games-torino

在许多系统中,还会为用户创建一个与其用户名匹配的组。这在很多方面都很有用;例如,它通常是您拥有的任何文件的默认组,因此明确只有您可以控制它们的内容。

用户不能正常放弃供他人控制的文件或目录。这种所有权更改确实需要超级用户权限。 (例如,要使用 更改文件或目录的所有者chown,您需要是 root 用户,或者在 Linux 中具有 CAP_CHOWN 功能。)

有很多原因可以解释为什么让这种遗弃发生是一个坏主意。技术上是可以实现的,但我个人没见过任何还不错的用例。我很确定OP正在尝试做一些事情......我们可以说,在这里没有用。

sudo(我确实编写了一些脚本,允许属于特定组的成员(是的,Web 管理员)之间的某些目录树中的文件所有权,但是使用几个 bash/dash 帮助程序脚本很容易安全地进行设置。)


如果我们想要创建目录/home/olegzandr/foo所有者不可删除的目录/home/olegzandr,我们需要创建foo一个挂载点,并在其顶部绑定挂载一个(root 拥有的)目录。例如,我们可以创建目录(显然由 root 用户拥有),并使用例如/root/foo绑定挂载它/home/olegzandr/foo

sudo mount --bind /root/foo /home/olegzandr/foo

对于绑定挂载,该/home/olegzandr/foo目录必须仍然存在(因为它用作挂载点),并且目录的所有者/home/olegzandr可以操作该目录,但在绑定挂载存在时他们无法删除该目录。由于/home/olegzandr/foo是 root 拥有的新挂载点,因此 的所有者/home/olegzandr无法操作它。

/home/olegzandr为了防止在绑定挂载未生效时挂载点被所有者删除,应将挂载点设置/home/olegzandr/foo为不可变。要创建初始安装点(尚未安装绑定安装),我将使用

sudo mkdir      /home/olegzandr/foo
sudo chmod 0700 /home/olegzandr/foo
sudo chattr +i  /home/olegzandr/foo

请注意,这也意味着没有人可以意外复制数据或在 中创建子目录/home/olegzandr/foo,除非绑定安装有效。 (当绑定挂载生效时,所有者、组和权限也/root/foo适用/home/olegzandr/foo。)


在 ext4 和大多数其他文件系统上,我们通常可以使用中间不可变目录来创建/home/olegzandr/foo/bar不可/home/olegzandr/foo变的目录。这样所有者/home/olegzandr就不能修改或删除/home/olegzandr/foo,也不能删除/home/olegzandr/foo/bar。后者还是 root 拥有的目录中的子目录,因此不再受/home/olegzandr.对此进行实验:

sudo mkdir /home/olegzandr/foo
sudo mkdir /home/olegzandr/foo/bar
sudo chmod 0555 /home/olegzandr/foo
sudo chattr +i /home/olegzandr/foo

/home/olegzandr/foo/bar然后您可以根据需要设置所有者、组和模式。只要/home/olegzandr/foo它是不可变的,就不能被删除(即使是 root)。

要更改不可变文件属性,需要是 root 或具有此CAP_LINUX_IMMUTABLE功能(通常只有 root 具有)。

相关内容