> 当 Docker 太重、Firejail 需要 root,nsjail 提供了一个轻量、灵活且无需特权的进程隔离方案。本文深入剖析其架构原理、实战用法与生产实践。
---
一、nsjail 是什么?
nsjail 是 Google 团队开发的开源 Linux 进程隔离工具,最初为 CTF(Capture The Flag)安全挑战设计,现已广泛应用于服务器端沙箱、网络服务隔离、模糊测试等场景。
核心定位
| 属性 | 详情 |
|---|---|
| 项目地址 | https://github.com/google/nsjail |
| 二进制大小 | ~860KB |
| 运行权限 | 无需 root(user namespaces) |
| 许可证 | Apache 2.0 |
| 首次发布 | 2017年 |
---
二、技术架构:多层隔离的精妙组合
nsjail 并非单一技术,而是整合了 Linux 内核多种隔离机制的"组合拳":
┌─────────────────────────────────────────┐
│ nsjail 隔离层级 │
├─────────────────────────────────────────┤
│ 1. Namespaces(命名空间) │
│ ├── UTS: 主机名隔离 │
│ ├── MOUNT: 文件系统视图隔离 │
│ ├── PID: 进程 ID 隔离 │
│ ├── IPC: 进程间通信隔离 │
│ ├── NET: 网络栈隔离 │
│ ├── USER: 用户权限隔离 │
│ └── CGROUP/TIME: 资源/时间隔离 │
├─────────────────────────────────────────┤
│ 2. Filesystem(文件系统约束) │
│ ├── chroot/pivot_root: 根目录切换 │
│ ├── bind mount: 只读/读写挂载 │
│ └── tmpfs: 临时文件系统 │
├─────────────────────────────────────────┤
│ 3. Resources(资源限制) │
│ ├── cgroups: CPU/内存/IO 限制 │
│ └── rlimits: 文件描述符/进程数限制 │
├─────────────────────────────────────────┤
│ 4. Security(安全过滤) │
│ └── seccomp-bpf: 系统调用白名单 │
└─────────────────────────────────────────┘
Kafel:优雅的 seccomp 策略语言
nsjail 使用 Kafel(Google 另一开源项目)定义系统调用过滤策略,比原生 seccomp 更灵活:
#define ALLOWED_FLAGS (O_RDONLY | O_WRONLY | O_RDWR)
POLICY base {
ALLOW {
read, write, close,
mmap, munmap, brk,
exit, exit_group
}
}
POLICY file_ops {
ALLOW {
openat(dirfd, pathname, flags) {
flags & ALLOWED_FLAGS == flags
}
}
}
USE base, file_ops DEFAULT KILL
支持参数级过滤(如只允许特定 flag 的 openat),这是原生 seccomp 难以实现的。
---
三、四种运行模式
nsjail 提供灵活的执行模式,适应不同场景:
| 模式 | 标志 | 说明 |
|---|---|---|
| LISTEN | -Ml | TCP 服务器模式,每个连接 fork 一个隔离进程 |
| ONCE | -Mo | 单次执行,完成后退出 |
| EXECVE | -Me | 直接执行,无 supervisor |
| RERUN | -Mr | 重复执行,适合 fuzzing |
实战示例
CTF 挑战托管:
./nsjail -Ml --port 8000 --chroot /srv/ctf --user 65534 --group 65534 --time_limit 60 --rlimit_as 128 --rlimit_cpu 10 --seccomp_string 'POLICY ctf { ALLOW { read, write, open, close, mmap, exit_group } } USE ctf DEFAULT KILL' -- /srv/ctf/challenge
带资源限制的后台任务:
./nsjail --cgroup_mem_max $((512*1024*1024)) --cgroup_pids_max 32 --cgroup_cpu_ms_per_sec 800 -- /bin/cpu_intensive_program
---
四、同类产品对比
| 特性 | nsjail | Firejail | Bubblewrap |
|---|---|---|---|
| 无需特权 | ✅ | ❌ (需 SUID) | ✅ |
| chroot | ✅ | ✅ | ❌ |
| cgroups | ✅ | ✅ | ❌ |
| 配置文件 | ✅ (Protobuf) | ✅ | ❌ |
| 预置应用配置 | ❌ | ✅ (900+) | ❌ |
| X11 支持 | ❌ | ✅ | ❌ |
| 二进制大小 | 860KB | 1.7MB | 71KB |
| 主要用途 | 服务器/CTF | 桌面应用 | 容器构建块 |
- nsjail:服务器端隔离、需要精细控制、CTF 托管
- Firejail:桌面 GUI 应用、需要预置配置
- Bubblewrap:极简需求、嵌入其他工具
五、生产环境案例
5.1 Figma 的 RenderServer 隔离
Figma 使用 nsjail 隔离其 C++ 渲染服务:
- 场景:处理用户上传的文件生成缩略图
- 配置:新 user/pid/mount/network 命名空间 + 严格 seccomp 白名单
- 效果:启动时间 ~10-100ms,比 VM 轻量,比纯 seccomp 更易配置
5.2 卫星系统安全(SpaceSec 2024 论文)
研究人员在 CubeSat 卫星系统(SUCHAI、SALSAT)中部署 nsjail:
- 威胁模型:通过无线电模块的输入操纵攻击
- 配置:chroot + 只读挂载 + seccomp-bpf + cgroups
- 结果:成功阻止命令注入漏洞利用,即使攻击者获得代码执行权限也无法突破沙箱
5.3 Windmill 工作流引擎
开源工作流引擎 Windmill 使用 nsjail 隔离用户提交的脚本:
nsjail --config /etc/windmill/nsjail.conf -- /usr/bin/python3 user_script.py
---
六、安全考虑
优势
1. 多层防御:命名空间 + chroot + seccomp + cgroups 组合 2. 无需 root:user namespaces 实现非特权沙箱 3. 细粒度控制:Kafel 支持复杂的系统调用过滤 4. 资源限制:防止 DoS 攻击
潜在风险
| 风险 | 缓解措施 |
|---|---|
| 内核漏洞 | 及时更新内核 |
| 配置错误 | 最小权限原则、审计配置 |
--disable_no_new_privs | 避免使用,除非绝对必要 |
七、快速开始
安装
# Debian/Ubuntu
sudo apt-get install autoconf bison flex gcc g++ git libprotobuf-dev libnl-route-3-dev libtool make pkg-config protobuf-compiler
git clone https://github.com/google/nsjail.git
cd nsjail && make
基础测试
# 隔离 shell(非特权用户映射为沙箱内 root)
./nsjail -Mo --chroot / --user 99999 --group 99999 -- /bin/bash
# 查看当前用户(沙箱内显示 root,实际为 99999)
$ id
uid=0(root) gid=0(root) groups=0(root)
---
八、总结
nsjail 填补了 Docker(太重)和 Firejail(需 root)之间的空白,提供了一个轻量、灵活、无需特权的进程隔离方案。
适用场景:
- ✅ CTF/安全挑战托管
- ✅ 不受信任代码执行(用户提交代码)
- ✅ 网络服务隔离
- ✅ 模糊测试环境
- ✅ 文件处理服务(ImageMagick、文档转换等)
- ❌ 需要完整容器生态(用 Docker)
- ❌ 桌面 GUI 应用(用 Firejail)
参考资源
- 官方仓库:https://github.com/google/nsjail
- 官方文档:https://nsjail.dev/
- Kafel 文档:https://google.github.io/kafel/
- Figma 博客:https://www.figma.com/blog/server-side-sandboxing-containers-and-seccomp/
- SpaceSec 论文:https://arxiv.org/abs/2404.04127
*本文基于公开技术资料整理,如有疏漏欢迎指正。*