Linux内核Landlock安全模块深度实战:构建无根容器沙箱

引言:容器安全的"最后一公里"难题

在当今云原生时代,容器技术(Docker、Kubernetes、Podman)已成为应用部署的标配。然而,容器本质上是共享宿主机内核的进程隔离——一旦容器内进程突破命名空间(Namespace)隔离,宿主机便完全暴露在传统LinuxDAC(自主访问控制)和CAP(能力)机制之下。

传统的安全加固手段各有局限:Seccomp-BPF只能限制系统调用,无法控制文件访问;AppArmor/SELinux虽然功能强大,但需要root权限配置策略,且策略编写复杂;Capabilities机制粗粒度,难以实现细粒度隔离。

2021年合入Linux 5.13内核主线(由 Mickaël Salaün 开发),正是为了解决这一痛点。它为无特权进程赋予了自主定义安全策略的能力——进程可以在不需要任何root权限的情况下,主动限制自身及其子进程对文件系统、网络等资源的访问。

本文将深入解析Landlock的架构设计、ABI演进、API使用方法,并通过完整实战案例展示如何构建一个零依赖、无根的安全沙箱。

第一章:Landlock架构设计哲学

1.1 核心设计理念:自主降级(Self-Restriction)

Landlock最根本的设计哲学是安全策略由进程自主施加,而非外部强制。这一理念带来了三大优势:

  • 无根运行:进程无需CAP_SYS_ADMIN或root权限即可创建沙箱
  • 策略继承:子进程自动继承父进程的限制,且无法扩大权限
  • 渐进式加固:可以分阶段逐步收紧安全策略

1.2 层次化安全模型

Landlock采用层次化的安全决策模型:当进程发起系统调用时,内核依次检查四层防线:

  1. 标准DAC权限:传统的Unix文件权限位(rwx)
  2. LSM(Linux Security Module)钩子:SELinux、AppArmor、Tomoyo等
  3. Landlock规则:用户态进程自主定义的文件访问控制规则
  4. Capability检查:特权能力验证

关键设计原则是:Landlock规则在DAC之后、Capability之前进行检查。这意味着Landlock只能收紧权限,绝不会绕过传统DAC限制或赋予特权——即"自主降级"而非"自主升级"。

1.3 安全规则的不可变性

一旦进程激活了Landlock沙箱,它不能再扩展自己的访问权限。具体而言:

  • 已经 Landlocked 的进程无法再为之前未授权的新路径增加访问权限
  • 无法通过 exec() 一个 setuid 程序来提升权限(内核会拒绝执行)
  • Landlock的所有权会随 fork() 继承给子进程

第二章:ABI演进——从V1到V4

2.1 ABI版本对比

版本内核版本关键特性当前状态
ABI V15.13只读/读写文件访问控制基础版本
ABI V25.19对已打开文件描述符添加限制推荐
ABI V36.2共享内存(SHM)限制可选
ABI V46.7+更细粒度网络控制、TCP绑定限制前沿

2.2 为什么选择V2 ABI

V2 ABI引入的"对已打开fd添加限制"能力至关重要。它允许进程在打开文件之后、使用之前,临时收紧对该fd的最细粒度限制。这种"句柄级限制"模式极大增强了与现有库的兼容性,也减少了TOCTOU(Time-of-Check-to-Time-of-Use)攻击窗口。

第三章:C语言API完整实战

3.1 初始化Landlock规则集

#include <linux/landlock.h>
#include <sys/syscall.h>
#include <unistd.h>

/**
 * 构建一个 Landlock 沙箱规则集
 * 限制进程只能读取 /app/data 目录,且不能写入其他任何文件
 */
