|
| 1 | +.. SPDX-License-Identifier: GPL-2.0 |
| 2 | +.. Copyright ? 2017-2020 Micka?l Salaün <mic@digikod.net> |
| 3 | +.. Copyright ? 2019-2020 ANSSI |
| 4 | +.. include:: ../disclaimer-zh_CN.rst |
| 5 | + |
| 6 | +:Original: Documentation/security/landlock.rst |
| 7 | + |
| 8 | +:翻译: |
| 9 | + |
| 10 | + 毛玉贤 Yuxian Mao <maoyuxian@cqsoftware.com.cn> |
| 11 | + |
| 12 | +====================== |
| 13 | +Landlock LSM: 内核文档 |
| 14 | +====================== |
| 15 | + |
| 16 | +:作者: Mickaël Salaün |
| 17 | +:日期: 2022年12月 |
| 18 | + |
| 19 | +Landlock的目标是创建有范围的访问控制(即沙箱机制)。为了增强整个 |
| 20 | +系统的安全性,此功能应适用于任何进程,包括非特权进程。因为这些进 |
| 21 | +程可能被攻击或植入后门(即不可信任的),所以从内核和其他进程的角 |
| 22 | +度来看,Landlock的功能必须安全可用。因此,Landlock 的接口设计应当 |
| 23 | +尽量减少可能的攻击点。 |
| 24 | + |
| 25 | +Landlock 旨在为非特权进程使用,同时遵循由其他访问控制机制(例如 DAC、LSM) |
| 26 | +强制执行的系统安全策略。Landlock 规则不应与系统上强制执行的其他访问 |
| 27 | +控制相冲突,而只能添加额外的限制。 |
| 28 | + |
| 29 | +任何用户都可以在其进程上强制执行Landlock规则集。这些规则集会以一种 |
| 30 | +确保只能添加更多约束的方式与继承的规则集合并和评估。 |
| 31 | + |
| 32 | + |
| 33 | +用户空间文档如下: |
| 34 | +Documentation/userspace-api/landlock.rst. |
| 35 | + |
| 36 | +安全访问控制机制指导原则 |
| 37 | +======================== |
| 38 | + |
| 39 | +* Landlock规则应侧重于对内核对象的访问控制,而非系统调用过滤(即 |
| 40 | + 系统调用参数),后者是seccomp-bpf要侧重的。 |
| 41 | +* 为了避免多种侧信道攻击(例如安全策略泄露、基于CPU的攻击),Landlock |
| 42 | + 规则不应与用户空间进行程序化通信。 |
| 43 | +* 内核访问检查不应降低未沙盒化进程的访问请求速度。 |
| 44 | +* 与 Landlock 操作相关的计算(例如强制执行规则集)应仅影响请求这些 |
| 45 | + 操作的进程。 |
| 46 | +* 由沙盒化进程直接从内核中获得的资源(例如文件描述符)在被任何进程 |
| 47 | + 使用时,都应保留其获取时的作用域访问权限。 |
| 48 | + Cf. `文件描述符访问权限`_. |
| 49 | + |
| 50 | +设计选择 |
| 51 | +======== |
| 52 | + |
| 53 | +inode访问权限 |
| 54 | +------------- |
| 55 | + |
| 56 | +所有访问权限都与inode以及通过inode所访问到的内容相关。读取目录的 |
| 57 | +内容并不意味着有权读取该目录中列出的 inode 所对应文件的内容。实际 |
| 58 | +上,文件名是相对于其父目录而言的 ,一个 inode 可以通过多个文件名 |
| 59 | +(通过硬链接)来引用。删除文件链接这一操作仅直接影响对应目录,而 |
| 60 | +对被移除链接的inode并无影响。这就是“LANDLOCK_ACCESS_FS_REMOVE_FILE” |
| 61 | +(文件系统移除文件访问权限)或“LANDLOCK_ACCESS_FS_REFER” (文件系 |
| 62 | +统引用访问权限)不能与文件绑定,而只能与目录绑定的原因。 |
| 63 | + |
| 64 | +文件描述符访问权限 |
| 65 | +------------------ |
| 66 | + |
| 67 | +在打开文件时,会检查访问权限并将其与文件描述符绑定。其基本原则是, |
| 68 | +当在相同的 Landlock 域下执行时,等效的操作序列会产生相同的结果。 |
| 69 | +以LANDLOCK_ACCESS_FS_TRUNCATE权限为例,如果相关的文件层次结构没有 |
| 70 | +授予该访问权限,那么可能允许打开一个文件进行写操作,但不允许使用 |
| 71 | +ftruncate调用截断由此产生的文件描述符。 |
| 72 | +以下操作序列具有相同的语义,因此会产生相同的结果: |
| 73 | + |
| 74 | +* ``truncate(path);`` |
| 75 | +* ``int fd = open(path, O_WRONLY); ftruncate(fd); close(fd);`` |
| 76 | + |
| 77 | +与文件访问模式类似(例如O_RDWR),即使文件描述符在进程之间传递 |
| 78 | +(例如通过Unix域套接字),文件描述符中的Landlock访问权限也会被保留。 |
| 79 | +这些访问权限即使在接收进程未被 Landlock 沙盒化的情况下也会被强制执行。 |
| 80 | +事实上,这是为了保持整个系统访问控制的一致性,避免通过文件描述符传递 |
| 81 | +而无意中绕过安全限制(即“混淆代理攻击”)。 |
| 82 | + |
| 83 | +测试 |
| 84 | +==== |
| 85 | + |
| 86 | +用户空间的向后兼容性测试、ptrace 限制测试和文件系统支持测试可以在这里 |
| 87 | +找到:tools/testing/selftests/landlock/ |
| 88 | + |
| 89 | +内核结构 |
| 90 | +======== |
| 91 | + |
| 92 | +对象 |
| 93 | +---- |
| 94 | + |
| 95 | +该API在以下内核代码中: |
| 96 | + |
| 97 | +security/landlock/object.h |
| 98 | + |
| 99 | +文件系统 |
| 100 | +-------- |
| 101 | + |
| 102 | +该API在以下内核代码中: |
| 103 | + |
| 104 | +security/landlock/fs.h |
| 105 | + |
| 106 | +规则集和域 |
| 107 | +---------- |
| 108 | + |
| 109 | +域是与一组主体(即任务凭证)关联的只读规则集。每次在任务上执行规则集时, |
| 110 | +都会复制当前域,并在新域中导入规则集作为新的规则层。 事实上,一旦进入 |
| 111 | +一个域,每条规则都与一个层级绑定。要授予对对象的访问权限,每一层中至少 |
| 112 | +有一条规则必须允许对该对象执行请求操作。然后,任务只能过渡到一个新的域, |
| 113 | +该新域是当前域的约束和任务提供的规则集的约束的交集。任务自行沙盒化时, |
| 114 | +主体的定义是隐式的,这使得推理变得更加简单,并有助于避免陷阱。 |
| 115 | + |
| 116 | +该API在以下内核代码中: |
| 117 | + |
| 118 | +security/landlock/ruleset.h |
| 119 | + |
| 120 | +.. Links |
| 121 | +.. _tools/testing/selftests/landlock/: |
| 122 | + |
| 123 | +https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/tools/testing/selftests/landlock/ |
0 commit comments