What is SELinux?
What is SELinux?
https://www.redhat.com/en/topics/linux/what-is-selinux#overview
Overview
Security-Enhanced Linux (SELinux) is a security architecture for Linux® systems that allows administrators to have more control over who can access the system. It was originally developed by the United States National Security Agency (NSA) as a series of patches to the Linux kernel using Linux Security Modules (LSM).
SELinux was released to the open source community in 2000, and was integrated into the upstream Linux kernel in 2003.
https://zhuanlan.zhihu.com/p/86813709
Linux下默认的接入控制是DAC,其特点是资源的拥有者可以对他进行任何操作(读、写、执行)。当一个进程准备操作资源时,Linux内核会比较进程和资源的UID和GID,如果权限允许,就可以进行相应的操作。此种方式往往会带来一些问题,如果一个进程是以
root
的身份运行,也就意味着他能够对系统的任何资源进行操作,而且不被限制。 假如我们的软件存在漏洞呢?这个往往是一个灾难性的问题。因此,就引出了另外的一种安全接入控制机制MAC,Linux下的一种现实是SELinux,也就是我们将要讨论的内容。
Mandatory Access Control (MAC)
SELinux 属于MAC的具体实现,增强了Linux系统的安全性。MAC机制的特点在于,资源的拥有者,并不能决定谁可以接入到资源。具体决定是否可以接入到资源,是基于安全策略。而安全策略则是有一系列的接入规则组成,并仅有特定权限的用户有权限操作安全策略。
Linux Security Module
前面两部分介绍了MAC机制和Flask架构,最终SELinux的实现是依赖于Linux提供的Linux Security Module框架简称为LSM。其实LSM的名字并不是特别准确,因为他并不是Linux模块,而是一些列的hook,同样也不提供任何的安全机制。LSM的的重要目标是提供对linux接入控制模块的支持。
Linux Security Module Framework
LSM 在内核数据结构中增加了安全字段,并且在重要的内核代码(系统调用)中增加了hook。可以在hook中注册回调函数对安全字段进行管理,以及执行接入控制。
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/using_selinux/getting-started-with-selinux_using-selinux#introduction-to-selinux_getting-started-with-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/
和其他 Web 服务器目录中上下文的文件和目录(httpd_sys_content_t
)。策略中没有允许规则适用于通常位于/tmp
和/var/tmp/
中的文件,因此不允许访问。因此,当使用 SELinux 时,即使 Apache 被破坏,一个恶意的脚本可以访问它,也无法访问/tmp
目录。如上图所示,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/
目录。
编写自定义 SELinux 策略
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/8/html/using_selinux/writing-a-custom-selinux-policy_using-selinux
SELinux 安全策略是 SELinux 规则的集合。策略是 SELinux 的核心组件,它由 SELinux 用户空间工具载入内核。内核强制使用 SELinux 策略来评估系统中的访问请求。默认情况下,SELinux 拒绝所有请求,但与载入策略中指定的规则对应的请求除外。
每个 SELinux 策略规则都描述了进程和系统资源间的交互:
ALLOW apache_process apache_log:FILE READ;您可以按如下所示读取此示例规则:Apache 进程可以读取其日志文件。在此规则中,
apache_process
和apache_log
是 labels。SELinux 安全策略为进程分配标签并定义与系统资源的关系。这样,策略可将操作系统实体映射到 SELinux 层。