Linux 5.15安全特性之landlock

Landlock是一个在Linux内核中实现的安全模型,它允许进程在较低的特权级别下运行,并限制其对内核和系统资源的访问。它提供了一种细粒度的权限控制机制,可以用于创建沙盒环境和隔离敏感操作。

Landlock的实现基于eBPF(Extended Berkeley Packet Filter)技术,在Linux 5.15内核中引入了对Landlock的支持。它使用eBPF程序作为安全策略的表达方式,通过BPF虚拟机执行这些程序来进行权限控制。

具体来说,Landlock通过以下方式实现了权限控制:

  1. Landlock域(landlock_domain)

一个Landlock域定义了一组资源和权限的集合,用于限制进程的访问。每个进程可以属于一个或多个Landlock域。

  1. 资源和权限规则

通过eBPF程序定义资源和权限规则。资源可以是文件系统对象、网络接口或其他内核对象,而权限可以是读、写、执行等操作。这些规则定义了进程对资源的访问级别和方式。

  1. 进程配置

每个进程可以使用`prctl()`系统调用来配置其Landlock域。进程可以将自己置于某个域中,并根据需要添加和删除资源和权限规则。

  1. 执行权限检查

在进程进行操作时,Landlock会进行权限检查,根据规则确定是否允许操作。如果权限检查失败,操作将被拒绝,并返回适当的错误。

要使用Landlock这个新的安全特性,可以按照以下步骤进行:

  1. 确认内核版本

确保Linux内核版本为5.15或更高。

  1. 编写eBPF程序

使用eBPF语言编写适当的程序,定义资源和权限规则。可以使用libbpf库来开发和加载eBPF程序。

  1. 调用prctl()系统调用

在应用程序中使用`prctl()`系统调用来配置进程的Landlock域。可以指定所属的域、添加和删除资源和权限规则。

  1. 测试和调试

在配置Landlock后,测试和调试程序,确保权限控制正常工作,并遵循定义的规则。

如下是一个简单的C代码示例,演示如何使用Landlock来创建一个简单的沙盒。该沙盒将限制进程只能访问特定的目录和文件,并禁止执行外部命令。

首先需要确保系统具备Linux内核版本5.15或更高版本,并且已经安装了libbpf和liblandlock-dev库。

```c

#include <unistd.h>

#include <linux/landlock.h>

#include <sys/syscall.h>

int main() {

// 创建 Landlock 域

int landlock_fd = syscall(SYS_landlock_create_ruleset, 0);

if (landlock_fd < 0) {

perror("Failed to create Landlock ruleset");

return -1;

}

// 添加文件访问规则

struct landlock_ruleset_attr file_rules = {

.rule_types = LANDLOCK_RULE_PATH,

.rules = {

{

.path_beneath = {

.pathname = "/path/to/allowed/directory/*",

.dirname_len = sizeof("/path/to/allowed/directory/") - 1,

},

.rule_type = LANDLOCK_RULE_PATH_BENEATH,

.permissions = LANDLOCK_R__OK,

},

},

.rules_create_flags = 0,

};

int ret = syscall(SYS_landlock_add_rule, landlock_fd, &file_rules, 0);

if (ret < 0) {

perror("Failed to add file access rule");

return -1;

}

// 添加命令执行规则

struct landlock_ruleset_attr exec_rules = {

.rule_types = LANDLOCK_RULE_FILE,

.rules = {

{

.pathname = "/bin/",

.rule_type = LANDLOCK_RULE_SUBPATH,

.permissions = 0, // 禁止执行命令

},

},

.rules_create_flags = 0,

};

ret = syscall(SYS_landlock_add_rule, landlock_fd, &exec_rules, 0);

if (ret < 0) {

perror("Failed to add command execution rule");

return -1;

}

// 将当前进程限制到 Landlock 域

ret = syscall(SYS_landlock_restrict_self, landlock_fd, 0);

if (ret < 0) {

perror("Failed to restrict process to Landlock domain");

return -1;

}

// 在沙盒中执行你的代码

// 注意:无法访问被禁止的目录或执行被禁止的命令

return 0;

}

```

这个示例代码使用了系统调用函数`syscall`,并通过`SYS_landlock_create_ruleset`、`SYS_landlock_add_rule`和`SYS_landlock_restrict_self`指定了Landlock规则,创建了一个Landlock域,并将当前进程限制在该域中。你可以根据自己的需求修改规则,以实现更具体的沙盒行为。请确保以root权限编译并运行该程序以便使用Landlock功能。

相关推荐
AlfredZhao4 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户97183563346610 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪12 小时前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠1 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush41 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5201 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩1 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈1 天前
Unix 与 Linux 异同小叙
linux·服务器·unix
零零信安1 天前
零零信安荣登数世咨询《新质·数字安全专精百强(2026)》暗网情报领域,彰显专业实力与创新引领
安全·网络安全·数据泄露·暗网·零零信安
凡人叶枫1 天前
Effective C++ 条款42:了解 typename 的双重意义
java·linux·服务器·c++