Zouuup/landrun

使用 Landlock LSM,在安全、非特权的沙箱中运行任何 Linux 进程。 可以将其视为 firejail,但更轻量级、用户友好,并且内置于内核中。

License

GPL-2.0 license 63 stars 2 forks

landrun

使用 Landlock LSM 创建轻量级、安全的沙箱来运行 Linux 进程。 可以将其视为 firejail,但具有内核级安全性,并且开销极低。

功能

演示

landrun demo

要求

安装

快速安装

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...]

选项

重要说明

环境变量

示例

  1. 以只读访问权限运行目录的命令:
landrun --ro /usr/bin --ro /lib --ro /lib64 --ro /path/to/dir ls /path/to/dir
  1. 运行具有对目录的写入权限的命令:
landrun --ro /usr/bin --ro /lib --ro /lib64 --rw /path/to/dir touch /path/to/dir/newfile
  1. 运行具有执行权限的命令:
landrun --ro /usr/bin --ro /lib --ro /lib64 --exec /usr/bin/bash
  1. 使用调试日志记录运行:
landrun --log-level debug --ro /usr/bin --ro /lib --ro /lib64 --ro /path/to/dir ls
  1. 使用网络限制运行:
landrun --ro /usr/bin --ro /lib --ro /lib64 --bind-tcp 8080 --connect-tcp 53 /usr/bin/my-server

这将允许该程序仅绑定到 TCP 端口 8080 并连接到 TCP 端口 53。

  1. 运行具有适当权限的 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 解析。

  1. 运行具有选择性网络权限的 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 来创建一个安全的沙箱环境。 它提供:

Landlock 是一种访问控制系统,使进程能够安全地限制自身及其未来的子进程。 作为一个可堆叠的 Linux Security Module (LSM),它在现有的系统范围的访问控制之上创建了额外的安全层,有助于减轻应用程序中错误或恶意行为造成的安全影响。

Landlock 访问控制权限

landrun 利用 Landlock 的细粒度访问控制机制,其中包括:

文件特定的权限:

目录特定的权限:

网络特定的权限(需要 Linux 6.8+ 和 Landlock ABI v5):

局限性

内核兼容性表

| 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 |

故障排除

如果您收到“权限被拒绝”或类似的错误:

  1. 确保已使用 --ro--rw 添加了所有必要的路径
  2. 尝试使用 --log-level debug 运行以查看详细的权限信息
  3. 检查您的系统上是否支持并启用了 Landlock:
grep -E 'landlock|lsm=' /boot/config-$(uname -r)

您应该在输出中看到 CONFIG_SECURITY_LANDLOCK=ylsm=landlock,...

  1. 对于网络限制,请验证您的内核版本是否为 6.8+ 和 Landlock ABI v5:
uname -r

技术细节

实现

本项目使用 landlock-lsm/go-landlock 包进行沙箱化,该包同时提供文件系统和网络限制。 当前的实现支持:

尽力模式

使用 --best-effort(默认启用)时,landrun 将平稳降级为使用当前内核上可用的最佳 Landlock 版本。 这意味着:

未来功能

根据 Linux Landlock API 的功能,我们计划添加:

License

本项目已获得 GNU General Public License v2 的许可

贡献

欢迎贡献! 请随时提交 Pull Request。