Landlock作为Linux内核LSM(Linux Security Module)框架的一部分,自5.13版本引入,专为非特权进程设计文件系统沙盒机制。它允许进程主动附加策略,限制自身及子进程对文件系统的访问,而无需root权限或ptrace跟踪。这种设计类似于seccomp的syscall过滤,但聚焦于细粒度FS操作拦截,通过LSM钩子在VFS层生效,避免了传统沙盒如AppArmor/SELinux的复杂配置。
与其他机制相比,Landlock的核心优势在于栈式可组合性和不可逆限制。Seccomp过滤系统调用,无法精确控制FS路径权限(如允许读/home但禁写/etc),而Landlock使用path_beneath规则精确限定子树访问。“Landlock LSM主要给非特权进程提供安全沙盒的能力,比如你可以对一个普通进程,施加自定义的文件系统访问控制策略。” 它与seccomp互补:前者管FS路径,后者管syscall,常在AI工具如Codex中组合使用,形成双层防护。
附加策略的核心流程依赖三个系统调用:landlock_create_ruleset创建规则集FD、landlock_add_rule添加规则、landlock_restrict_self绑定到当前线程。一旦restrict_self,策略不可撤销或扩展,确保最小权限原则。ABI版本控制兼容性:v1仅FS基本权限(READ_FILE|WRITE_FILE),v4扩展网络端口控制,但FS沙盒优先v3(添加MAKE_*权限)。
规则构建参数与清单
构建高效ruleset需关注handled_access_fs位掩码与规则优先级。典型FS权限位:
| 权限位 |
描述 |
适用场景 |
| LANDLOCK_ACCESS_FS_READ_FILE |
读文件/目录 |
只读沙盒 |
| LANDLOCK_ACCESS_FS_WRITE_FILE |
写文件 |
工作区编辑 |
| LANDLOCK_ACCESS_FS_EXECUTE |
执行文件 |
脚本运行 |
| LANDLOCK_ACCESS_FS_MAKE_DIR |
创建目录 |
临时目录生成 |
示例C代码(兼容内核文档):
#include <linux/landlock.h>
#include <sys/syscall.h>
struct landlock_ruleset_attr ruleset_attr = {
.handled_access_fs = LANDLOCK_ACCESS_FS_READ_FILE | LANDLOCK_ACCESS_FS_WRITE_FILE | LANDLOCK_ACCESS_FS_MAKE_DIR,
};
int ruleset_fd = syscall(__NR_landlock_create_ruleset, &ruleset_attr, sizeof(ruleset_attr), LANDLOCK_ABI_VERSION);
struct landlock_path_beneath_attr path_beneath = {
.parent_fd = open("/workspace", O_PATH | O_CLOEXEC),
.allowed_access = LANDLOCK_ACCESS_FS_READ_FILE | LANDLOCK_ACCESS_FS_WRITE_FILE,
};
syscall(__NR_landlock_add_rule, ruleset_fd, LANDLOCK_RULE_PATH_BENEATH, &path_beneath, 0);
syscall(__NR_landlock_restrict_self, ruleset_fd, 0);
Rust绑定(rust-landlock crate)简化ABI处理:
use landlock::{Ruleset, AccessFs, PathBeneath, CompatLevel};
let mut ruleset = Ruleset::default()
.set_compatibility(CompatLevel::Exact)
.handle_access(AccessFs::from_read_write())
.create()
.unwrap()
.add_rule(PathBeneath::new("/workspace"), AccessFs::ReadWrite)
.unwrap();
ruleset.restrict_self().unwrap();
参数优化:
- ABI版本:用LANDLOCK_ABI_VERSION查询内核支持,fallback到v1(BestEffort模式容忍ABI mismatch)。
- 路径FD:O_PATH|O_CLOEXEC打开,避免泄露句柄;多规则按层级添加(根先、子后)。
- 权限最小化:默认deny-all,仅显式allow;嵌套规则继承父权限,但子规则可收紧。
- 阈值:规则数<100避免FD耗尽;/dev/null等特殊路径需RW以防日志失败。
监控与回滚策略
生产部署需监控Landlock生效:
- dmesg/journalctl:grep "landlock: Up and running"确认模块加载。
- 审计:/proc/PID/status中Landlock域ID;strace观察syscall返回-EACCES。
- 指标:暴露拒绝计数(自定义eBPF或fanotify);超时阈值5s,超限fork无沙盒子进程。
回滚清单:
- 预fork无沙盒副本测试。
- 渐进规则:先READ_ONLY,验证通过再加WRITE。
- 组合seccomp:deny connect/bind,阈值network_access=false。
- 失败降级:syscall失败fallback到chroot+capabilities drop。
风险控制:规则不可逆,设计时模拟测试(sandboxer工具:LL_FS_RO/LL_FS_RW环境变量)。内核需CONFIG_LANDLOCK=y;与AppArmor堆叠时,后者优先。
实际落地如Codex CLI:workspace-write模式用Landlock限cwd+tmpdir,seccomp禁网络,平衡安全与开发效率。
资料来源:Linux内核文档(kernel.org/doc/html/next/userspace-api/landlock.html);Landlock.io;rust-landlock GitHub;LWN文章“Landlock Lands In Linux 5.13”。