核心是通过mount namespace隔离视图、seccomp过滤系统调用、只读挂载切断写入,三者协同实现“看不见、改不了、写不进”;ProtectSystem=strict和ProtectHome=read-only基于命名空间实现进程级文件系统隔离,ReadOnlyPaths/ReadWriteDirectories精准控制读写范围,seccomp-bpf在内核态拦截openat等调用并配合NoNewPrivileges=yes防绕过,InaccessiblePaths和RestrictAddressFamilies补全边界防护。

核心是让服务进程“看不见、改不了、写不进”不该碰的资源——不是靠 chmod 拦截,而是用 mount namespace 隔离视图、seccomp 过滤系统调用、只读挂载切断写入能力,三者协同才能真正落地。
用 ProtectSystem 和 ProtectHome 锁定关键路径
这两个参数直接基于 mount namespace 实现进程级文件系统视图隔离:
-
ProtectSystem=strict:把
/usr、/boot、/etc在服务的命名空间中以只读方式 bind-mount,root 也无法修改二进制、内核镜像或配置文件 -
ProtectHome=read-only:将
/home、/root、/run/user设为只读;设为yes则直接隐藏(open 返回 ENOENT) - 它们不依赖文件权限,而是从挂载层面移除写入可能,即使进程有 CAP_SYS_ADMIN 也无效
按需放开写入,避免全局只读失败
全盘只读(ReadOnlyFileSystem=yes)几乎必然导致服务启动失败。应采用“默认只读 + 显式放行”策略:
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 用 ReadOnlyPaths=/var/log /opt/myapp/conf 精确锁定只读目录(路径必须存在,可配合
RuntimeDirectory=预创建) - 用 ReadWriteDirectories=/var/lib/myapp /run/myapp 显式开放业务必需的可写路径;比
RWPaths=更安全,因它检查父目录权限 - 对临时数据,优先用 TemporaryFileSystem=/tmp:mode=0755 挂载 tmpfs,重启即清空,不落盘也不绕过只读控制
用 seccomp-bpf 拦截高危系统调用
mount namespace 解决“看不着”,seccomp 解决“打不开”——它在内核态拦截 openat、execve 等调用,比用户态判断更底层:
- 编写 BPF 规则,在
openat()执行前检查 pathname 参数;若匹配/etc/shadow或/home/*/ssh,直接返回-EPERM - 必须配合 NoNewPrivileges=yes 使用,否则进程可通过 execve 加载新 seccomp 策略绕过
- 路径字符串在用户空间,BPF 需用
bpf_probe_read_user()安全读取,不能直接解引用指针
用 InaccessiblePaths 和 RestrictAddressFamilies 补齐边界
有些访问会绕过文件系统层,需额外封堵:
-
InaccessiblePaths=/dev/sdb /proc/kcore:将设备或敏感伪文件挂载为空目录,
open("/dev/sdb")直接返回 ENOENT -
RestrictAddressFamilies=AF_UNIX AF_INET AF_INET6:禁用
AF_NETLINK、AF_PACKET等,防止通过 netlink 查询块设备状态或抓包提权 - 若服务真需某设备(如
/dev/sg0),再用 DeviceAllow=/dev/sg0 rwm 显式授权,并配RestrictDevices=true关闭自动暴露

















