- SELinux 基于策略和上下文强制执行访问控制,在传统的 Unix 权限基础上增加了一层关键的强化措施。
- 有效的配置需要正确地标记文件系统,选择合适的模式(宽松/强制),并在不削弱基本策略的情况下调整布尔值和模块。
- SELinux 与 RHEL、Fedora、SUSE 和 openSUSE 的集成可以减轻许多 CVE 的影响,并限制 Web 服务器、容器和网络守护程序等服务。
- 通过自动化加固和系统地使用日志和 audit2allow 等工具,可以更容易地在生产环境中保持 SELinux 的运行,而不会牺牲稳定性。

在为生产环境搭建 Linux 服务器时,其默认配置通常相当开放。它的设计目的是为了…… 一切都应该第一次就完美运行,而不是像个地堡一样。这时,SELinux 就发挥了关键的加固作用:它增加了一层控制,即使典型的防御措施(文件权限、防火墙等)失效,它也能继续工作。 更新) 失败。
SELinux 乍看之下可能比较枯燥,但一旦掌握了它的基本原理,它就会成为一个强大的工具。 遏制漏洞利用,减少损失,并达到安全标准 例如CIS、PCI DSS或高关键性环境。该系统并非依赖应用程序的良好运行,而是强制每个进程在非常具体的限制范围内运行。
什么是 SELinux?它为何对 Linux 系统加固至关重要?
安全增强型 Linux 是一种 基于强制访问控制的Linux内核安全扩展 (MAC)。与经典的 Unix 自主访问控制(DAC)不同,在 DAC 中,文件所有者决定谁可以访问,而在 SELinux 中,规则由中央策略决定。 甚至连root用户自己都做不到 无需显式更改即可跳过这些步骤。
该模型意味着准入决策是基于以下因素做出的: 安全标签(上下文)和预定义规则不仅仅是读写执行(rwx)权限。即使某个服务已被入侵或拥有过多的权限,SELinux 也能阻止它访问敏感文件、触发其他进程或越过其授权边界在网络中移动。
SELinux 并不会取代传统的 DAC,而是对其进行补充。首先,它会检查标准的 Unix 权限,然后, 只有当 DAC 允许该操作时,SELinux 才会介入以验证其策略。如果 DAC 已经阻止了访问,SELinux 既不会干预也不会记录任何内容,这有助于减少日志中的噪声并保持性能。
这种分层方法在以下方面尤为明显: 企业环境 如 Red Hat Enterprise Linux、Fedora、SUSE Linux Enterprise 或 openSUSE LeapSELinux 与系统的其他安全机制以及容器和虚拟机等现代技术集成在一起。

