第 1 章 简介
SELinux(Security Enhanced Linux)提供了一个额外的系统安全层。SELinux 从根本上回答问题:"May <subject> do <action> to <object>",例如:"Web 服务器访问用户主目录中的文件吗?"
基于用户、组和其他权限(称为 Discretionary Access Control(DAC))的标准访问策略不允许系统管理员创建全面而精细的安全策略,例如限制特定应用程序仅查看日志文件,同时允许其他应用程序将新数据附加到日志文件
SELinux 使用强制访问控制(Mandatory Access Control,简称 MAC)。每个进程和系统资源都有一个特殊的安全标签,称为 SELinux 上下文。SELinux 上下文有时称为 SELinux 标签,它是一个提取系统级别细节并专注于实体的安全属性的标识符。这不仅提供了在 SELinux 策略中引用对象的一种一致方法,而且消除了在其他身份识别方法中可能存在的任何不确定性;例如,文件在利用绑定挂载的系统中可以有多个有效的路径名称。
SELinux 策略在一系列规则中使用这些上下文,它们定义进程如何相互交互以及与各种系统资源进行交互。默认情况下,策略不允许任何交互,除非规则明确授予了相应的权限。
注意
务必要记住,在 DAC 规则后检查 SELinux 策略规则。如果 DAC 规则已拒绝了访问,则不会使用 SELinux 策略规则。这意味着,如果传统的 DAC 规则已阻止了访问,则不会在 SELinux 中记录拒绝信息。
SELinux 上下文包括以下字段: user(用户)、role(角色)、type(类型)和 security level(安全级别)。在 SELinux 策略中,SELinux 类型信息可能是最重要的。这是因为,最常用的、用于定义允许在进程和系统资源间进行的交互的策略规则会使用 SELinux 类型而不是 SELinux 的完整上下文。SELinux 类型通常以
_t
结尾。例如,Web 服务器的类型名称为 httpd_t
。通常位于 /var/www/html/
中的文件和目录的类型上下文是 httpd_sys_content_t
。通常位于 /tmp
and /var/tmp/
中的文件和目录的类型上下文是 tmp_t
。Web 服务器端口的类型上下文是 http_port_t
。
例如,有一个策略规则允许 Apache (作为
httpd_t
运行的 Web 服务器进程)访问通常位于 /var/www/html/
中上下文的文件和目录(httpd_sys_content_t
)。策略中没有允许规则适用于通常位于 /tmp
和 /var/tmp/
中的文件,因此不允许访问。因此,当使用 SELinux 时,即使 Apache 被破坏,一个恶意的脚本可以访问它,也无法访问 /tmp
目录。
图 1.1. SELinux 允许以 httpd_t 身份运行的 Apache 进程访问 /var/www/html/ 目录,并且它拒绝同一进程访问 /data/mysql/ 目录,因为 httpd_t 和 mysqld_db_t 类型上下文没有允许规则。另一方面,作为 mysqld_t 运行的 MariaDB 进程能够访问 /data/mysql/ 目录,SELinux 也正确拒绝类型为 mysqld_t 的进程,以访问标记为 httpd_sys_content_t 的 /var/www/html/ 目录。

[D]
其它资源
如需更多信息,请参阅以下文档:
selinux (8)
手册页和 apropos selinux 命令列出的 man page。
1.1. 运行 SELinux 的好处
SELinux 提供以下优点:
- 所有进程和文件都被标记。SELinux 策略规则定义了进程如何与文件交互,以及进程如何相互交互。只有存在明确允许的 SELinux 策略规则时,才能允许访问。
- 精细访问控制。传统的 UNIX 通过用户的授权、基于 Linux 的用户和组进行控制。而 SELinux 的访问控制基于所有可用信息,如 SELinux 用户、角色、类型以及可选的安全级别。
- SELinux 策略由系统管理员进行定义,并在系统范围内强制执行。
- 改进了权限升级攻击的缓解方案。进程在域中运行,因此是相互分离的。SELinux 策略规则定义了如何处理访问文件和其它进程。如果某个进程被破坏,攻击者只能访问该进程的正常功能,而且只能访问已被配置为可以被该进程访问的文件。例如:如果 Apache HTTP 服务器被破坏,攻击者无法使用该进程读取用户主目录中的文件,除非添加或者配置了特定的 SELinux 策略规则允许这类访问。
- SELinux 可以用来强制实施数据机密性和完整性,同时保护进程不受不可信输入的影响。
但是,SELinux 本身并不是:
- 防病毒软件,
- 用来替换密码、防火墙和其它安全系统,
- 多合一的安全解决方案。
SELinux 旨在增强现有的安全解决方案,而不是替换它们。即使运行 SELinux,也务必要继续遵循良好的安全实践,例如保持软件更新、使用难以猜测的密码或防火墙。