在 /etc/fstab 中绑定挂载,将 suid 添加到子目录

在 /etc/fstab 中绑定挂载,将 suid 添加到子目录

我已经成功地使用 mount 来做到这一点。

sudo mount -o bind dir dir && 
sudo mount -o remount,bind,suid dir

需要两次调用mount。我无法用更少的时间让它工作。无论如何,手册说这将需要两次挂载系统调用。 然而,我不知道要放入什么/etc/fstab

这是我尝试过的。

/home/system/dir /home/system/dir none bind
/home/system/dir /home/system/dir none remount,bind,suid

/home/system/dir /home/system/dir none remount,bind,suid

答案1

我提出了一种语法解决方法,使用单个/etc/fstab条目来触发绑定安装的预期行为,否则不会触发 for suid(但会触发 for nosuid)。不耐烦的可以直接看答案的最后一行。

  • /etc/fstab经过系统在启动时和通过以后将不支持重复条目

    系统将每个条目转换为安装单元。我想有两个同名的单位会引起问题。本身也会有同样的问题:无法区分两个具有相同名称的条目,/etc/fstab因此可能只有第一个,但无论如何人们都可以期待一些不同的行为。

    所以尝试用以下方法处理这个问题条目/etc/fstab似乎很困难。

  • 命令(单独或与系统)仅能很好地处理相反的情况。

    当指定“否定”选项(例如nosuid绑定安装)时,最近的足够命令(或者也系统万一不是)正确发出两个mount(2)系统调用,第二个使用附加MS_REMOUNT标志。当仅指定“正”选项(通过系统调用中缺少标志进行转换)时,会发出单个 mount 系统调用,即使意图是恢复先前的“负”选项。

    当指定将触发这两个系统调用行为的其他选项时,例如bind,nodev,附加的“积极”选项(例如suidwith bind,nodev,suid)也会在第二个 mount 系统调用中启动(仅由于缺少相反的标志)并且这suid在这个 strace 示例中可以正常工作:

    743790 mount("/home/system/dir", "/home/system/dir", 0x563792444220, MS_NODEV|MS_BIND, NULL) = 0
    743790 mount("none", "/home/system/dir", NULL, MS_NODEV|MS_REMOUNT|MS_BIND, NULL) = 0
    

    缺少 的MS_NOSUID存在MS_REMOUNT会将安装点设置为suid。这也意味着在父挂载上设置的所有其他非默认选项必须为附加绑定挂载显式写回,否则它们将消失。这里不指定suid选项仍然会重新挂载绑定挂载苏伊德MS_NOSUID因为在这两种情况下,这都是由于第二个 mount 系统调用中缺少标志而导致的。触发第二个系统调用的选项必须仍然存在,否则根本不会发出。

因为我猜测OP的意图是在这个地方运行无根容器,所以应该使用一个无害的选项来仍然触发这种行为。我能找到的唯一候选人mount(2)wereMS_NOATIMEMS_NODIRATIMEand MS_RELATIME,最后一个是今天的默认值并且肯定已经存在。

从 Linux 2.4 开始,上面的一些标志可以在每个安装的基础上设置,而其他适用于已安装文件系统的超级块,这意味着同一文件系统的所有安装共享这些标志。 (以前,所有标志都是针对每个超级块的。)

每个安装点标志如下面所述:

  • 从 Linux 2.4 开始:MS_NODEVMS_NOEXECMS_NOSUID标志可以在每个安装点的基础上设置。
  • 此外,自 Linux 2.6.16 起:MS_NOATIMEMS_NODIRATIME.
  • 此外,自 Linux 2.6.20 起:MS_RELATIME.

[...]

从 Linux 2.6.16 开始,MS_RDONLY可以在每个安装点以及底层文件系统超级块上设置或清除。

[...]

因此,最终今天触发的条目的预期效果可以是:

/home/system/dir    /home/system/dir    none    bind,relatime   0 0

简单地重述relatime将触发第二个挂载系统调用并允许更改回suid.在这种情况下,当/homehas flags时rw,nosuid,relatime/home/system/dir将有 flagsrw,relatime意味着它照常处理设定值二进制文件,其他什么都没有改变。

但为了一致性、文档/理解并防止未来的更改/改进,最好suid也明确说明预期目的:

/home/system/dir    /home/system/dir    none    bind,relatime,suid  0 0

相关内容