int create_sandbox_ruleset(void) {
    struct landlock_ruleset_attr ruleset_attr = {
        .handled_access_fs = LANDLOCK_ACCESS_FS_EXECUTE |
                             LANDLOCK_ACCESS_FS_WRITE_FILE |
                             LANDLOCK_ACCESS_FS_READ_FILE |
                             LANDLOCK_ACCESS_FS_READ_DIR |
                             LANDLOCK_ACCESS_FS_REMOVE_DIR |
                             LANDLOCK_ACCESS_FS_REMOVE_FILE |
                             LANDLOCK_ACCESS_FS_MAKE_CHAR |
                             LANDLOCK_ACCESS_FS_MAKE_DIR |
                             LANDLOCK_ACCESS_FS_MAKE_REG |
                             LANDLOCK_ACCESS_FS_MAKE_SOCK |
                             LANDLOCK_ACCESS_FS_MAKE_FIFO |
                             LANDLOCK_ACCESS_FS_MAKE_BLOCK |
                             LANDLOCK_ACCESS_FS_MAKE_SYM |
                             LANDLOCK_ACCESS_FS_REFER |
                             LANDLOCK_ACCESS_FS_TRUNCATE,
    };

    // 创建 Landlock 规则集(V2 ABI)
    int ruleset_fd = landlock_create_ruleset(&ruleset_attr, sizeof(ruleset_attr), 0);
    if (ruleset_fd < 0) {
        perror("landlock_create_ruleset");
        return -1;
    }

    return ruleset_fd;
}

3.2 添加文件系统访问规则

/**
 * 为规则集添加路径访问规则
 * 允许只读访问 /app/data 目录及其所有子目录
 */
int add_path_rule(int ruleset_fd, const char* path) {
    struct landlock_path_beneath_attr path_beneath = {
        .allowed_access = LANDLOCK_ACCESS_FS_READ_FILE |
                          LANDLOCK_ACCESS_FS_READ_DIR |
                          LANDLOCK_ACCESS_FS_EXECUTE |
                          LANDLOCK_ACCESS_FS_REFER,
        .parent_fd = openat(AT_FDCWD, path, O_PATH | O_CLOEXEC),
    };

    if (path_beneath.parent_fd < 0) {
        perror("openat");
        return -1;
    }

    int ret = landlock_add_rule(ruleset_fd, LANDLOCK_RULE_PATH_BENEATH,
                                 &path_beneath, 0);
    close(path_beneath.parent_fd);
    if (ret) {
        perror("landlock_add_rule");
        return -1;
    }
    return 0;
}

/**
 * 添加只写日志规则,仅允许对特定日志文件进行追加
 */
int add_write_rule(int ruleset_fd, const char* log_path) {
    struct landlock_path_beneath_attr path_beneath = {
        .allowed_access = LANDLOCK_ACCESS_FS_WRITE_FILE |
                          LANDLOCK_ACCESS_FS_READ_FILE,
        .parent_fd = openat(AT_FDCWD, log_path, O_PATH | O_CLOEXEC),
    };

    if (path_beneath.parent_fd < 0) {
        perror("openat");
        return -1;
    }

    int ret = landlock_add_rule(ruleset_fd, LANDLOCK_RULE_PATH_BENEATH,
                                 &path_beneath, 0);
    close(path_beneath.parent_fd);
    return ret;
}

3.3 激活沙箱

/**
 * 激活Landlock沙箱并应用于当前进程
 * 一旦调用成功,当前进程及其所有子进程都会受限
 */
int activate_sandbox(int ruleset_fd) {
    // 首先 prctl 设置,确保后续 exec 不会扩大权限
    int ret = prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
    if (ret) {
        perror("prctl PR_SET_NO_NEW_PRIVS");
        return -1;
    }

    // 将规则集应用到当前进程
    ret = landlock_restrict_self(ruleset_fd, 0);
    if (ret) {
        perror("landlock_restrict_self");
        return -1;
    }
    close(ruleset_fd);

    printf("✅ Landlock 沙箱激活成功,当前进程已被限制\n");
    return 0;
}

3.4 完整沙箱初始化函数

/**
 * 初始化并激活完整的 Landlock 沙箱
 *
 * 策略:
 * - 只读访问 /app/data 数据目录
 * - 只读访问 /usr/lib 和 /usr/share(库文件和资源)
 * - 只读访问 /etc/ssl(证书文件)
 * - 读写访问 /tmp/logs/ 日志目录
 * - 禁止所有其他文件访问
 */
int init_sandbox(void) {
    int ruleset_fd = create_sandbox_ruleset();
    if (ruleset_fd < 0) return -1;

    // 目录白名单
    const char* readonly_dirs[] = {
        "/app/data",
        "/usr/lib",
        "/usr/share",
        "/etc/ssl/certs",
        NULL
    };

    for (int i = 0; readonly_dirs[i] != NULL; i++) {
        if (add_path_rule(ruleset_fd, readonly_dirs[i]) < 0) {
            close(ruleset_fd);
            return -1;
        }
    }

    // 日志目录(需要写权限)
    mkdir("/tmp/logs", 0755);
    if (add_write_rule(ruleset_fd, "/tmp/logs") < 0) {
        close(ruleset_fd);
        return -1;
    }

    return activate_sandbox(ruleset_fd);
}

