本文目录导读:

- Linux 容器沙箱(如 Docker、Podman)—— 使用 Mount Namespace + 只读绑定
- 应用沙箱(如 Flatpak、Firejail、Snap)—— 使用 Bind Mount + Seccomp/AppArmor
- 基于系统调用过滤(Seccomp)—— 拦截
open、access、stat调用 - 系统级强制访问控制(MAC)—— SELinux / AppArmor
- 文件系统虚拟化(FUSE + OverlayFS)—— 制造“假”目录
- 虚拟机沙箱(如 QEMU、VirtualBox)—— 物理隔离
- 总结:推荐组合(针对容器化或应用沙箱)
在沙箱(Sandbox)环境中限制对主机私密文件夹的访问,通常通过操作系统级权限控制、文件系统虚拟化、命名空间隔离或强制访问控制来实现,具体方法取决于你使用的沙箱类型(如应用沙箱、容器沙箱、虚拟机沙箱)。
以下是几种主流实现方式及其原理:
Linux 容器沙箱(如 Docker、Podman)—— 使用 Mount Namespace + 只读绑定
这是最常用的方法,容器的文件系统是隔离的,主机文件夹只有在显式挂载时才会可见。
- 限制方式: 只挂载必要的目录,绝对不挂载
/home、/root、/etc、/var/run/docker.sock等敏感路径。 - 配置示例(Docker):
docker run --rm -it \ # 挂载一个临时目录,而不是主机的 /home -v /tmp/sandbox_data:/sandbox/data:ro \ # 阻止挂载敏感目录 --security-opt no-new-privileges \ ubuntu bash
- 进阶:使用
--volumes-from或--mount的readonly选项。 - 警告: 永远不要挂载
/proc、/sys、/dev的主机版本,除非你绝对信任沙箱。
应用沙箱(如 Flatpak、Firejail、Snap)—— 使用 Bind Mount + Seccomp/AppArmor
这类沙箱通过内核机制(如 Namespace、Seccomp、AppArmor)对应用的系统调用进行过滤。
-
Firejail: 默认自动禁止所有主机目录,除非用户明确放行。
# 运行应用,默认无法访问 /home firejail firefox # 仅放行下载目录(黑名单模式) firejail --noprofile --private=/tmp/sandbox_home firefox # 或者白名单:只允许访问 ~/Downloads firejail --whitelist=~/Downloads firefox
-
Flatpak: 使用
--filesystem权限控制。# 拒绝所有主机文件访问 flatpak run --nofilesystem=home org.example.app # 只允许访问 ~/Pictures flatpak run --filesystem=~/Pictures:ro org.example.app
基于系统调用过滤(Seccomp)—— 拦截 open、access、stat 调用
即使你忘记了挂载限制,Seccomp 可以在内核层拦截对特定路径的系统调用。
- 原理: 编写一个 BPF 程序,当检测到
open、openat、access等系统调用且路径包含/home、/etc/shadow等敏感关键词时,返回-EACCES(权限拒绝)。 - 实现: 通常由沙箱框架调用(如 Docker 的
--security-opt seccomp=profile.json)。 - 限制: 对路径的匹配可能被绕过(如使用符号链接、
/proc/self/root等),需要配合其他安全措施。
系统级强制访问控制(MAC)—— SELinux / AppArmor
这是最底层、最严格的方式,由内核执行。
-
SELinux 策略: 为沙箱进程定义一个类型(Domain),然后编写策略禁止该类型访问
user_home_t(用户家目录)或shadow_t(密码文件)等敏感类型。# SELinux 策略示例:禁止 sandbox_t 类型访问 user_home_t allow sandbox_t user_home_t:dir { getattr search }; # 严格限制 dontaudit sandbox_t user_home_t:file { read write }; -
AppArmor 配置文件: 编写纯文本的权限文件,明确禁止访问路径。
# 禁止读取 /home 下的任何文件 deny /home/** rwklx, deny /root/** rwklx, deny /etc/shadow r,
文件系统虚拟化(FUSE + OverlayFS)—— 制造“假”目录
你可以为用户进程提供一个完全透明但内容为空或受控的虚拟文件系统。
- OverlayFS(Docker常用): 将主机的
/home放到lowerdir,但将upperdir初始化为空,用户进程只能看到修改层,读不到主机的真实文件。 - FUSE 文件系统(如
bindfs): 将/home映射到一个新目录,但使用--perms和--hide选项隐藏或拒绝访问。bindfs --perms=000 /home /sandbox/mnt/private_home # 此时所有文件权限为 000,任何进程都无法访问
虚拟机沙箱(如 QEMU、VirtualBox)—— 物理隔离
这是最彻底的隔离方式,宿主机和虚拟机之间没有任何共享文件夹,除非显式配置。
- 配置: 不要启用“共享剪贴板”或“共享文件夹”功能。
- 网络: 使用 NAT 模式而非桥接模式,防止虚拟机直接嗅探主机网络。
- 内存: 使用 KSM(内核同页合并)时谨慎,因为理论上可能通过物理内存页内容推断数据。
推荐组合(针对容器化或应用沙箱)
- 默认拒绝一切: 不要自动挂载
/home、/etc、/var。 - 使用只读挂载: 如果需要挂载,加上
ro标志。 - 启用 Seccomp 配置文件: 拦截危险的系统调用(如
ptrace、mount、open_by_handle_at)。 - 配合 AppArmor/SELinux: 为沙箱进程定义一个严格的域(如
docker-default或自定义策略),明确deny /home/** rw。 - 对于高安全性场景: 使用虚拟机而不是容器,且不共享任何文件系统。
最关键的原则:永远不要信任沙箱内的进程,不要将主机私密文件夹以任何可写、可挂载的方式暴露给它。
标签: 权限限制