首页
/ StarFive Linux中的Landlock无特权访问控制机制深度解析

StarFive Linux中的Landlock无特权访问控制机制深度解析

2025-06-19 02:41:31作者:范垣楠Rhoda

什么是Landlock?

Landlock是Linux内核中的一种安全模块,它允许进程(包括无特权进程)自主限制自身的系统访问权限。这种机制通过创建安全沙箱层来实现,能够有效降低用户空间应用程序中漏洞或恶意行为带来的安全风险。

Landlock的核心特性

Landlock具有以下几个关键特性:

  1. 无特权使用:普通用户进程无需root权限即可使用
  2. 堆叠式设计:可以与系统现有的访问控制机制协同工作
  3. 继承性:子进程会自动继承父进程的访问限制
  4. 渐进式限制:只能增加限制,不能减少已有限制

Landlock规则类型

Landlock目前支持两种主要规则类型:

文件系统规则

控制对文件层次结构的访问,可细分为多种访问权限:

  • 文件读写(LANDLOCK_ACCESS_FS_READ_FILE/WRITE_FILE)
  • 目录操作(LANDLOCK_ACCESS_FS_READ_DIR/REMOVE_DIR)
  • 文件创建(LANDLOCK_ACCESS_FS_MAKE_*系列)
  • 特殊操作(LANDLOCK_ACCESS_FS_REFER/TRUNCATE等)

网络规则(ABI v4+)

控制TCP端口访问:

  • 绑定端口(LANDLOCK_ACCESS_NET_BIND_TCP)
  • 连接端口(LANDLOCK_ACCESS_NET_CONNECT_TCP)

实战:创建并实施安全策略

下面通过一个完整示例展示如何使用Landlock创建安全策略:

// 1. 定义规则集属性
struct landlock_ruleset_attr ruleset_attr = {
    .handled_access_fs = LANDLOCK_ACCESS_FS_EXECUTE |
                        LANDLOCK_ACCESS_FS_READ_FILE |
                        LANDLOCK_ACCESS_FS_READ_DIR,
    .handled_access_net = LANDLOCK_ACCESS_NET_CONNECT_TCP
};

// 2. 创建规则集
int ruleset_fd = landlock_create_ruleset(&ruleset_attr, 
                                       sizeof(ruleset_attr), 0);

// 3. 添加文件系统规则
struct landlock_path_beneath_attr path_beneath = {
    .allowed_access = LANDLOCK_ACCESS_FS_READ_FILE |
                     LANDLOCK_ACCESS_FS_READ_DIR,
    .parent_fd = open("/usr", O_PATH | O_CLOEXEC)
};
landlock_add_rule(ruleset_fd, LANDLOCK_RULE_PATH_BENEATH, 
                 &path_beneath, 0);

// 4. 添加网络规则
struct landlock_net_port_attr net_port = {
    .allowed_access = LANDLOCK_ACCESS_NET_CONNECT_TCP,
    .port = 443
};
landlock_add_rule(ruleset_fd, LANDLOCK_RULE_NET_PORT, &net_port, 0);

// 5. 限制特权提升
prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);

// 6. 应用规则集
landlock_restrict_self(ruleset_fd, 0);
close(ruleset_fd);

这个例子创建了一个规则集,它:

  1. 允许读取/usr目录下的文件
  2. 允许连接到443端口(HTTPS)
  3. 禁止所有其他文件系统和网络操作

最佳实践指南

  1. 最小权限原则:只授予必要的最小访问权限
  2. 分层控制:尽量在文件层次结构的叶子节点设置权限
  3. 版本兼容:检查Landlock ABI版本并适当降级功能
  4. 自包含目录:确保目录权限不依赖其父目录位置
  5. 明确truncate权限:与写权限分开考虑,避免意外行为

高级主题

策略层级叠加

每次执行landlock_restrict_self()都会在现有策略上叠加新层。最终权限是所有层级策略的交集。

文件系统特殊考虑

  • 绑定挂载:权限会跟随绑定挂载传播
  • OverlayFS:各层被视为独立文件系统,策略不会自动传播

进程间交互限制

Landlock自动限制沙箱进程对非沙箱进程的ptrace操作。此外,可以通过作用域(scope)机制进一步限制:

  • 抽象UNIX套接字通信(LANDLOCK_SCOPE_ABSTRACT_UNIX_SOCKET)
  • 信号发送(LANDLOCK_SCOPE_SIGNAL)

文件描述符特殊行为

某些权限(如截断和ioctl)与文件描述符绑定,而不是进程。这意味着:

  • 不同fd对同一文件可能有不同权限
  • 跨进程传递fd会保持其Landlock属性

兼容性设计

Landlock采用显式的访问权限位图设计,确保:

  • 系统更新不会意外收紧现有沙箱策略
  • 开发者可以明确检查并适应不同内核版本的功能

通过landlock_create_ruleset(NULL, 0, LANDLOCK_CREATE_RULESET_VERSION)可以查询当前ABI版本,开发者应当根据版本号启用相应功能。

总结

StarFive Linux中的Landlock机制为系统安全提供了强大的无特权沙箱能力。通过精细的文件系统和网络控制,结合良好的分层设计,开发者可以构建灵活而安全的应用隔离环境。理解其核心概念、掌握最佳实践并注意特殊边界情况,是有效使用Landlock的关键。

登录后查看全文
热门项目推荐

项目优选

收起
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
179
263
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
871
515
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
131
184
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
346
380
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
334
1.09 K
harmony-utilsharmony-utils
harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。
ArkTS
31
0
CangjieCommunityCangjieCommunity
为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0
kernelkernel
deepin linux kernel
C
22
5
WxJavaWxJava
微信开发 Java SDK,支持微信支付、开放平台、公众号、视频号、企业微信、小程序等的后端开发,记得关注公众号及时接受版本更新信息,以及加入微信群进行深入讨论
Java
829
22
cherry-studiocherry-studio
🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
603
58