如何将对 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 中一样在其上设置setuid
bit + chown。#$SUDO_*ID
变量可能需要用其他东西替换,并且sudo -K
需要测试有效性。
此外,enc_dir 和 mount_point 变量不应可参数化,因为它们的使用不安全。否则,应该对它们进行转义,或者更好的做法是,应将它们作为非共享第一个参数传递(因此,$@ 应替换为位置参数范围 ${@:2})。
或者填写对 encfs/fuse 支持的功能请求以unshare -r
取消与开发人员共享...