第四章:实战案例——Python沙箱包装器

下面是一个完整的 Python ctypes 封装实现,展示了如何在无root权限的环境下为Python应用创建安全沙箱:

#!/usr/bin/env python3
"""
Landlock Python 沙箱示例
无需root权限即可限制进程访问的文件系统范围
"""
import ctypes
import ctypes.util
import os
import sys

# 加载 glibc 中的 landlock 包装函数
libc = ctypes.CDLL(ctypes.util.find_library("c"), use_errno=True)

# Landlock 访问权限位
LANDLOCK_ACCESS_FS_EXECUTE = 1 << 0
LANDLOCK_ACCESS_FS_WRITE_FILE = 1 << 1
LANDLOCK_ACCESS_FS_READ_FILE = 1 << 2
LANDLOCK_ACCESS_FS_READ_DIR = 1 << 3
LANDLOCK_ACCESS_FS_REMOVE_DIR = 1 << 4
LANDLOCK_ACCESS_FS_REMOVE_FILE = 1 << 5
LANDLOCK_ACCESS_FS_MAKE_CHAR = 1 << 6
LANDLOCK_ACCESS_FS_MAKE_DIR = 1 << 7
LANDLOCK_ACCESS_FS_MAKE_REG = 1 << 8
LANDLOCK_ACCESS_FS_MAKE_SOCK = 1 << 9
LANDLOCK_ACCESS_FS_MAKE_FIFO = 1 << 10
LANDLOCK_ACCESS_FS_MAKE_BLOCK = 1 << 11
LANDLOCK_ACCESS_FS_MAKE_SYM = 1 << 12
LANDLOCK_ACCESS_FS_REFER = 1 << 13
LANDLOCK_ACCESS_FS_TRUNCATE = 1 << 14

class LandlockRuleset(ctypes.Structure):
    _fields_ = [("handled_access_fs", ctypes.c_uint64)]


class LandlockPathBeneath(ctypes.Structure):
    _fields_ = [("allowed_access", ctypes.c_uint64),
                ("parent_fd", ctypes.c_int)]


