解决方案 1(每次启动时都会要求输入 root 权限)

解决方案 1(每次启动时都会要求输入 root 权限)

如何将对 encfs 挂载的访问限制到特定进程?

默认情况下,encfs 仅对当前用户可见(使用该--public选项时除外)。

以其他用户身份运行 encfs 的缺点是容易出现权限问题,因为文件将归其他用户所有,并且可能具有限制性权限。我不想处理权限问题。

所以我想由同一个用户运行 encfs,并且由控制组(cgroups)或命名空间等处理每个进程的访问限制。

答案1

以下解决方案通过以下方式使用命名空间unshare命令。其他命名空间中的进程将看不到该挂载。

我们不能使用,unshare -r因为它是以nogroups组权限运行的,而 encfs/fuse 不喜欢这样。

解决方案 1(每次启动时都会要求输入 root 权限)

我们使用sudo unshare创建绑定挂载并将其标记为私有。完成后,我们将用户更改为 sudo 调用者 ( sudo -u "#$SUDO_UID" -g "#$SUDO_GID") 并明确删除 root 权限 ( sudo -K)。此时,我们可以调用encfs并开始使用 进行操作your_program_here。终止后,私有绑定挂载将被父 root bash 删除(因此无需再次询问用户 root 密码),因此 root 无法再通过 看到它mount -l

enc_dir="/path/to/enc_dir"
mount_point="/path/to/plain_dir"
RUN_CMD="mount --bind \"$mount_point\" \"$mount_point\"; \
         mount --make-private \"$mount_point\"; \
         sudo -u \"#\$SUDO_UID\" -g \"#\$SUDO_GID\" \
             bash -c \"sudo -K; \
                       encfs \\\"$enc_dir\\\" \\\"$mount_point\\\"; \
                       your_program_here \\\"\\\$@\\\"; \
                       fusermount -u -z \\\"$mount_point\\\" \
                     \" - \"\$@\"; \
        umount \"$mount_point\""
sudo unshare -m bash -c "$RUN_CMD" - "optional" "arguments"

your_program_here可以是任何你想要的,例如bash命令提示符。你可以正确地将参数传递给此程序 ($1="optional" $2="arguments")。

来源:脚本终止时启动 sudo 命令吗?Celada 的回答 + 查看来源解决方案 2。

解决方案 2(如果使用 unshare >= v2.27.1,则存在严重漏洞)

为了避免unshare以 root 身份运行,我们需要使用 setuid 位。

sudo groupadd unshare
sudo adduser $USER unshare
sudo chmod u+s /usr/bin/unshare
sudo chown root:unshare /usr/bin/unshare

警告:这会导致最近的取消共享版本中出现漏洞(因为v2.27.1) 并且不得使用,因为 unshare 在执行命令时不再放弃 root 权限,因此任何人都可以拥有 root 访问权限。存在一种解决方法,并描述如下这里

然后(可能需要一个新的终端):

unshare -m

$现在,我们应该有一个具有用户标志(而不是root 标志)的 shell #。现在,我们需要在挂载选项中明确指定private或(解释见下文来源),然后启动 encfs。rprivate

enc_dir="/path/to/enc_dir"
mount_point="/path/to/plain_dir"
sudo mount --bind "$mount_point" "$mount_point"
sudo mount --make-private "$mount_point"
encfs "$enc_dir" "$mount_point"

从此 shell 启动的进程将能够查看挂载点。其他进程则不能。

来源:在没有 root 访问权限的情况下隐藏共享系统中的加密文件夹(unshare -m)评论者:Philipp Wendler &无法让每个进程挂载命名空间正常工作ub1quit33 的回答

解决方案 3?(最佳方案)

有待进一步探索的途径:可能需要将解决方案 1 脚本放入文件中.sh,并像在解决方案 2 中一样在其上设置setuidbit + chown。#$SUDO_*ID变量可能需要用其他东西替换,并且sudo -K需要测试有效性。

此外,enc_dir 和 mount_point 变量不应可参数化,因为它们的使用不安全。否则,应该对它们进行转义,或者更好的做法是,应将它们作为非共享第一个参数传递(因此,$@ 应替换为位置参数范围 ${@:2})。

或者填写对 encfs/fuse 支持的功能请求以unshare -r取消与开发人员共享...

相关内容