关键概念:SELinux策略、上下文和域
SELinux 的基础是 安全策略描述了谁可以做什么、针对什么以及如何做。在这种语言中,进程被视为主体,而系统资源(文件、目录、套接字、端口、设备等)被视为客体。
SELinux 不将用户视为“root”或“www-data”之类的名称,而是与这些名称一起使用。 域和类型例如,Apache Web 服务器进程在域中运行。 httpd_t而提供给客户端的文件具有如下类型: httpd_sys_content_t该策略定义了哪些域可以访问哪些类型的对象(文件、目录、套接字、端口……)以及哪些特定权限(读取、写入、执行、获取属性、追加等)。
每个对象都有一个关联的对象。 SELinux 上下文标签格式如下:
usuario:rol:tipo:nivel
例如,一个文件可以被标记为 system_u:object_r:httpd_sys_content_t:s0哪里 日常管理中最重要的字段通常是类型 (httpd_sys_content_t),它决定哪些进程域将被允许访问。
实际上,SELinux 运行着数千条规则。为了防止规则过于庞大而难以管理,这些策略被划分成不同的部分。 可激活、停用或更新的独立模块 无需重新编译庞大的单体代码块。这在 RHEL、SUSE 和 openSUSE 中至关重要,因为每个相关服务通常都有自己的策略模块。
SELinux 运行模式:强制模式、宽容模式和禁用模式
SELinux 可以以三种不同的模式运行,这些模式决定了 SELinux 的运行程度。 其规则实时应用于系统。:
在模式下 强制执行 (合规性方面),内核会严格执行该策略。任何违反规则的行为都将受到处罚。 它会阻塞并记录日志。如果策略已经调整得当,这是生产环境中推荐的模式,因为在这种模式下 SELinux 才能真正发挥其保护作用。
在模式下 宽容 (宽松模式),SELinux 会继续评估策略,但是 它不会阻挡任何东西。所有违规行为都会被记录为警告。此模式非常适合测试阶段、部署新应用程序或微调规则,因为它允许您在不中断服务的情况下检测哪些因素会导致规则失效。
在模式下 禁用SELinux 已完全禁用。 未应用任何策略,也未生成任何日志。 与 SELinux 相关。在禁用模式和活动模式(宽容模式或强制模式)之间切换需要重启,因为内核必须在启动时初始化 SELinux 支持才能标记文件系统。
在任何发行版中,一个非常明智的做法是首先启动到 宽容审查并纠正标签和政策问题,只有在一切稳定后才能进行。 转为强制执行永久禁用此功能会移除您可利用的最强大的保护层之一。
将 SELinux 集成到 RHEL、Fedora、SUSE 和 openSUSE 中
分布像 Red Hat Enterprise Linux、Fedora 及其衍生版本默认启用 SELinux。通常采用有针对性的策略,主要限制 systemd 启动的系统服务和一些用户。
在 RHEL 中,除了预配置的策略之外,还提供了一系列工具,使管理员不必再费力处理底层规则。其中,SELinux 故障排除工具尤为突出。 分析否认事件并提出具体改进措施 (例如激活布尔值、更正上下文或生成附加模块)。
此外,SELinux 还扩展到 集装箱 (例如使用 Podman)已经虚拟化的环境。通过适当的标签,每个容器或虚拟机在内核级别上与其他容器或虚拟机隔离,即使由于运行时或虚拟机管理程序内部漏洞导致泄漏,也能避免这种情况。
在 SUSE 生态系统中,SUSE Linux Enterprise Server 带来了 内核和工具中支持的 SELinux 框架然而,目前尚无全面的官方策略。建议的做法是构建针对特定环境的策略,或者在需要具备完整 SELinux 支持的极简容器或虚拟化主机时,使用 slemicro 等解决方案。
在 openSUSE Leap 中,通常会依赖于存储库中提供的策略,例如: 安全:/SELinux_legacy 对于测试而言,要知道对于关键环境来说,理想的策略仍然是根据部署情况进行专门调整的修订策略。
SELinux策略模型:目标策略、MLS策略和最小策略
SELinux 可以与不同的策略模型配合使用,这些策略模型决定了控制的范围和深度。最常见的三种策略模型是:
La 政策目标 它专为通用环境而设计,重点在于 限制特定服务 (尤其是网络守护进程)而其他进程则处于更宽松的权限范围内,甚至不受限制。这是大多数发行版的默认选项,因为它在安全性和兼容性之间取得了良好的平衡。
La 多级安全 (MLS) 策略 将敏感度级别字段添加到上下文中(s0, s1, s2(类别等)并允许 将信息和过程分类到不同的层级它是为有非常严格要求的组织(国防、情报、机密环境)设计的,在这些组织中,谁可以查看或修改哪个级别的数据至关重要。
La 最低政策 这是一个简化版本,规则和控制较少。它用于以下系统中: 安全要求有限或力求对兼容性影响最小牺牲了 SELinux 的一些限制功能。
在实际部署中,通常最好与以下方式合作: 目标模块化策略逐个模块地调整受保护的内容和方式,而不是试图管理一个单一的、庞大的整体文件,这样维护起来要困难得多。
上下文管理:查看、更改和恢复 SELinux 标签
SELinux 管理的关键任务之一是: 确保文件、目录、进程和端口具有正确的上下文 根据策略规定,上下文分配错误可能导致服务停止运行或使资源过度暴露。
要检查文件和目录的 SELinux 上下文,许多标准命令都接受该选项。 -Z。 例如, ls -Z /ruta 你可以看到 每个条目的用户、角色、类型和级别和 ps Zaux 您可以了解当前进程的上下文。
当策略安装完毕且文件系统被标记后(例如使用), setfiles o fixfiles 与文件 file_contexts每条路线都会收到一个 根据策略,默认类型如果在已标记的目录中创建一个新文件,它将继承目录的类型;但如果从其他位置移动该文件,它将保留其原始标签,这可能会导致不一致。
如果文件或目录树的标签错误,您可以使用以下命令更正它们: restorecon该 将上下文恢复为策略中定义的值。。有这样的选项 -R (递归)和 -v (详细)很容易看出变化所在。对于已经测试了一段时间的系统来说,在从宽松模式切换到强制模式之前,这几乎是一个必不可少的步骤。
要声明新的标签模式,您可以使用 semanage fcontext使用此工具,您可以在保单中填写什么 必须将 SELinux 类型分配给特定路径或正则表达式。然后,您可以使用以下命令将这些更改应用到文件系统: restorecon例如,您可以给一个新的标签。 DocumentRoot 来自 Apache httpd_sys_content_t 这样,Web 服务器就可以在其受限域内读取它。
基本配置:启用 SELinux 并选择模式
SELinux 的全局行为由以下因素控制: /etc/selinux/配置其中模式定义如下(enforcing, permissive o disabled)以及要使用的策略(定向、MLS、最低限度……)。
在像 RHEL 或 Fedora 这样的系统中,目标策略通常会来自 默认启用,并处于强制模式在 SUSE 或 openSUSE 系统中,必须调整 GRUB2 中的内核参数以加载 SELinux 而不是 AppArmor。这涉及添加诸如以下的选项: security=selinux y selinux=1 进入启动行并重新生成 GRUB 配置。
在启动时启用 SELinux 并选择策略后,务必使用以下命令执行初始完整文件系统标记: setfiles 或同等工具。此步骤 这可能需要一些时间,最好在需求低迷时期进行。但这是系统在强制模式下顺利启动的基础。
在从 AppArmor 迁移的环境中,这一点至关重要。 仔细审阅文件。 file_contexts 及其地方变体因为任何严重的系统不一致都可能导致系统无法启动。请事先做好备份并进行操作。 semanage fcontext 政策与系统实际情况相符几乎是强制性的。
SELinux 和 CVE:它们如何帮助缓解漏洞
像红帽这样的供应商将 SELinux 纳入其产品考虑因素之一。 社区暴力事件影响评估其严重性模型(严重、重要、中等、低)考虑了故障是否可以通过配置良好的 SELinux 限制来缓解或至少加以控制。
在一个严重的远程代码执行漏洞中,类型 Log4Shell(CVE-2021-44228)攻击者可以将代码注入到可从互联网访问的服务中。如果该服务运行在高度受限的 SELinux 域中,则潜在的危害会降低,因为 将无权阅读 /etc/shadow操纵敏感数据库或通过系统进行透视 除了其功能所必需的部分之外。
权限提升失败,例如 CVE-2023-4911(Looney Tuneables)即使漏洞利用使 DAC 级别具有更高权限的用户获得访问权限,该策略仍然适用。 阻止关键操作,例如加载内核模块、写入系统目录或打开某些网络套接字。结果是,利用所获得的权限所能做的事情是有限的。
对于一些中等程度的漏洞(例如 Grafana 中的某些问题),如果这些漏洞需要非常规配置或难以利用,SELinux 可以起到以下作用: 防止小故障升级的额外屏障 这是一起严重的事件。通常情况下,该策略会直接阻止漏洞利用者影响系统所需的访问权限。
对于影响较小的漏洞,例如导致以下情况的漏洞: 用户应用程序崩溃(例如 Vim 等编辑器)SELinux 通常不能直接阻止问题本身的发生,但它仍然发挥着隔离作用,确保有缺陷的进程不会离开其概念沙箱。
SELinux 实战:Web 服务器隔离的真实案例
想象一下,一台运行在 RHEL 或 Fedora 上的 Web 服务器,它暴露了多个应用程序,尽管打了补丁,但仍然存在安全隐患。 它最终容易受到远程执行攻击。 SELinux 是其某个组件的一部分。如果没有 SELinux,攻击者可以以 Web 服务器用户的身份执行代码,从而安装后门、读取凭据或横向移动到其他系统。
在 SELinux 处于强制模式且目标策略经过精心调校的情况下,Apache、Nginx 或类似进程可以在该域下运行。 httpd_t,其中有 权限仅限于标记为诸如此类类型的文件。 httpd_sys_content_t o httpd_sys_rw_content_t并根据适当的上下文对已定义的端口进行受控访问。
这意味着,尽管该漏洞允许执行命令,但被入侵的进程仍无法正常工作。 它无法读取类似这样的文件。 /etc/shadow 也不要触碰数据库目录 标有特定类型(例如) mysqld_db_t),如果网络策略限制,则不得打开与其它内部服务的任意连接。
与其说是系统全面崩溃,不如说是入侵仍在继续。 包含在网络域的范围内是的,这仍然是一起需要调查的事件,但其影响范围要小得多,攻击者的行动也困难得多。
布尔值、模块和策略调整工具
除了正确的标签之外,SELinux 的日常工作通常围绕以下几个方面展开: 在不完全重写的情况下,对基本政策进行一些小的调整。这时布尔值和自定义模块就派上用场了。
MGI 布尔值 SELinux 这些是开关,用于改变已编译策略的部分行为。例如,布尔值可以允许或禁止 FTP 服务器写入某些目录(例如,在特定情况下)。 allow_ftpd_anon_write或者说,Web 服务器发起与网络的出站连接。
连接器 getsebool -a o semanage boolean -l 您可以列出这些开关并查看它们的描述。要永久更改它们,您可以使用 setsebool -P nombre_booleano on|off其中选项 -P 参数确保更改保存到磁盘,并在重启后仍然有效。这是根据服务器的具体需求调整“官方”策略的一种非常便捷的方法。
另一方面,使用 策略模块 它允许您在不修改基础策略的情况下扩展或修改规则。您可以使用以下方式查看活动模块: semodule -l要禁用其中一个 semodule -d nombre 或用以下方式重新激活它: semodule -e nombre在 SUSE/openSUSE 中,这对于在稳定部署时微调希望 SELinux 关注的系统部分尤其有用。
当您需要授予非常具体的额外权限时,以下组合适用: audit2allow y semodule 它让生活轻松许多。根据记录来看…… /var/log/audit/audit.log, audit2allow 会显示哪个规则被阻止,并生成一个模块。 安装后,它就能实现之前被禁止的功能。
使用 SELinux 进行日志记录、审计和故障排除
每次 SELinux 阻止策略未授权的操作时, AVC 拒绝 (访问向量缓存拒绝)通常记录在 /var/log/audit/audit.log前提是该服务 auditd esté funcionando。
这些条目包含大量信息:已经尝试过做的事情(avc: denied { append }, write, getattr等等),哪个进程提出了请求(pid, comm=),在哪个文件或资源上(name=, dev=, ino=), 最初的过程是怎样的?scontext)以及目的地的背景(tcontext)起初它们看起来像是晦涩难懂的句子,但经过一些练习,它们对于理解正在发生的事情来说却是无比宝贵的财富。
为了避免手动阅读日志而导致崩溃,可以使用诸如此类的工具。 ausearch 允许按消息类型进行筛选(例如, -m AVC)或通过临时窗口(-ts recent而且,最重要的是, audit2allow 以及诸如 sealert 帮忙 将这些事件翻译成接近人类语言 并显示建议。
典型的故障排除工作流程是使用 audit2allow -w -a 要查看最新通知的解释,请点击此处。 audit2allow -a o -i fichero 检查具体规则,最后…… 决定是否值得创建一个模块来解锁该权限 或者,如果情况恰恰相反,该方块处于安全位置,最好不要碰它。
每当生成模块时 audit2allow -M nombre 并已安装 semodule -i值得仔细检查这些设置,因为该工具往往权限设置较为宽松,可能会授予超出实际需要的访问权限。SELinux 为加强访问权限提供了很大的灵活性,但使用不当最终可能会导致策略本身出现漏洞。
Linux 加固策略中的 SELinux
SELinux并非孤立存在:它被集成到一个更广泛的安全加固策略中,该策略包括 限制用户权限、防火墙、SSH 安全加固、反暴力破解机制和自动化 配置。
服务器安装后一个非常常见的做法是创建一个 具有有限 sudo 权限的用户 永远不要以直接 root 用户身份运行, 启用网络防火墙(例如ufw或iptables/nftables)安装 Fail2ban 等工具来阻止重复登录尝试; 使用最佳实践配置 SSH (非标准端口、禁用 root 访问权限、密钥认证、尝试次数限制、强大的加密等)。
在此基础上,SELinux 添加了 MAC 层:即使攻击者获得了一个 sudo 或 SSH 密码配置错误的用户, 该策略仍然可以限制用户访问的进程和文件。 它执行操作时,虽然并非万无一失,但它能有效阻止许多自动化攻击通常利用的漏洞,例如MITRE ATT&CK等安全矩阵中描述的攻击。
随着服务器数量的增长,手动应用所有这些加固措施变得不切实际。这时,[以下内容就派上用场了]。 自动化和编排工具 (Ansible、Puppet、Chef、商业自动化加固解决方案等)使您能够部署一致的 SELinux 策略、调整布尔值、标记路由并维护所需的状态,而无需在每台机器上花费数小时。
对于拥有数百个节点的组织而言,这种自动化可能决定着能否拥有一个高效的环境。 相当均匀且安全或者,配置混乱不堪,一半的服务器上禁用了 SELinux,“这样就不会打扰到任何人”。
最终,当 SELinux 得到正确实施——包括强制模式、一致的上下文、修订的策略、微调的模块和监控的日志——它就成为了一种安全网。 它可以控制异常行为,遏制入侵,并有助于证明正在应用强大的访问控制。 为审计、法规和最佳安全实践做好准备。
目录
- 什么是 SELinux?它为何对 Linux 系统加固至关重要?
- 关键概念:SELinux策略、上下文和域
- SELinux 运行模式:强制模式、宽容模式和禁用模式
- 将 SELinux 集成到 RHEL、Fedora、SUSE 和 openSUSE 中
- SELinux策略模型:目标策略、MLS策略和最小策略
- 上下文管理:查看、更改和恢复 SELinux 标签
- 基本配置:启用 SELinux 并选择模式
- SELinux 和 CVE:它们如何帮助缓解漏洞
- SELinux 实战:Web 服务器隔离的真实案例
- 布尔值、模块和策略调整工具
- 使用 SELinux 进行日志记录、审计和故障排除
- Linux 加固策略中的 SELinux