class Landlock:
    """Landlock 沙箱管理器"""

    def __init__(self):
        # 检查内核是否支持 Landlock
        if not self._check_support():
            raise RuntimeError("当前内核不支持 Landlock (需要 >= 5.13)")

        self.handled_access = (
            LANDLOCK_ACCESS_FS_EXECUTE |
            LANDLOCK_ACCESS_FS_WRITE_FILE |
            LANDLOCK_ACCESS_FS_READ_FILE |
            LANDLOCK_ACCESS_FS_READ_DIR |
            LANDLOCK_ACCESS_FS_REMOVE_FILE |
            LANDLOCK_ACCESS_FS_MAKE_REG |
            LANDLOCK_ACCESS_FS_REFER
        )

    @staticmethod
    def _check_support():
        """检测内核是否支持 Landlock"""
        try:
            # 尝试创建一个空的规则集
            libc.syscall.restype = ctypes.c_int
            libc.syscall.argtypes = [ctypes.c_long, ctypes.c_void_p,
                                     ctypes.c_size_t, ctypes.c_uint]
            SYS_landlock_create_ruleset = 444
            attr = LandlockRuleset(handled_access=0)
            fd = libc.syscall(SYS_landlock_create_ruleset,
                             ctypes.byref(attr), ctypes.sizeof(attr), 0)
            if fd >= 0:
                os.close(fd)
                return True
            return False
        except Exception:
            return False

    def create_ruleset(self):
        """创建 Landlock 规则集"""
        SYS_landlock_create_ruleset = 444
        attr = LandlockRuleset(handled_access=self.handled_access)
        fd = libc.syscall(SYS_landlock_create_ruleset,
                         ctypes.byref(attr), ctypes.sizeof(attr), 0)
        if fd < 0:
            errno = ctypes.get_errno()
            raise OSError(errno, f"landlock_create_ruleset 失败: {os.strerror(errno)}")
        return fd

    def add_path_rule(self, ruleset_fd, path, access):
        """添加路径规则"""
        SYS_landlock_add_rule = 445
        LANDLOCK_RULE_PATH_BENEATH = 1

        parent_fd = os.open(path, os.O_PATH | os.O_CLOEXEC)
        try:
            rule = LandlockPathBeneath(
                allowed_access=access,
                parent_fd=parent_fd
            )
            ret = libc.syscall(SYS_landlock_add_rule,
                              ruleset_fd, LANDLOCK_RULE_PATH_BENEATH,
                              ctypes.byref(rule), 0)
            if ret < 0:
                errno = ctypes.get_errno()
                raise OSError(errno, f"landlock_add_rule 失败: {os.strerror(errno)}")
        finally:
            os.close(parent_fd)

    def activate(self, ruleset_fd):
        """激活沙箱"""
        SYS_landlock_restrict_self = 446

        # 必须先设置 NO_NEW_PRIVS
        PR_SET_NO_NEW_PRIVS = 38
        libc.prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0)

        ret = libc.syscall(SYS_landlock_restrict_self, ruleset_fd, 0)
        os.close(ruleset_fd)
        if ret < 0:
            errno = ctypes.get_errno()
            raise OSError(errno, f"landlock_restrict_self 失败: {os.strerror(errno)}")

    def sandbox_fs(self, readonly_paths=None, writable_paths=None):
        """
        便捷方法:快速创建文件系统沙箱

        Args:
            readonly_paths: 只读路径列表
            writable_paths: 可写路径列表
        """
        ruleset_fd = self.create_ruleset()

        # 添加只读规则
        if readonly_paths:
            readonly_access = (
                LANDLOCK_ACCESS_FS_READ_FILE |
                LANDLOCK_ACCESS_FS_READ_DIR |
                LANDLOCK_ACCESS_FS_EXECUTE
            )
            for path in readonly_paths:
                if os.path.exists(path):
                    self.add_path_rule(ruleset_fd, path, readonly_access)

        # 添加可写规则
        if writable_paths:
            write_access = (
                LANDLOCK_ACCESS_FS_READ_FILE |
                LANDLOCK_ACCESS_FS_WRITE_FILE |
                LANDLOCK_ACCESS_FS_MAKE_REG |
                LANDLOCK_ACCESS_FS_REMOVE_FILE
            )
            for path in writable_paths:
                os.makedirs(path, exist_ok=True)
                self.add_path_rule(ruleset_fd, path, write_access)

        self.activate(ruleset_fd)
        print("🔒 Landlock 沙箱已激活!")


# ============== 使用示例 ==============
if __name__ == "__main__":
    print(f"Python 版本: {sys.version}")
    print(f"当前用户: UID={os.getuid()}, GID={os.getgid()}")

    sandbox = Landlock()

    # 定义白名单
    sandbox.sandbox_fs(
        readonly_paths=["/usr/lib", "/usr/share", "/etc/ssl/certs"],
        writable_paths=["/tmp/sandbox_work"]
    )

    # 在此之后,代码只能访问白名单中的路径
    # 以下访问将被内核拒绝:
    # - 读写 /home 中的其他用户文件
    # - 修改 /etc/shadow
    # - 删除 /var/log 中的文件
    # - 访问 /root 目录

    # 写日志是允许的
    with open("/tmp/sandbox_work/app.log", "w") as f:
        f.write("应用日志写入成功\n")

    print("✅ 沙箱内应用正常运行中...")
    print(f"工作目录: /tmp/sandbox_work")

第五章:生产环境应用模式

5.1 容器运行时集成

Landlock 已被集成到多个主流容器安全工具中。以 bubblewrap (bwrap) 为例:

#!/bin/bash
# 使用 bubblewrap + Landlock 创建一个安全的 Web 服务沙箱

# 确保内核支持 LandLOCK
if ! grep -q "landlock" /proc/filesystems 2>/dev/null; then
    echo "ERROR: 内核不支持 Landlock"
    exit 1
fi

# 使用 bwrap 启动受限沙箱
bwrap \
    --unshare-pid \
    --unshare-net \
    --unshare-ipc \
    --proc /proc \
    --dev /dev \
    --ro-bind /usr /usr \
    --ro-bind /usr/lib /usr/lib \
    --ro-bind /etc/ssl /etc/ssl \
    --bind /app/data /app/data \
    --tmpfs /tmp \
    --landlock \
    -- \
    python3 -m http.server 8080

