Portal:SELinux/Concepts
SELinux 是 Linux 的一个灵活的强制访问控制 (MAC) 系统。这与 UNIX 八进制权限和 ACL 的标准自由裁量访问控制 (DAC) 系统不同,因为在 DAC 系统中,文件的所有者也可以自由更改其 DAC 权限。在 MAC 系统中,即使拥有文件也不足以删除或更改其 MAC 标签。
SELinux 概念
SELinux 规则基于类型强制。它获取当前进程的标签、目标资源的标签以及操作类型的标签,以确定是否应允许当前操作继续。
例如,如果标签为 `unconfined_t` 的进程尝试对标签为 `user_home_t` 的文件执行 `write` 操作,则这是允许的,因为此操作在针对该三元组的规则集中被允许。
但是,如果标签为 `chronyd_t` 的进程尝试对 `user_home_t` 的文件执行 `write` 操作,则会被拒绝,因为 chronyd 进程永远不应该需要写入用户主目录。
这就是像 SELinux 这样的系统为进程提供安全边界以限制其可以执行的操作的方式。
SELinux 中的一个重要概念是转换——将正在运行的进程的标签从源更改为目标的行为。
例如,当你在 shell 中启动一个进程,并且 shell 以 `unconfined_t` 运行,那么不会发生转换,新进程会继承此类型。如果 webserver 被攻击者攻破,那么来自 webserver 上下文 `httpd_t` 的任何新进程也将保持在 `httpd_t` 中。这就是 SELinux 通过阻止进程更改其自身上下文来限制被攻破的进程可以实现的目标的方式。
但是,在某些情况下,我们不想保持在源进程的上下文中。我们需要更改我们的上下文。这需要一个转换。给定一个运行的进程,源类型为 S,以及一个类型为 B 的二进制文件,如果存在 S + B 的转换规则,则该进程将在目标上下文 T 中创建。
例如,systemd 以 `init_t` 运行,当它从标签为 `httpd_exec_t` 的二进制文件启动 webserver 服务时,`init_t` + `httpd_exec_t` 之间存在转换规则,并且结果进程在目标上下文 `httpd_t` 中运行。这些转换对于 SELinux 强制系统如何运行至关重要。