Landrun:使用 Landlock 沙箱化任何 Linux 进程,无需 root 权限或容器
Zouuup/landrun
使用 Landlock LSM,在安全、非特权的沙箱中运行任何 Linux 进程。 可以将其视为 firejail,但更轻量级、用户友好,并且内置于内核中。
License
GPL-2.0 license 63 stars 2 forks
landrun
使用 Landlock LSM 创建轻量级、安全的沙箱来运行 Linux 进程。 可以将其视为 firejail,但具有内核级安全性,并且开销极低。
功能
- 🔒 使用 Landlock LSM 的内核级安全性
- 🚀 轻量级且快速执行
- 🛡️ 用于目录的细粒度访问控制
- 🔄 支持读写路径
- ⚡ 允许路径的可选执行权限
- 🌐 TCP 网络访问控制(绑定和连接)
演示
要求
- 启用了 Landlock LSM 的 Linux kernel 5.13 或更高版本
- Linux kernel 6.8 或更高版本,用于网络限制(TCP 绑定/连接)
- Go 1.18 或更高版本(用于从源代码构建)
安装
快速安装
go install github.com/zouuup/landrun/cmd/landrun@latest
从源代码
git clone https://github.com/zouuup/landrun.git
cd landrun
go build -o landrun cmd/landrun/main.go
sudo cp landrun /usr/local/bin/
用法
基本语法:
landrun [options] <command> [args...]
选项
--ro <path>
:允许对指定路径进行只读访问(可以指定多次)--rw <path>
:允许对指定路径进行读写访问(可以指定多次)--exec
:允许执行允许路径中的文件--bind-tcp <port>
:允许绑定到指定的 TCP 端口(可以指定多次)--connect-tcp <port>
:允许连接到指定的 TCP 端口(可以指定多次)--best-effort
:使用尽力模式,必要时回退到限制较少的沙箱[默认值:启用]--log-level <level>
:设置日志记录级别(error、info、debug)[默认值:"error"]
重要说明
- 必须使用
--ro
标志显式添加要运行的命令的路径 - 对于系统命令,通常需要包括
/usr/bin
、/usr/lib
和其他系统目录 - 使用
--exec
时,仍然需要使用--ro
指定包含可执行文件的目录 - 网络限制需要 Linux kernel 6.8 或更高版本以及 Landlock ABI v5
--best-effort
标志允许在不支持所有请求的限制的旧内核上进行平稳降级
环境变量
LANDRUN_LOG_LEVEL
:设置日志记录级别(error、info、debug)
示例
- 以只读访问权限运行目录的命令:
landrun --ro /usr/bin --ro /lib --ro /lib64 --ro /path/to/dir ls /path/to/dir
- 运行具有对目录的写入权限的命令:
landrun --ro /usr/bin --ro /lib --ro /lib64 --rw /path/to/dir touch /path/to/dir/newfile
- 运行具有执行权限的命令:
landrun --ro /usr/bin --ro /lib --ro /lib64 --exec /usr/bin/bash
- 使用调试日志记录运行:
landrun --log-level debug --ro /usr/bin --ro /lib --ro /lib64 --ro /path/to/dir ls
- 使用网络限制运行:
landrun --ro /usr/bin --ro /lib --ro /lib64 --bind-tcp 8080 --connect-tcp 53 /usr/bin/my-server
这将允许该程序仅绑定到 TCP 端口 8080 并连接到 TCP 端口 53。
- 运行具有适当权限的 DNS 客户端:
landrun --ro /usr/bin --ro /lib --ro /lib64 --ro /etc/resolv.conf --connect-tcp 53 dig example.com
这允许通过授予对 /etc/resolv.conf 的访问权限并允许连接到端口 53 (DNS) 来进行 DNS 解析。
- 运行具有选择性网络权限的 Web 服务器:
landrun --ro /usr/bin --ro /lib --ro /lib64 --ro /var/www --rw /var/log --bind-tcp 80 --bind-tcp 443 /usr/bin/nginx
安全性
landrun 使用 Linux 的 Landlock LSM 来创建一个安全的沙箱环境。 它提供:
- 文件系统访问控制
- 目录访问限制
- 执行控制
- TCP 网络限制
- 进程隔离
Landlock 是一种访问控制系统,使进程能够安全地限制自身及其未来的子进程。 作为一个可堆叠的 Linux Security Module (LSM),它在现有的系统范围的访问控制之上创建了额外的安全层,有助于减轻应用程序中错误或恶意行为造成的安全影响。
Landlock 访问控制权限
landrun 利用 Landlock 的细粒度访问控制机制,其中包括:
文件特定的权限:
- 执行文件 (
LANDLOCK_ACCESS_FS_EXECUTE
) - 写入文件 (
LANDLOCK_ACCESS_FS_WRITE_FILE
) - 读取文件 (
LANDLOCK_ACCESS_FS_READ_FILE
) - 截断文件 (
LANDLOCK_ACCESS_FS_TRUNCATE
) - 自 Landlock ABI v3 起可用
目录特定的权限:
- 读取目录内容 (
LANDLOCK_ACCESS_FS_READ_DIR
) - 删除目录 (
LANDLOCK_ACCESS_FS_REMOVE_DIR
) - 删除文件 (
LANDLOCK_ACCESS_FS_REMOVE_FILE
) - 创建各种文件系统对象(字符设备、目录、常规文件、套接字等)
- 跨目录引用/重新父文件 (
LANDLOCK_ACCESS_FS_REFER
) - 自 Landlock ABI v2 起可用
网络特定的权限(需要 Linux 6.8+ 和 Landlock ABI v5):
- 绑定到特定的 TCP 端口 (
LANDLOCK_ACCESS_NET_BIND_TCP
) - 连接到特定的 TCP 端口 (
LANDLOCK_ACCESS_NET_CONNECT_TCP
)
局限性
- 您的内核必须支持 Landlock
- 网络限制需要 Linux kernel 6.8+ 和 Landlock ABI v5
- 某些操作可能需要其他权限
- 在沙箱化之前打开的文件或目录不受 Landlock 限制
内核兼容性表
| Feature | Minimum Kernel Version | Landlock ABI Version | | ------------------------------ | ---------------------- | -------------------- | | Basic filesystem sandboxing | 5.13 | 1 | | File referring/reparenting control | 5.17 | 2 | | File truncation control | 6.1 | 3 | | Network TCP restrictions | 6.8 | 5 |
故障排除
如果您收到“权限被拒绝”或类似的错误:
- 确保已使用
--ro
或--rw
添加了所有必要的路径 - 尝试使用
--log-level debug
运行以查看详细的权限信息 - 检查您的系统上是否支持并启用了 Landlock:
grep -E 'landlock|lsm=' /boot/config-$(uname -r)
您应该在输出中看到 CONFIG_SECURITY_LANDLOCK=y
和 lsm=landlock,...
- 对于网络限制,请验证您的内核版本是否为 6.8+ 和 Landlock ABI v5:
uname -r
技术细节
实现
本项目使用 landlock-lsm/go-landlock
包进行沙箱化,该包同时提供文件系统和网络限制。 当前的实现支持:
- 文件和目录的读/写/执行限制
- TCP 端口绑定限制
- TCP 端口连接限制
- 在旧内核上进行平稳降级的尽力模式
尽力模式
使用 --best-effort
(默认启用)时,landrun 将平稳降级为使用当前内核上可用的最佳 Landlock 版本。 这意味着:
- 在 Linux 6.8+ 上:完全的文件系统和网络限制
- 在 Linux 6.1-6.7 上:包括截断的文件系统限制,但没有网络限制
- 在 Linux 5.17-6.0 上:包括文件重新父级的基本文件系统限制,但没有截断控制或网络限制
- 在 Linux 5.13-5.16 上:没有文件重新父级、截断控制或网络限制的基本文件系统限制
- 在旧版 Linux 上:没有限制(禁用沙箱)
未来功能
根据 Linux Landlock API 的功能,我们计划添加:
- 🔒 增强的文件系统控制,具有更细粒度的权限
- 🌐 支持 UDP 和其他网络协议限制(当 Linux kernel 支持时)
- 🔄 进程范围和资源控制
- 🛡️ 随着 Landlock API 中提供的其他安全功能
License
本项目已获得 GNU General Public License v2 的许可
贡献
欢迎贡献! 请随时提交 Pull Request。