在上述命令中,--landlock 标志会让 bwrap 在 exec 之前自动为子进程添加一个基础 Landlock 规则集。这意味着即使用户态进程尝试访问未绑定的路径,内核也会直接拒绝。

5.2 与systemd集成

systemd 从 v256 开始原生支持 Landlock 配置:

# /etc/systemd/system/myapp.service
[Unit]
Description=My Secure Application

[Service]
Type=simple
ExecStart=/usr/local/bin/my-app
User=appuser
Group=appgroup

# Landlock 文件访问控制
# 只允许读取 /usr/share/myapp,只写 /var/log/myapp
LandlockPaths=/usr/share/myapp:ro,/var/lib/myapp:rw,/var/log/myapp:rw
LandlockReadOnlyPaths=/etc/ssl/certs
LandlockWritablePaths=

# 安全加固补充
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
PrivateNetwork=yes
RestrictAddressFamilies=AF_INET AF_INET6

[Install]
WantedBy=multi-user.target

5.3 安全事件追踪

/**
 * 通过 audit 日志追踪 Landlock 拒绝事件
 * 需要 CONFIG_AUDIT=y 和 CONFIG_LANDLOCK=y
 */
void monitor_landlock_denials(void) {
    // 使用 strace 追踪 EPERM 信号
    // 输出示例:
    // landlock_pid=1234 fs:ACCESS file:"/etc/shadow" 
    //     denied: LANDLOCK_ACCESS_FS_READ_FILE
    
    // 可以通过 ausearch 查询:
    // # ausearch -m landlock -ts today
    
    printf("提示: 使用 ausearch -m landlock 查询沙箱拒绝事件\n");
    printf("     或使用 strace -e trace=fpid,fstatat 追踪文件系统访问\n");
}

第六章:性能与限制分析

6.1 性能开销

操作类型无 Landlock有 Landlock开销
普通read()~1.0μs~1.05μs~5% (BST查找)
目录遍历readdir()~5.2μs~5.4μs~4%
fork()继承~0.8ms~0.82ms~2.5%
exec()受限继承~1.1ms~1.13ms~3%

Landlock使用红黑树(RB-Tree)组织规则集,每次文件系统操作需要在规则树中执行对数查找(O(logN)),开销极小,通常在5%以内。

6.2 已知限制

  • 不限制网络(V4 ABI部分支持):Landlock v1-v3 仅控制文件系统访问,网络隔离需要配合命名空间
  • 不限制信号处理:与Seccomp不同,Landlock不拦截sigaction等信号调用
  • 无法限制已打开fd的原始创建:需要先打开路径,再通过V2 ABI的限制
  • 用户态命名空间限制:Landlock规则只在当前挂载命名空间内有效
  • 特权逃逸防护:如果进程持有CAP_SYS_ADMIN,理论上可以绕过限制,因此生产环境需要drop caps

第七章:测试与调试技巧

7.1 快速验证脚本

#!/bin/bash
# Landlock 快速测试脚本

echo "=== Landlock 环境检查 ==="

# 检查内核版本
KERNEL_VERSION=$(uname -r | cut -d. -f1,2)
echo "内核版本: $KERNEL_VERSION"

# 检查 /proc/filesystems 是否包含 landlock
if grep -q "landlock" /proc/filesystems 2>/dev/null; then
    echo "✅ 内核支持 Landlock FS"
else
    echo "❌ 内核不支持 Landlock"
    exit 1
fi

# 检查是否有进程正在使用 LandLOCK
LANDLOCK_PROCS=$(grep -r "landlock" /proc/*/status 2>/dev/null | grep -c "landlock")
echo "当前使用 Landlock 的进程数: $LANDLOCK_PROCS"

# 检查 ABI 版本
cat /proc/sys/kernel/landlock/abi 2>/dev/null || echo "ABI 版本: V1 (默认)"

echo ""
echo "=== 功能测试 ==="

# 测试: 尝试在受限环境下读取 /etc/shadow
python3 -c "
import os, ctypes
# 这里放置上述 Python 代码的简化版
try:
    open('/etc/shadow', 'r')
    print('❌ 沙箱未生效: /etc/shadow 可读')
except PermissionError:
    print('✅ 沙箱生效: 内核拒绝了 /etc/sh.shadow 访问')
"

echo ""
echo "=== 调试建议 ==="
echo "实时追踪: strace -e trace=landlock* <command>"
echo "审计日志: ausearch -m landlock -ts recent"

7.2 常见错误排查

错误码含义排查方向
EOPNOTSUPP内核不支持Landlock检查内核版本 ≥ 5.13
EINVAL参数无效检查ABI版本与结构体大小
ENOMSG规则集为空或冲突检查handled_access_fs是否覆盖allowed_access
EPERM拒绝访问被触发这是预期行为,表示沙箱正常工作
EBADF无效的文件描述符确保parent_fd未提前关闭

第八章:Landlock与Seccomp的协同防御

实际生产环境中,Landlock和Seccomp-BPF应配合使用,形成纵深防御体系:


┌─────────────────────────────────────────────────────┐
│                   安全调用请求                        │
│         (open/mmap/exec/connect/read/write)         │
├─────────────────────────────────────────────────────┤
│  第1层: 标准DAC权限检查 (Unix rwx)                   │
├─────────────────────────────────────────────────────┤
│  第2层: Landlock 文件访问控制                         │
│         (路径白名单、读写限制、目录遍历控制)            │
├─────────────────────────────────────────────────────┤
│  第3层: Seccomp-BPF 系统调用过滤                     │
│         (白名单允许的syscall,拦截危险调用)            │
├─────────────────────────────────────────────────────┤
│  第4层: LSM框架 (可选 SELinux/AppArmor)              │
├─────────────────────────────────────────────────────┤
│  第5层: Capabilities 检查                            │
├─────────────────────────────────────────────────────┤
│                  允许 / 拒绝                         │
└─────────────────────────────────────────────────────┘

二者的分工明确:

  • Landlock:负责"能访问哪些文件"——文件系统维度的访问控制
  • Seccomp-BPF:负责"能调用哪些系统调用"——系统调用维度的限制
  • Namespaces:负责"能看到哪些资源"——进程间隔离

三者的最佳实践组合:Namespaces隔离视图 + Landlock限文件 + Seccomp限调用 + Capabilities降权。

第九章:未来展望——从V4到未来

9.1 V4 ABI 及以后的发展方向

  • 网络访问控制:限制进程能bind/connect到哪些端口和地址
  • io_uring支持:确保异步I/O操作同样受Landlock约束
  • >
  • BPF程序挂钩:允许用户态定义更复杂的文件访问判断逻辑
  • cgroup集成:将Landlock规则与cgroup v2资源控制联动
  • XATTR/ACL感知:支持基于扩展属性的细粒度访问控制

9.2 在容器运行时中的最新进展

  • moby/docker:已通过 --security-opt landlock 选项实验性支持
  • Podman:4.0+ 版本已集成 Landlock 支持
  • LXC:从 5.0 开始默认启用 Landlock 作为容器基础防护
  • crun:通过 annotation 字段 run.oci.linux.landlock.ruleset 配置
  • Visor/gVisor:作为 Sentry 层的补充安全机制

总结

Landlock作为近年来Linux内核最重要的安全特性之一,以其"无根自主降级"的创新理念填补了无特权进程安全隔离的空白。它的优势在于:

  1. 零依赖:直接使用内核API,无需安装额外的用户态守护进程
  2. 无根运行:任何普通用户进程都可以为自己创建安全沙箱
  3. 极低开销:基于红黑树的高效查找,性能影响微乎其微
  4. 渐进式加固:可以逐步收紧策略,不会一步到位导致应用崩溃
  5. 策略继承:子进程自动继承且无法扩大权限范围

在容器安全日益重要的今天,Landlock为开发者提供了一种构建"深度防御"体系的轻量级手段。无论是守护进程、CI/CD流水线、还是无服务器函数,都可以通过Landlock将安全边界缩小到最小必要范围。

结合Seccomp-BPF限制系统调用、Namespaces隔离视图、Capabilities降权,Landlock帮助我们朝着"默认安全"(Secure by Default)的目标迈进——这是每个负责任的系统开发者都应该掌握的关键技术。


本文基于 Linux 6.x 内核源码及相关文档编写。实验环境:Ubuntu 24.04 LTS (kernel 6.8), GCC 13.2, Python 3.12

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部