使用 SELinux
大约 71 分钟
使用 SELinux
来源:官方文档 原始多页入口:使用 SELinux 内容规模:约 84,021 字符,72 个章节标题,270 个命令/代码块,29 条提示框
阅读提要
- 副标题:防止用户和进程使用增强安全的 Linux (SELinux)与文件和设备执行未授权的交互
- 摘要:通过配置 SELinux,您可以增强系统的安全性。SELinux 是一种强制访问控制(MAC)的实现,它提供额外的安全层。SELinux 策略定义了用户和进程如何与系统上的文件进行交互。您可以通过将用户映射到特定的 SELinux 受限用户来控制哪些用户可以执行哪些操作。
- 主要章节:防止用户和进程使用增强安全的 Linux (SELinux)与文件和设备执行未授权的交互;对红帽文档提供反馈;第 1 章 SELinux 入门;第 2 章 更改 SELinux 状态和模式;第 3 章 管理受限的和未受限的用户;第 4 章 为使用非标准配置的应用程序和服务配置 SELinux;第 5 章 故障排除与 SELinux 相关的问题;第 6 章 使用多级别安全(MLS);第 7 章 使用多类别安全(MCS)进行数据保密性;第 8 章 编写自定义 SELinux 策略;第 9 章 为容器创建 SELinux 策略;第 10 章 在多个系统中部署相同的 SELinux 配置
- 推荐阅读顺序:先看“阅读提要”和目录,再按章节查看“关键点/命令/注意”;需要原文细节时点击来源链接。
章节笔记
概览
- 该章节主要为下一级主题的入口。
防止用户和进程使用增强安全的 Linux (SELinux)与文件和设备执行未授权的交互
- 要点:摘要
对红帽文档提供反馈
- 要点:我们致力于为您提供高质量的文档,您的反馈将对我们有很大帮助。为帮助我们改进,您可以通过 Red Hat Jira 跟踪系统提交建议或报告错误。
- 要点:流程
- 列表:登录到 Jira 网站。 如果您还没有帐户,请创建一个。
- 列表:单击顶部导航栏中的 Create。
- 列表:在 Summary 字段中输入描述性标题。
- 列表:在 Description 字段中输入您对改进的建议。包括文档相关部分的链接。
- 列表:点窗口底部的 Create。
第 1 章 SELinux 入门
- 要点:通过了解 Security Enhanced Linux (SELinux)的核心概念来提高系统的安全性。了解 SELinux 架构、软件包和操作模式有助于有效地管理系统策略。
1.1. SELinux 简介
- 要点:Security Enhanced Linux (SELinux)是强制访问控制(MAC)的一种实现,它增强了系统安全性。通过实施限制进程与文件和网络资源交互的粒度策略,SELinux 可缓解受损的应用程序并防止未经授权的访问。
- 要点:标准 Discretionary Access Control (DAC)基于用户、组和其他权限的访问策略。此模型可防止系统管理员创建细粒度安全策略。例如,DAC 不能限制特定应用程序仅查看日志文件,而允许其他应用程序将数据追加到相同的日志文件。
- 列表:SELinux Coloring Book
- 注意:注意 SELinux 策略规则会在 DAC 规则后检查。如果 DAC 规则拒绝访问,则不会评估 SELinux 策略规则,且不会记录 SELinux 拒绝信息。
1.2. 运行 SELinux 的好处
- 要点:使用 Security Enhanced Linux (SELinux)减少权限升级攻击并强制实施数据保密性。SELinux 限制进程如何与文件和系统资源进行交互。这限制了被入侵的应用程序的影响。
- 要点:运行 SELinux 提供以下安全优势:
- 列表:所有进程和文件都被标记。SELinux 策略规则定义了进程如何与文件交互。只有 SELinux 策略规则允许访问时,才能允许访问。
- 列表:SELinux 提供精细的访问控制。传统 UNIX 权限使用 Linux 用户和组 ID。SELinux 超越了这一点。SELinux 使用所有可用信息:user、role、type 和 security level。
- 列表:SELinux 策略由管理员定义,并在系统范围内强制执行。
- 列表:SELinux 可减少特权升级攻击。进程在域中运行。这将它们相互独立。SELinux 策略规则定义了如何处理访问文件和其它进程。如果某个进程被破坏,攻击者只能访问该进程的正常功能。它们只能访问进程配置为访问的文件。例如,如果 Apache HTTP 服务器被破坏,攻击者无法读取用户主目录中的文件。唯一的例外是在添加特定的 SELinux 策略规则来允许它时。
- 列表:SELinux 可以强制实施数据保密性和完整性,并可以防止进程免于不受信任的输入。
1.3. SELinux 示例
- 要点:安全增强 Linux (SELinux) 在许多真实场景中都提供了优势。真实示例展示了 SELinux 如何通过进程隔离和用户限制来阻止特权攻击、配置错误和常见错误。
- 要点:SELinux 通过多种方式增加安全性:
- 列表:默认操作为 deny(拒绝)。如果没有 SELinux 策略规则允许访问,则 SELinux 会阻止它。例如,如果策略不允许进程打开文件,则拒绝访问。
- 列表:受限用户的权限较少。您可以将 Linux 用户映射到受限的 SELinux 用户,以应用安全规则。例如,将 Linux 用户映射到 user_u 会阻止该用户运行 sudo 和 su。
- 列表:SELinux 域 增加进程和数据分割。使用域来定义哪些进程可以访问特定的文件和目录。例如,危害 Samba 服务器的攻击者无法访问 MariaDB 数据库使用的文件。
- 列表:SELinux 停止配置错误。攻击者可以利用域名系统 (DNS) 区域传输注入虚假数据。如果您在 RHEL 上以 DNS 服务器身份运行 Berkeley Internet Name Domain (BIND) 而不限制区域传输,SELinux 将保护您的系统。默认策略阻止命名的守护程序和其他进程使用区域传输更新区域文件 [1].
- 列表:SELinux 阻止路径遍历攻击。攻击者可以利用 Apache 漏洞使用 ../ 访问文件。处于强制模式的 SELinux 会阻止 httpd 进程访问其允许路径以外的文件。
- 列表:SELinux 可防止内核 NULL 指针攻击。攻击者可以利用 mmap 函数中的漏洞在空页上放置代码 (CVE-2019-9213 ) 。处于强制模式的 SELinux 可防止此攻击。
1.4. SELinux 构架和软件包
- 要点:SELinux 内核子系统强制实施安全策略,systemd 守护进程增强了访问控制来保护系统服务。确定安装和维护 SELinux 所需的软件包,以确保您有必要的管理实用程序。
- 要点:SELinux 是一个内置在 Linux 内核中的 Linux 安全模块(LSM)。它强制安全策略(您管理的安全策略)来控制访问。SELinux 截获访问请求,并根据载入的策略检查它们。如果策略允许请求,SELinux 则允许该操作。否则,SELinux 会阻止该操作并报告错误。
- 列表:策略:selinux-policy-targeted, selinux-policy-mls
- 列表:工具: policycoreutils,policycoreutils-gui,libselinux-utils,policycoreutils-python-utils,setools-console,checkpolicy
- 注意:重要 为了避免不正确的 SELinux 标签和后续问题,请确保使用 systemctl start 命令启动服务。
1.5. SELinux 状态和模式
- 要点:强制、许可和禁用的 SELinux 模式有助于有效地管理系统安全性。您可以使用这些状态来强制实施策略,或在不影响系统操作的情况下排除访问拒绝的问题。
- 要点:SELinux 可使用三种模式之一运行: enforcing(强制)、permissive(宽容)或 disabled(禁用)。
- 列表:Enforcing 模式是默认操作模式,在 enforcing 模式下 SELinux 可正常运行,并在整个系统中强制实施载入的安全策略。
- 列表:在许可模式下,系统的作用就像 SELinux 强制实施加载的安全策略一样。这包括标记对象和记录访问拒绝。但是,系统实际上并不拒绝任何操作。不建议在生产环境系统中使用 permissive 模式,但 permissive 模式对 SELinux 策略开发和调试很有帮助。
- 列表:强烈建议禁用模式。系统避免强制实施 SELinux 策略,并且不标记文件等持久对象。这使得将来启用SELinux变得困难。
- 命令/配置摘录:
# getenforce Enforcing
# setenforce 0 # getenforce Permissive第 2 章 更改 SELinux 状态和模式
- 要点:将 SELinux 配置为以 enforcing、permissive 或 disabled 模式运行,以控制系统如何强制实施安全策略。您可以永久应用这些状态,或者在引导时对访问拒绝进行故障排除,并确保在启用 SELinux 时正确标记文件系统。
- 要点:启用后,SELinux 可使用两种模式之一运行: enforcing 或 permissive。默认情况下,SELinux 被启用并在 enforcing 模式下运行。禁用 SELinux 或将其设置为 permissive 模式阻止 SELinux 保护系统。使用 setenforce 命令更改 SELinux 状态是临时的,并在重启后恢复原状。要永久更改 SELinux 状态,您必须更改 SELinux 配置文件或内核参数。
2.1. SELinux 状态和模式的更改
- 要点:SELinux 模式决定了系统如何强制实施安全策略和记录访问违反情况。配置正确的模式可维护系统安全性,并防止在启用 SELinux 禁用状态时文件系统重新标记导致引导失败。
- 要点:SELinux 处于 enabled 或 disabled 状态。启用后,SELinux 将以 enforcing 或 permissive 模式运行。getenforce 命令将当前模式报告为 Enforcing、Permissive 或 Disabled。
- 列表:如果要从禁用状态更改为启用状态,或者一直在许可模式下运行,请重新标记文件系统以防止启动失败。请参阅更改 SELinux 模式时重新标记文件系统。
- 命令/配置摘录:
$ sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled Policy deny_unknown status: allowed Memory protection checking: actual (secure) Max kernel policy version: 31- 注意:警告 当系统以 permissive 模式运行 SELinux 时,用户和进程可能会错误地标记文件系统对象。当禁用 SELinux 时创建的文件系统对象不会被标记。这会在将 SELinux 改为 Enforcement 模式时导致问题,因为 SELinux 依赖于正确的文件系统对象标签。
2.2. 更改 SELinux 模式时重新标记文件系统
- 要点:在允许模式下运行 SELinux 或从禁用状态切换到启用状态后,重新标记文件系统以修复不正确标记或未标记的文件。这可以防止引导失败,并确保 SELinux 能够正确实施策略。
- 要点:当系统以 permissive 模式运行 SELinux 时,用户和进程可能会错误地标记文件系统对象。当禁用 SELinux 时创建的文件系统对象不会被标记。这些不正确标记和未标记的文件在更改为强制模式时会导致问题,因为 SELinux 依赖于正确的标记。
- 列表:根访问系统。
- 列表:使用 -F 选项创建 /.autorelabel 文件,以确保下次重新启动时重新标记文件: # fixfiles -F onboot
- 列表:将系统配置为以允许模式引导,以防止在重新标记期间引导失败: 在引导参数中添加forceing=0内核选项。这样可确保系统在启动 selinux-auto-relabel 服务之前,如果包含 systemd 所需的未标记文件,则不会启动失败。
- 列表:重启系统: # reboot 系统会在引导期间重新标记所有文件系统对象。
- 列表:系统重新启动后,检查 SELinux 是否正在运行,文件系统是否已重新标记: # sestatus 验证输出是否显示已启用 SELinux 且当前模式与您的配置匹配。
- 列表:检查 /.autorelabel 文件是否在成功重新标记后被删除: # ls -la /.autorelabel ls: cannot access '/.autorelabel': No such file or directory
- 命令/配置摘录:
# fixfiles -F onboot
# reboot2.3. 将 SELinux 更改为 permissive 模式
- 要点:将 SELinux 配置为以 permissive 模式运行,以对拒绝信息和调试安全策略进行故障排除。在此模式下,系统会记录访问向量缓存 (AVC) 事件,但不强制实施活动策略,因此您可以分析影响而不会阻止操作。
- 要点:先决条件
- 列表:selinux-policy-targeted、libselinux-utils 和 policycoreutils 软件包已安装在您的系统中。
- 列表:未使用 selinux=0 或 enforcing=0 内核参数。
- 列表:在文本编辑器中打开 /etc/selinux/config 文件,并配置 SELINUX=permissive 选项: # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. S…
- 列表:重启系统: # reboot
- 列表:系统重启后,确认 getenforce 命令返回 Permissive: $ getenforce Permissive
- 命令/配置摘录:
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=permissive # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
# reboot2.4. 将 SELinux 更改为 enforcing 模式
- 要点:将 SELinux 配置为以 enforcing 模式运行,从而通过拒绝未经授权的访问来保护您的系统。在这个模式中,系统强制执行载入的安全策略并阻止策略违反情况。如果您要从禁用的状态启用 SELinux,则系统会在下次引导时自动重新标记文件。
- 要点:当您使用 SELinux 安装系统时,RHEL 默认启用 enforcing 模式。
- 列表:selinux-policy-targeted、libselinux-utils 和 policycoreutils 软件包已安装在您的系统中。
- 列表:未使用 selinux=0 或 enforcing=0 内核参数。
- 列表:在文本编辑器中打开 /etc/selinux/config 文件,并配置 SELINUX=enforcing 选项: # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SE…
- 列表:保存更改,重启系统: # reboot 在下一次引导中,SELinux 会重新标记系统中的所有文件和目录,并为禁用 SELinux 时创建的文件和目录添加 SELinux 上下文。
- 列表:系统重启后,确认 getenforce 命令返回 Enforcing: $ getenforce Enforcing
- 列表:要查看 SELinux 拒绝的操作,以 root 用户身份输入以下命令: # ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts today
- 命令/配置摘录:
# This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: # enforcing - SELinux security policy is enforced. # permissive - SELinux prints warnings instead of enforcing. # disabled - No SELinux policy is loaded. SELINUX=enforcing # SELINUXTYPE= can take one of these two values: # targeted - Targeted processes are protected, # mls - Multi Level Security protection. SELINUXTYPE=targeted
# reboot2.5. 在之前禁用的系统中启用 SELinux
- 要点:在之前禁用的系统中启用 SELinux,以恢复安全保护并强制实施强制访问控制。您必须首先以 permissive 模式运行系统,并重新标记文件系统以防止因为缺少或不正确的安全标签导致引导失败。
- 要点:禁用 SELinux 时创建的文件系统对象没有安全标签。缺少标签会在直接更改为 enforcing 模式时造成失败,因为系统依赖于正确的上下文来做出访问决策。
- 列表:以 permissive 模式启用 SELinux。如需更多信息,请参阅 将 SELinux 更改为 permissive 模式。
- 列表:重启您的系统: # reboot
- 列表:检查 SELinux 拒绝消息。如需更多信息,请参阅 识别 SELinux 拒绝。
- 列表:确保在下次重启时重新标记文件: # fixfiles -F onboot 这会创建包含 -F 选项的 /.autorelabel 文件。 警告 进入 fixfiles -F onboot 命令前,始终切换到 permissive 模式。 默认情况下,autorelabel 尽可能并行使用与系统可用 CPU 核数一样多的线程。要在自动重新标记过程中只使用单个线程,请使用 fixfiles -T 1 onboot 命令。
- 列表:如果没有拒绝的操作,切换到 enforcing 模式。如需更多信息,请参阅在引导时进入 SELinux 模式。
- 列表:系统重启后,确认 getenforce 命令返回 Enforcing: $ getenforce Enforcing
- 命令/配置摘录:
# reboot
# fixfiles -F onboot- 注意:警告 在重新引导系统以进行重新标记之前,请确保系统将以 permissive 模式引导,例如使用 enforcement=0 内核选项。在启动 selinux-autorelabel 服务前,当系统包括 systemd 需要的未被标记的文件时,系统无法引导。如需更多信息,请参阅 RHBZ#2021835。
- 注意:警告 进入 fixfiles -F onboot 命令前,始终切换到 permissive 模式。
2.6. 禁用 SELinux
- 要点:通过将内核命令行配置为完全取消激活安全基础架构来禁用 SELinux。仅在需要时使用此模式,因为它将停止系统标记文件,并使重新启用 SELinux 困难。
- 要点:当您禁用 SELinux 时,您的系统不会加载安全策略或日志访问向量缓存(AVC)信息。因此,运行 SELinux 的好处中介绍的好处都将没有。
- 列表:已安装 grubby 软件包: $ rpm -q grubby grubby-<version>
- 列表:将您的引导装载程序配置为将 selinux=0 添加到内核命令行中: $ sudo grubby --update-kernel ALL --args selinux=0
- 列表:重启您的系统: $ reboot
- 列表:重启后,确认 getenforce 命令是否返回 Disabled : $ getenforce Disabled
- 命令/配置摘录:
$ rpm -q grubby grubby-<version>
$ sudo grubby --update-kernel ALL --args selinux=0- 注意:警告 除非在特定情况下,否则不要禁用 SELinux,如接受弱安全性的性能敏感系统。
2.7. SELinux 内核引导参数
- 要点:内核引导参数控制 SELinux 模式和系统在启动时初始化。您可以使用这些参数在系统启动过程中覆盖默认安全配置。
- 要点:设置此参数可让系统以 permissive 模式启动,这在进行故障排除时非常有用。如果您的文件系统损坏,使用 permissive 模式可能是唯一可以检测问题的选项。此外,在 permissive 模式中,系统可以正确地创建标签。在这个模式中生成的 AVC 信息可能与 enforcing 模式不同。
- 命令/配置摘录:
# touch /.autorelabel # reboot
# dnf install kernel-doc $ less /usr/share/doc/kernel-doc-6.12.0-55.9.1/Documentation/admin-guide/kernel-parameters.txt- 注意:重要 不要在生产环境中使用 selinux=0 参数。要调试您的系统,请临时使用 permissive 模式而不是禁用 SELinux。
第 3 章 管理受限的和未受限的用户
- 要点:通过将 Linux 用户及其进程映射到策略中定义的特定 SELinux 用户来控制可以执行的操作。这个方法有助于根据分配的 SELinux 配置集强制进行精细的安全限制。
- 要点:每个 Linux 用户都根据 SELinux 策略中的规则映射到一个 SELinux 用户。管理员可以使用 semanage login 工具或将 Linux 用户直接分配给特定的 SELinux 用户来修改这些规则。因此,Linux 用户对其分配给的 SELinux 用户有限制。当分配给 SELinux 用户的 Linux 用户启动进程时,此过程将继承 SELinux 用户的限制,除非其他规则指定了不同的角色或类型。详情请查看您系统中的 selinux-policy-doc 软件包安装的 unconfined_selinux (8)、user_selinux (8)、staff_selinux (8) 和 sysadm_selinux (8) man page。
3.1. SELinux 中限制的和未限制的用户
- 要点:默认情况下,Red Hat Enterprise Linux 中的所有 Linux 用户(包括管理权限的用户)都会映射到无限制的 SELinux 用户 unconfined_u。您可以通过将用户分配给受 SELinux 限制的用户来提高系统安全性。
- 要点:Linux 用户的安全上下文由 SELinux 用户、SELinux 角色和 SELinux 类型组成。例如:
- 命令/配置摘录:
user_u:user_r:user_t
# semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 *3.2. SELinux 用户的角色和访问权限
- 要点:通过调整策略布尔值并将 Linux 用户映射到适当的角色来管理 SELinux 用户的权限和访问权限。这个过程有助于确保 RHEL 中的用户具有其特定任务的正确授权。
- 要点:SELinux 策略将每个 Linux 用户映射到 SELinux 用户。这允许 Linux 用户继承 SELinux 用户的限制。您可以通过调整策略中的布尔值来自定义 SELinux 策略中受限用户的权限。您可以使用 semanage boolean -l 命令确定这些布尔值的当前状态。要列出所有 SELinux 用户、MLS 和 MCS 的级别和范围,请以 root 用户身份使用 semanage user -l 命令。
- 列表:如何使用布尔值(Red Hat Sysadmin)修改 SELinux 设置
- 命令/配置摘录:
$ seinfo -r Roles: 14 auditadm_r dbadm_r guest_r logadm_r nx_server_r object_r secadm_r staff_r sysadm_r system_r unconfined_r user_r webadm_r xguest_r- 表格样本(共 13 行):
- User | 默认角色 | 其他角色
- unconfined_u | unconfined_r | system_r
- guest_u | guest_r
- xguest_u | xguest_r
3.3. SELinux 中约束的非管理员角色
- 要点:受限的非管理员角色授予指定任务的特定权限。通过分配独立角色,您可以根据各个用户的职责为其提供不同的授权级别。
- 要点:您还可以通过更改系统上相关的 SELinux 布尔值来自定义 SELinux 角色的权限。要查看 SELinux 布尔值及其状态,请以 root 用户身份使用 semanage boolean -l 命令。如果安装了 selinux-policy-devel 软件包,您可以获得更详细的描述。
- 列表:使用 sudo 和 sysadm_r 角色约束管理员
- 命令/配置摘录:
# semanage boolean -l SELinux boolean State Default Description … xguest_connect_network (on , on) Allow xguest users to configure Network Manager and connect to apache ports xguest_exec_content (on , on) Allow xguest to exec content …
SELinux boolean State Default Description guest_exec_content (on , on) Allow guest to exec content3.4. SELinux 中受限的管理员角色
- 要点:受限的管理员角色向分配给他们的 Linux 用户授予特定权限。通过分配不同的角色,您可以跨不同的系统域划分管理权限。当多个管理员各自管理一个独立域时,此方法很有用。
- 要点:您可以使用 semanage user 命令将这些角色分配给 SELinux 用户。
- 列表:在 MLS 中将系统管理与安全管理分离
- 列表:通过映射到 sysadm_u 来限制管理员
- 命令/配置摘录:
SELinux boolean State Default Description auditadm_exec_content (on , on) Allow auditadm to exec content
SELinux boolean State Default Description dbadm_exec_content (on , on) Allow dbadm to exec content dbadm_manage_user_files (off , off) Determine whether dbadm can manage generic user files. dbadm_read_user_files (off , off) Determine whether dbadm can read generic user files.3.5. 添加一个新用户会自动映射到 SELinux unconfined_u 用户
- 要点:对于不需要严格的 SELinux 限制的情况,创建一个新 Linux 用户会自动映射到默认的 SELinux unconfined_u 用户。
- 要点:先决条件
- 列表:root 用户运行没有限制,这在 Red Hat Enterprise Linux 中默认运行。
- 列表:输入以下命令创建一个名为 <example_user> 的新 Linux 用户: # useradd <example_user>
- 列表:为 Linux <example_user> 用户分配一个密码: # passwd <example_user> Changing password for user <example_user>. New password: Retype new password: passwd: all authentication tokens updated successfully.
- 列表:退出当前会话。
- 列表:以 Linux <example_user> 用户身份登录。当您登录时,pam_selinux PAM 模块会自动将 Linux 用户映射到 SELinux 用户(本例中为 unconfined_u),并设置生成的 SELinux 上下文。然后会使用这个上下文启动 Linux 用户的 shell。
- 列表:以 <example_user> 用户身份登录时,请检查 Linux 用户的上下文: $ id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
- 命令/配置摘录:
# useradd <example_user>
# passwd <example_user> Changing password for user <example_user>. New password: Retype new password: passwd: all authentication tokens updated successfully.3.6. 以 SELinux 限制的用户身份添加新用户
- 要点:您可以使用用于创建用户帐户的相同命令向系统添加新的 SELinux 限制用户。将用户映射到受限用户(如 staff_u )有助于确保系统受到潜在的安全漏洞的保护。
- 要点:先决条件
- 列表:root 用户运行没有限制,这在 Red Hat Enterprise Linux 中默认运行。
- 列表:输入以下命令创建一个名为 <example_user> 的新 Linux 用户,并将其映射到 SELinux staff_u 用户: # useradd -Z staff_u <example_user>
- 列表:为 Linux <example_user> 用户分配一个密码: # passwd <example_user> Changing password for user <example_user>. New password: Retype new password: passwd: all authentication tokens updated successfully.
- 列表:退出当前会话。
- 列表:以 Linux <example_user> 用户身份登录。用户的 shell 使用 staff_u 上下文启动。
- 列表:以 <example_user> 用户身份登录时,请检查 Linux 用户的上下文: $ id -Z uid=1000(<example_user>) gid=1000(<example_user>) groups=1000(<example_user>) context=staff_u:staff_r:staff_t:s0-s0:c0.c1023
- 命令/配置摘录:
# useradd -Z staff_u <example_user>
# passwd <example_user> Changing password for user <example_user>. New password: Retype new password: passwd: all authentication tokens updated successfully.3.7. 在 SELinux 中限制常规用户
- 要点:通过将所有常规 RHEL 10 用户映射到受限制的 user_u SELinux 配置集来提高系统安全性。此配置有助于确保用户帐户具有有限的特权,且无法执行未授权的任务。
- 要点:默认情况下,Red Hat Enterprise Linux 中的所有 Linux 用户(包括管理权限的用户)都会映射到无限制的 SELinux 用户 unconfined_u。您可以通过将用户分配给受 SELinux 限制的用户来提高系统安全性。这也适用于符合 V-71971 安全技术实施指南。
- 列表:显示 SELinux 登录记录列表。这个列表显示了 Linux 用户与 SELinux 用户的映射: # semanage login -l Login Name SELinux User MLS/MCS Range Service default unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 *
- 列表:将 default 用户(表示没有显式映射的所有用户)映射到 user_u SELinux 用户: # semanage login -m -s user_u -r s0 default
- 列表:检查 default 用户是否已映射到 user_u SELinux 用户: # semanage login -l Login Name SELinux User MLS/MCS Range Service default user_u s0 * root unconfined_u s0-s0:c0.c1023 *
- 列表:验证新用户的进程在 user_u:user_r:user_t:s0 SELinux 上下文中运行。 创建一个新用户: # adduser <example_user> 为 <example_user> 定义一个密码: # passwd <example_user> 注销 root,然后以新用户身份登录。 显示用户 ID 的安全上下文: [<example_user>@localhost ~]$ id -Z user_u:user_r:user_t:s0 显示用户当前进程的安全上下文: [<example_user>@localhost ~]$ ps axZ LABEL PID TTY STAT TIME COMMAND - 1 ?…
- 列表:创建一个新用户: # adduser <example_user>
- 列表:为 <example_user> 定义一个密码: # passwd <example_user>
- 命令/配置摘录:
# semanage login -l Login Name SELinux User MLS/MCS Range Service __default__ unconfined_u s0-s0:c0.c1023 * root unconfined_u s0-s0:c0.c1023 *
# semanage login -m -s user_u -r s0 __default__3.8. 通过映射到 sysadm_u 来限制管理员
- 要点:您可以通过将用户直接映射到 sysadm_u SELinux 用户来限制具有管理权限的用户。当用户登录时,会话会在 sysadm_u:sysadm_r:sysadm_t SELinux 上下文中运行。这可最小化管理帐户遭入侵时的潜在影响。
- 要点:默认情况下,Red Hat Enterprise Linux 中的所有 Linux 用户(包括管理权限的用户)都会映射到无限制的 SELinux 用户 unconfined_u。您可以通过将用户分配给受 SELinux 限制的用户来提高系统安全性。这对遵守 V-71971 安全技术实施指南非常有用。
- 列表:root 用户运行没有限制。这是 Red Hat Enterprise Linux 的默认设置。
- 列表:可选:要允许 sysadm_u 用户使用 SSH 连接到系统: # setsebool -P ssh_sysadm_login on
- 列表:将一个新用户或现有用户映射到 sysadm_u SELinux 用户: 要映射新用户,请将新用户添加到 wheel 用户组中,并将用户映射到 sysadm_u SELinux 用户: # adduser -G wheel -Z sysadm_u <example_user> 要映射现有用户,请将用户添加到 wheel 用户组中,并将用户映射到 sysadm_u SELinux 用户: # usermod -G wheel -Z sysadm_u <example_user>
- 列表:要映射新用户,请将新用户添加到 wheel 用户组中,并将用户映射到 sysadm_u SELinux 用户: # adduser -G wheel -Z sysadm_u <example_user>
- 列表:要映射现有用户,请将用户添加到 wheel 用户组中,并将用户映射到 sysadm_u SELinux 用户: # usermod -G wheel -Z sysadm_u <example_user>
- 列表:恢复用户主目录的上下文: # restorecon -R -F -v /home/<example_user>
- 命令/配置摘录:
# setsebool -P ssh_sysadm_login on
# adduser -G wheel -Z sysadm_u <example_user>3.9. 使用 sudo 和 sysadm_r 角色约束管理员
- 要点:您可以将具有管理权限的特定用户映射到 staff_u SELinux 用户,并配置 sudo,以便用户获取 sysadm_r SELinux 管理员角色。在此角色中,用户可以在不拒绝 SELinux 的情况下执行管理任务。
- 要点:当用户登录时,会话运行在 staff_u:staff_r:staff_r:staff_t SELinux 上下文中,但当用户使用 sudo 输入命令时,会话会更改为 staff_u:sysadm_r:sysadm_t 上下文。
- 列表:root 用户运行没有限制。这是 Red Hat Enterprise Linux 的默认设置。
- 列表:将新用户或现有用户映射到 staff_u SELinux 用户: 要映射新用户,请将新用户添到 wheel 用户组,并将用户映射到 staff_u SELinux 用户: # adduser -G wheel -Z staff_u <example_user> 要映射现有用户,请将用户添加到 wheel 用户组,并将用户映射到 staff_u SELinux 用户: # usermod -G wheel -Z staff_u <example_user>
- 列表:要映射新用户,请将新用户添到 wheel 用户组,并将用户映射到 staff_u SELinux 用户: # adduser -G wheel -Z staff_u <example_user>
- 列表:要映射现有用户,请将用户添加到 wheel 用户组,并将用户映射到 staff_u SELinux 用户: # usermod -G wheel -Z staff_u <example_user>
- 列表:恢复用户主目录的上下文: # restorecon -R -F -v /home/<example_user>
- 列表:要允许 <example_user> 获得 SELinux 管理员角色,请在 /etc/sudoers.d/ 目录中创建一个新文件,例如: # visudo -f /etc/sudoers.d/<example_user>
- 命令/配置摘录:
# adduser -G wheel -Z staff_u <example_user>
# usermod -G wheel -Z staff_u <example_user>3.10. 其他资源
- 列表:如何配置具有 SELinux 受限用户的系统(红帽知识库)
- 列表:如何使用布尔值(Red Hat Sysadmin)修改 SELinux 设置
第 4 章 为使用非标准配置的应用程序和服务配置 SELinux
- 要点:在将应用程序配置为使用非标准端口或目录时,调整 SELinux 目标策略。这可防止 SELinux 拒绝,并帮助确保服务在 enforcing 模式下运行。
- 要点:当 SELinux 处于 enforcing 模式时,默认策略是目标(targeted)策略。您将了解如何在更改配置默认值后为各种服务配置 SELinux 策略,如端口、数据库位置或进程的文件系统权限。此类更改需要为非标准端口更改 SELinux 类型,识别并修复对默认目录的更改不正确标签,并使用 SELinux 布尔值调整策略。
4.1. 在非标准配置中为 Apache HTTP 服务器自定义 SELinux 策略
- 要点:在将 Apache HTTP 服务器配置为使用非标准端口或目录时,调整 SELinux 策略。这可防止访问拒绝,并帮助确保 Web 服务器以 enforcing 模式运行。
- 要点:先决条件
- 列表:已安装 httpd 软件包,并将 Apache HTTP 服务器配置为侦听 TCP 端口 3131,并使用 /var/test_www/ 目录而不是默认的 /var/www/ 目录。
- 列表:policycoreutils-python-utils 和 setroubleshoot-server 软件包已安装在您的系统中。
- 列表:启动 httpd 服务并检查状态: # systemctl start httpd # systemctl status httpd … httpd[14523]: (13)Permission denied: AH00072: make_sock: could not bind to address [::]:3131 … systemd[1]: Failed to start The Apache HTTP Server. …
- 列表:SELinux 策略假设 httpd 在端口 80 上运行: # semanage port -l | grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 5989
- 列表:更改 SELinux 类型端口 3131 使其与端口 80 匹配: # semanage port -a -t http_port_t -p tcp 3131
- 列表:再次启动 httpd : # systemctl start httpd
- 命令/配置摘录:
# systemctl start httpd # systemctl status httpd … httpd[14523]: (13)Permission denied: AH00072: make_sock: could not bind to address [::]:3131 … systemd[1]: Failed to start The Apache HTTP Server. …
# semanage port -l | grep http http_cache_port_t tcp 8080, 8118, 8123, 10001-10010 http_cache_port_t udp 3130 http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000 pegasus_http_port_t tcp 5988 pegasus_https_port_t tcp 59894.2. 使用 SELinux 布尔值调整用于共享 NFS 和 CIFS 卷的策略
- 要点:使用布尔值在运行时修改 SELinux 策略,以允许服务访问 NFS 和 CIFS 卷。此功能启用了快速策略调整,而无需重新载入或重新编译整个策略。
- 要点:在客户端的 NFS 挂载使用 NFS 卷策略定义的默认上下文标记。在 RHEL 中,此默认上下文使用 nfs_t 类型。另外,挂载在客户端中的 Samba 共享使用策略定义的默认上下文标记。此默认上下文使用 cifs_t 类型。您可以启用或禁用布尔值来控制允许哪些服务访问 nfs_t 和 cifs_t 类型。
- 列表:(可选)安装 selinux-policy-devel 软件包,以获取 semanage boolean -l 命令的输出中 SELinux 布尔值的更清晰和详细描述。
- 列表:识别与 NFS、CIFS 和 Apache 相关的 SELinux 布尔值: # semanage boolean -l | grep 'nfs|cifs' | grep httpd httpd_use_cifs (off , off) Allow httpd to access cifs file systems httpd_use_nfs (off , off) Allow httpd to access nfs file systems
- 列表:列出布尔值的当前状态: $ getsebool -a | grep 'nfs|cifs' | grep httpd httpd_use_cifs --> off httpd_use_nfs --> off
- 列表:启用指定的布尔值: # setsebool httpd_use_nfs on # setsebool httpd_use_cifs on 注意 使用 setsebool 和 -P 选项,使更改在重新启动后仍然有效。setsebool -P 命令需要重建整个策略,且可能需要一些时间,具体取决于您的配置。
- 列表:检查布尔值为 on: $ getsebool -a | grep 'nfs|cifs' | grep httpd httpd_use_cifs --> on httpd_use_nfs --> on
- 命令/配置摘录:
# semanage boolean -l | grep 'nfs\|cifs' | grep httpd httpd_use_cifs (off , off) Allow httpd to access cifs file systems httpd_use_nfs (off , off) Allow httpd to access nfs file systems
$ getsebool -a | grep 'nfs\|cifs' | grep httpd httpd_use_cifs --> off httpd_use_nfs --> off- 注意:注意 使用 setsebool 和 -P 选项,使更改在重新启动后仍然有效。setsebool -P 命令需要重建整个策略,且可能需要一些时间,具体取决于您的配置。
4.3. 查找用于管理访问非标准目录的正确的 SELinux 类型
- 要点:查找正确的 SELinux 类型来管理对默认策略未涵盖的目录的访问。这包括搜索适当的布尔值或匹配类型,或者根据需要定义本地策略模块。
- 要点:如果您需要设置默认 SELinux 策略没有涵盖的访问控制规则,请首先搜索匹配您的用例的布尔值。如果您无法找到合适的布尔值,您可以使用匹配的 SELinux 类型,或甚至创建一个本地策略模块。
- 列表:selinux-policy-doc 和 setools-console 软件包已安装在您的系统上。
- 列表:列出所有与 SELinux 相关的主题,并将结果限制到您要配置的组件。例如: # man -k selinux | grep samba samba_net_selinux (8) - Security Enhanced Linux Policy for the samba_net processes samba_selinux (8) - Security Enhanced Linux Policy for the smbd processes … 在与您的场景对应的手册页中,找到相关的 SELinux 布尔值、端口类型和文件类型。 请注意,只有在安装了 selinux-policy-doc 软件包后,man -k selinu…
- 列表:可选:您可以使用 semanage fcontext -l 命令显示默认位置上进程的默认映射,例如: # semanage fcontext -l | grep samba … /var/cache/samba(/.)? all files system_u:object_r:samba_var_t:s0 … /var/spool/samba(/.)? all files system_u:object_r:samba_spool_t:s0 …
- 列表:使用 sesearch 命令显示默认 SELinux 策略中的规则。您可以通过列出相应的规则来查找要使用的类型和布尔值,例如: $ sesearch -A | grep samba | grep httpd … allow httpd_t cifs_t:dir { getattr open search }; [ use_samba_home_dirs && httpd_enable_homedirs ]:True …
- 列表:SELinux 布尔值可能是对您的配置问题的最直接的解决方案。您可以使用 getsebool -a 命令显示所有可用的布尔值及其值,例如: $ getsebool -a | grep homedirs git_cgi_enable_homedirs --> off git_system_enable_homedirs --> off httpd_enable_homedirs --> off mock_enable_homedirs --> off mpd_enable_homedirs --> off openvpn_enable_homedirs --> on ssh_chroot_rw_homedirs --> off
- 列表:您可以使用 sesearch 命令验证所选的布尔值是否正是您想要的,例如: $ sesearch -A | grep httpd_enable_homedirs … allow httpd_suexec_t autofs_t:dir { getattr open search }; [ use_nfs_home_dirs && httpd_enable_homedirs ]:True allow httpd_suexec_t autofs_t:dir { getattr open search }; [ use_samba_home_dirs && httpd_enable_homedirs ]:True …
- 命令/配置摘录:
# man -k selinux | grep samba samba_net_selinux (8) - Security Enhanced Linux Policy for the samba_net processes samba_selinux (8) - Security Enhanced Linux Policy for the smbd processes …
# semanage fcontext -l | grep samba … /var/cache/samba(/.*)? all files system_u:object_r:samba_var_t:s0 … /var/spool/samba(/.*)? all files system_u:object_r:samba_spool_t:s0 …4.4. 管理非特权 SELinux 用户对非标准共享目录的访问
- 要点:为非特权用户 user_u 配置非标准共享目录的访问权限。这个过程通过查找并将适当的 SELinux 文件类型映射到目录来限制访问。
- 要点:user_u 用户有默认的角色 user_r 和默认的域 user_t。有关 相关命令 和通用非特权用户 user_u 的详情,请查看您系统中的 seinfo (1)、seinfo (1)和 user_selinux (8) 手册页。
- 列表:selinux-policy-doc 和 setools-console 软件包已安装在您的系统上。
- 列表:打开 user_selinux (8) 手册页: $ man user_selinux 在 MANAGED FILES 部分中,找到与您的场景对应的属性或类型。例如,user_home_type 属性。
- 列表:可选:要列出分配给某个属性的所有类型,请使用 seinfo 命令和 -x 和 -a 选项,例如: $ seinfo -x -a user_home_type Type Attributes: 1 attribute user_home_type; … chrome_sandbox_home_t config_home_t cvs_home_t data_home_t dbus_home_t fetchmail_home_t gconf_home_t git_user_content_t …
- 列表:确定相应类型的候选后(在本例中为 data_home_t 类型),检查其 SELinux 映射: $ semanage fcontext -l | grep data_home_t … /root/.local/share(/.*)? all files system_u:object_r:data_home_t:s0 …
- 列表:将相应的类型映射到您要使 user_u 可访问的目录,例如 /shared-data : $ semanage fcontext -a -t data_home_t '/shared-data(/.*)?'
- 列表:检查您配置的目录的映射: # semanage fcontext -l | grep "shared-data" /shared-data(/.*)? all files system_u:object_r:data_home_t:s0
- 命令/配置摘录:
$ man user_selinux
$ seinfo -x -a user_home_type Type Attributes: 1 attribute user_home_type; … chrome_sandbox_home_t config_home_t cvs_home_t data_home_t dbus_home_t fetchmail_home_t gconf_home_t git_user_content_t …第 5 章 故障排除与 SELinux 相关的问题
- 要点:如果您计划在之前禁用 SELinux 的系统中启用 SELinux,或者如果您以非标准配置运行服务,您可能需要排除 SELinux 可能会阻止的情况。请注意,在多数情况下,SELinux 拒绝通常代表存在错误的配置。
5.1. 识别 SELinux 拒绝
- 要点:通过搜索审计日志中的 Access Vector Cache (AVC)拒绝信息来识别与 SELinux 相关的问题。检查 AVC 日志有助于快速确定 SELinux 是否在阻止您的预期操作。
- 要点:当您的情况被 SELinux 阻止时,/var/log/audit/audit.log 文件是第一个检查有关拒绝的更多信息。要查询审计日志,请使用 ausearch 工具。
- 列表:因为 SELinux 决策(如允许或禁止访问)已被缓存,且这个缓存被称为 AVC,所以对消息类型参数使用 AVC 和 USER_AVC 值,例如: # ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts recent 如果没有匹配项,请检查 audit 守护进程是否正在运行。如果没有,请在启动 auditd 后重复拒绝的场景,然后再次检查审计日志。
- 列表:如果 auditd 正在运行,但 ausearch 的输出中没有匹配项,请检查 systemd Journal 提供的消息: # journalctl -t setroubleshoot
- 列表:如果 SELinux 处于活跃状态,且 Audit 守护进程没有在您的系统中运行,在 dmesg 命令的输出中搜索特定的 SELinux 信息: # dmesg | grep -i -e type=1300 -e type=1400
- 列表:即使进行了前面的三个检查后,您仍可能找不到任何结果。在这种情况下,因为 dontaudit 规则,可以静默 AVC 拒绝。 要临时禁用 dontaudit 规则,请记录所有拒绝: # semodule -DB 在重新运行拒绝的场景并使用前面的步骤查找拒绝信息后,以下命令会在策略中再次启用 dontaudit 规则: # semodule -B
- 列表:如果您应用了前面所有四个步骤,这个问题仍然无法识别,请考虑 SELinux 是否真正阻止了您的场景: 切换到 permissive 模式: # setenforce 0 $ getenforce Permissive 重复您的场景。 如果问题仍然存在,SELinux 以外的问题会阻断您的场景。
- 列表:切换到 permissive 模式: # setenforce 0 $ getenforce Permissive
- 命令/配置摘录:
# ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts recent
# journalctl -t setroubleshoot5.2. 分析 SELinux 拒绝信息
- 要点:分析 SELinux 拒绝消息以了解根本原因,并将策略问题与其他错误配置相区分。
- 要点:先决条件
- 列表:policycoreutils-python-utils 和 setroubleshoot-server 软件包已安装在您的系统中。
- 列表:使用 sealert 命令列出有关日志拒绝的详情,例如: $ sealert -l "*" SELinux is preventing /usr/bin/passwd from write access on the file /root/test. ***** Plugin leaks (86.2 confidence) suggests ***************************** If you want to ignore passwd trying to write access the test file, because you believe it should not need this access…
- 列表:如果 sealert 仅返回通用建议,请启用全路径审核以获得更详细的分析: 启用全路径审核查看访问对象的完整路径,并让其他 Linux Audit 事件字段可见: # auditctl -w /etc/shadow -p w -k shadow-write 清除 setroubleshoot 缓存: # rm -f /var/lib/setroubleshoot/setroubleshoot.xml 重现问题。 重复步骤 1。 完成这个过程后,禁用全路径审核: # auditctl -W /etc/shadow -p w -k shadow-write
- 列表:启用全路径审核查看访问对象的完整路径,并让其他 Linux Audit 事件字段可见: # auditctl -w /etc/shadow -p w -k shadow-write
- 列表:清除 setroubleshoot 缓存: # rm -f /var/lib/setroubleshoot/setroubleshoot.xml
- 列表:重现问题。
- 命令/配置摘录:
$ sealert -l "*" SELinux is preventing /usr/bin/passwd from write access on the file /root/test. ***** Plugin leaks (86.2 confidence) suggests ***************************** If you want to ignore passwd trying to write access the test file, because you believe it should not need this access. Then you should report this as a bug. You can generate a local policy module to dontaudit this access. Do # ausearch -x /usr/bin/passwd --raw | audit2allow -D -M my-passwd # semodule -X 300 -i my-passwd.pp ***** Plugin catchall (14.7 confidence) suggests ************************** … Raw Audit Messages type=AVC msg=audit(1553609555.619:127): avc: denied { …
# auditctl -w /etc/shadow -p w -k shadow-write5.3. 分析 SELinux 拒绝的修复
- 要点:修复 SELinux 策略问题,优先考虑标记问题,确定 sealert 命令推荐的配置调整。除非其他故障排除步骤失败,否则请避免立即生成本地策略模块。
- 要点:在大多数情况下,sealert 提供的建议提供了有关如何修复与 SELinux 策略相关的问题的正确指导。有关如何使用 sealert 分析 SELinux 拒绝的信息,请参阅分析 SELinux 拒绝信息。
- 命令/配置摘录:
# semanage fcontext -a -t httpd_sys_content_t "/srv/myweb(/.*)?"
# restorecon -R -v /srv/myweb5.4. 创建本地 SELinux 策略模块
- 要点:创建并添加特定的本地 SELinux 策略模块,以修复与已知问题相关的问题或实施特定的红帽解决方案。使用非常小心,仅应用由红帽直接提供的规则。
- 要点:在活跃的 SELinux 策略中添加特定的 SELinux 策略模块可以修复 SELinux 策略的某些问题。您可以使用此流程修复 红帽发行注记 中描述的特定的已知问题或实施特定的 红帽解决方案。
- 列表:setools-console 和 audit 软件包进行验证。
- 列表:使用文本编辑器打开新的 .cil 文件,例如: # vi <local_module>.cil 要让您的本地模块更好地组织,请在本地 SELinux 策略模块的名称中使用 local_ 前缀。
- 列表:从已知问题或红帽解决方案中插入自定义规则。 重要 不要自己编写规则。仅使用特定已知问题或红帽解决方案中提供的规则。 例如,要解决 SELinux 在 RHEL 中拒绝对 cups.sock 的 cups-lpd 读访问,请插入以下规则: (allow cupsd_lpd_t cupsd_var_run_t (sock_file (read))) 示例解决方案在 RHBA-2021:4420 中为 {ProductShortName} 永久修复。因此,此流程特定于这个解决方案的部分不会影响更新的 {ProductShortName} 8 和 9 系统,且只作为语法示例包括。 您可以使用两个 SELinux 规则语法(通用中间语言 (…
- 列表:例如,要解决 SELinux 在 RHEL 中拒绝对 cups.sock 的 cups-lpd 读访问,请插入以下规则: (allow cupsd_lpd_t cupsd_var_run_t (sock_file (read))) 示例解决方案在 RHBA-2021:4420 中为 {ProductShortName} 永久修复。因此,此流程特定于这个解决方案的部分不会影响更新的 {ProductShortName} 8 和 9 系统,且只作为语法示例包括。 您可以使用两个 SELinux 规则语法(通用中间语言 (CIL) 和 m4)中的任一个。例如,CIL 中的 (allow cupsd_lpd_t cupsd_var_run…
- 列表:保存并关闭该文件。
- 列表:安装策略模块: # semodule -i <local_module>.cil 如果要使用 semodule -i 删除您创建的本地策略模块,请参考不带 .cil 后缀的模块名称。要删除本地策略模块,请使用 semodule -r <local_module>。
- 命令/配置摘录:
# vi <local_module>.cil
(allow cupsd_lpd_t cupsd_var_run_t (sock_file (read)))- 注意:警告 只用红帽提供的规则。红帽不支持使用自定义规则创建 SELinux 策略模块,因为这超出了 产品支持覆盖范围。如果您并不是相关系统的专家,请联系红帽销售代表并请求咨询服务。
- 注意:重要 不要自己编写规则。仅使用特定已知问题或红帽解决方案中提供的规则。
5.5. 审计日志中的 SELinux 拒绝
- 要点:解释 /var/log/audit/audit.log 文件中 Linux Audit 系统记录的 SELinux 拒绝消息。了解源上下文和目标上下文等字段对于解决策略错误至关重要。
- 要点:Linux Audit 系统默认将日志条目存储在 /var/log/audit/audit.log 文件中。要仅列出与 SELinux 相关的记录,请使用 ausearch 命令,并将 message type 参数设置为 AVC 和 AVC_USER,例如:
- 列表:avc: denied - SELinux 执行的操作,并在 AVC 中记录
- 列表:{ read } - 被拒绝的操作
- 列表:pid=6591 - 试图执行被拒绝操作的主体的进程识别符
- 列表:comm="httpd" - 用于调用分析进程的命令名称
- 列表:httpd_t - 进程的 SELinux 类型
- 列表:nfs_t - 受进程操作影响的对象的 SELinux 类型
- 命令/配置摘录:
# ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR
type=AVC msg=audit(1395177286.929:1638): avc: denied { read } for pid=6591 comm="httpd" name="webpages" dev="0:37" ino=2112 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:nfs_t:s0 tclass=dir5.6. 其他资源
- 列表:CLI 中的基本 SELinux 故障排除(红帽知识库)
- 列表:SELinux 试图告诉我什么?SELinux 错误(Fedora 人员)的 4 个关键原因.
第 6 章 使用多级别安全(MLS)
- 要点:使用 SELinux 中的多级别安全(MLS)和多类别安全(MCS)功能来优化访问控制。使用 MLS 和 MCS,您可以根据数据敏感度和机构类别限制访问。
- 要点:MLS 策略使用美国防御社区最初设计的 级别级别。MLS 满足一组非常严格的安全要求,这基于在严格控制的环境中管理的信息(如军事)。
6.1. 多级别安全(MLS)
- 要点:多级别安全(MLS)通过使用 Bell-La Padula Model 来限制基于数据敏感度级别的用户和进程。此配置通过强制"没有读取、无写"原则来防止未经授权的访问高度敏感信息。
- 要点:多级别安全(MLS)技术使用信息安全级别将数据分为分级分类,例如:
- 列表:[Low] 非保密
- 列表:[low] 保密
- 列表:[high] 机密
- 列表:[Highest] 顶端机密
- 列表:s0 是最敏感的。
- 列表:s15 是最敏感的。
- 命令/配置摘录:
user_u:user_r:user_t:s1- 注意:注意 安全管理员可以通过修改系统的 SELinux 策略来调整此行为。例如,可以允许用户修改更低级别的文件,这需要将文件的敏感级别增加到用户的安全许可级别。
6.2. MLS 中的 SELinux 角色
- 要点:SELinux 策略将每个 Linux 用户映射到 SELinux 用户。这允许 Linux 用户继承 SELinux 用户的限制。请注意,MLS 策略移除默认的 unconfined 模块,即使是 root 用户也会限制特权。
- 要点:您可以通过调整策略中的布尔值来自定义 SELinux 策略中受限用户的权限。您可以使用 semanage boolean -l 命令确定这些布尔值的当前状态。要列出所有 SELinux 用户、其 SELinux 角色和 MLS/MCS 级别和范围,以 root 用户身份使用 semanage user -l 命令。
- 列表:默认情况下,sysadm_r 角色具有 secadm_r 角色的权限,这意味着具有 sysadm_r 角色的用户可以管理安全策略。如果这没有与您的用例对应,您可以通过在策略中禁用 sysadm_secadm 模块来分离这两个角色。如需更多信息,请参阅 将系统管理与 MLS 中的安全管理分离。
- 列表:您可以将非登录角色 dbadm_r、logadm_r 和 webadm_r 用于管理任务的子集。默认情况下,这些角色不与任何 SELinux 用户关联。
- 注意:重要 MLS 策略不包含 unconfined 模块,包括无限制的用户、类型和角色。因此,用户将不受限制(包括 root )的用户无法访问每个对象,并执行他们在目标策略中可以进行的每个操作。
- 表格样本(共 14 行):
- User | 默认角色 | 其他角色
- guest_u | guest_r
- xguest_u | xguest_r
- user_u | user_r
6.3. 将 SELinux 策略切换到 MLS
- 要点:将 SELinux 策略从 targeted 模式切换到 Multi-Level Security (MLS)模式。确保首先切换到 permissive 模式以重新标记文件,防止潜在的引导失败。
- 要点:步骤
- 列表:安装 selinux-policy-mls 软件包: # dnf install selinux-policy-mls
- 列表:在您选择的文本编辑器中打开 /etc/selinux/config 文件,例如: # vi /etc/selinux/config
- 列表:将 SELinux 模式从 enforcing 改为 permissive,并从 targeted 策略切换到 MLS: SELINUX=permissive SELINUXTYPE=mls 保存更改,退出编辑器。
- 列表:在启用 MLS 策略前,您必须使用 MLS 标签重新标记文件系统中的每个文件: # fixfiles -F onboot System relabels on next boot
- 列表:重启系统: # reboot
- 列表:检查 SELinux 拒绝信息: # ausearch -m AVC,USER_AVC,SELINUX_ERR,USER_SELINUX_ERR -ts recent -i 因为前面的命令没有涵盖所有情况,请参阅 SELinux 故障排除中有关识别、分析以及修复 SELinux 拒绝的指导。
- 命令/配置摘录:
# dnf install selinux-policy-mls
# vi /etc/selinux/config- 注意:重要 不要在运行 X Window 系统的系统上使用 MLS 策略。另外,当使用 MLS 标签重新标记文件系统时,系统可能会阻止受限制的域访问,这会阻止您的系统正确启动。因此,请确保在重新标记文件前将 SELinux 切换到 permissive 模式。在大多数系统中,切换到 MLS 后您会看到很多 SELinux 拒绝,并且许多 SELinux 拒绝都不容易修复。
- 注意:重要 如果您的系统没有启动,或者您无法在切换到 MLS 后登录,请将 enforcing=0 参数添加到内核命令行。如需更多信息,请参阅在引导时更改 SELinux 模式。 另请注意,在 MLS 中,以 root 用户身份通过 SSH 登录映射到 sysadm_r SELinux 角色,它与作为 staff_r 中的 root 登录不同。在 MLS 中首次启动系统前,请考虑通过将 ssh_sysadm_login SELinux 布尔值设置为 1 来允许以 sysadm_r 身份登录 SSH 登录。要在以后启用 ssh_sysadm_login (已在 MLS 中),您必须在 staff_r 中以 root 身份登录,使用 newrole - r sysadm_ r 命令切换到 sysadm_r 中的 root,然后将布尔值设置为 1。
6.4. 在 MLS 中建立用户明确
- 要点:在启用 MLS 后,为受限的 SELinux 用户分配特定的安全许可级别。这控制其访问权限,防止他们读取更高级别的对象或写入不同敏感度级别的文件。
- 要点:默认情况下,具有给定安全许可的用户:
- 列表:不能读取具有更高敏感度级别的对象。
- 列表:无法写入具有不同敏感度级别的对象。
- 列表:SELinux 策略被设置为 mls。
- 列表:SELinux 模式设置为 enforcing。
- 列表:已安装 policycoreutils-python-utils 软件包。
- 列表:分配给 SELinux 受限用户的用户: 对于非授权用户,分配给 user_u (以下流程中的example_user )。 对于特权用户,分配给 staff_u (以下流程中的 staff )。
- 命令/配置摘录:
# setenforce 0
# semanage user -m -L s1 -r s1-s15 staff_u- 注意:重要 确保 MLS 策略处于活动状态时已创建该用户。MLS 中无法使用在其他 SELinux 策略中创建的用户。
- 注意:警告 如果配置不正确,您用于验证的文件不应包含任何敏感信息,并且用户实际上可以访问未经授权的文件。
6.5. 在 MLS 中定义的安全范围内更改用户安全许可的级别
- 要点:在管理员分配的预定义范围内,在 MLS 中更改当前的安全许可级别。通过此功能,您可以修改较低敏感文件,而无需故意将其分类级别提升到最高安全许可。
- 要点:作为 Multi-Level Security (MLS)中的用户,您永远不会超过范围的上限,或将级别降低到范围的下限。例如,您可以修改敏感级别低的文件,而不需要提高其敏感级别。
- 列表:您可以将级别切换到 s1、s2 和 s3。
- 列表:您可以将范围切换到 s1-s2 和 s2-s3。
- 列表:您不能将范围切换到 s0-s3 或 s1-s4。
- 列表:SELinux 策略被设置为 mls。
- 列表:SELinux 模式设置为 enforcing(强制)模式。
- 列表:您可以作为分配了一个 MLS 安全许可级别范围的用户身份登录。
- 命令/配置摘录:
$ id -Z user_u:user_r:user_t:s0-s2
$ newrole -l s16.6. 在 MLS 中增大文件敏感级别
- 要点:允许 MLS 用户通过添加本地 SELinux 策略模块来增加文件敏感度级别。当用户修改文件时,其敏感度级别会自动提升到用户当前安全范围的最低值。
- 要点:默认情况下,MLS 用户无法增加文件敏感度级别。但是,安全管理员 (secadm_r) 可以更改此默认行为,通过向系统 SELinux 策略添加本地模块 mlsfilewrite 来增加文件的敏感度。然后,分配至策略模块中定义的 SELinux 类型的用户可以通过修改文件来增加文件类别级别。每当用户修改文件时,文件的敏感度级别都会提高用户当前安全范围的值。
- 列表:SELinux 策略被设置为 mls。
- 列表:SELinux 模式设置为 enforcing(强制)模式。
- 列表:已安装 policycoreutils-python-utils 软件包。
- 列表:mlsfilewrite local 模块安装在 SELinux MLS 策略中。
- 列表:您以 MLS 中的用户登录,如下: 分配给定义的安全范围。本例演示了一个安全性范围为 s0-s2 的用户。 分配给 mlsfilewrite 模块中定义的同一 SELinux 类型。这个示例需要 (typeattributeset mlsfilewrite (user_t)) 模块。
- 列表:分配给定义的安全范围。本例演示了一个安全性范围为 s0-s2 的用户。
- 命令/配置摘录:
$ id -Z user_u:user_r:user_t:s0-s2
$ newrole -l s1-s2- 注意:重要 如果系统上使用了 restorecon 命令,则分类级别恢复为默认值。
6.7. 在 MLS 中更改文件敏感度
- 要点:以管理员身份手动增加文件的 MLS 分类级别。此操作允许在更高的敏感度级别处理文件,有助于保护数据不受较低级别的用户。
- 要点:在 MLS SELinux 策略中,用户只能修改自己的敏感度级别的文件。这是为了防止以较低明确的级别向用户公开任何高度敏感信息,同时防止不明确的用户创建高敏感文件。不过,管理员可以手动增加文件的分类,例如要在更高级别处理该文件。
- 列表:SELinux 策略设置为 mls。
- 列表:SELinux 模式被设置为 enforcing。
- 列表:您有安全管理权限,这意味着您要分配给其中之一: secadm_r 角色。 如果启用了 sysadm_secadm 模块,进入 sysadm_r 角色。sysadm_secadm 模块默认启用。
- 列表:secadm_r 角色。
- 列表:如果启用了 sysadm_secadm 模块,进入 sysadm_r 角色。sysadm_secadm 模块默认启用。
- 列表:已安装 policycoreutils-python-utils 软件包。
- 命令/配置摘录:
# ls -lZ /path/to/file -rw-r-----. 1 User1 User1 user_u:object_r:user_home_t:s1 0 12. Feb 10:43 /path/to/file
# semanage fcontext -a -r s2 /path/to/file6.8. 在 MLS 中将系统管理与安全管理分离
- 要点:通过在 MLS 中禁用 sysadm_secadm 模块来将系统管理与安全管理分开。这有助于通过将 secadm_r 角色明确分配给指定的安全管理员用户来对安全授权建立更严格的控制。
- 要点:默认情况下,sysadm_r 角色具有 secadm_r 角色的权限,这意味着具有 sysadm_r 角色的用户可以管理安全策略。
- 列表:SELinux 策略被设置为 mls。
- 列表:SELinux 模式设置为 enforcing。
- 列表:已安装 policycoreutils-python-utils 软件包。
- 列表:您分配给 secadm_r 角色的 Linux 用户: 该用户被分配给 staff_u SELinux 用户 定义了此用户的密码。 警告 确保您可以以分配给 secadm 角色的用户身份登录。如果不能,您可以防止以后修改系统的 SELinux 策略。
- 列表:该用户被分配给 staff_u SELinux 用户
- 列表:定义了此用户的密码。
- 命令/配置摘录:
# visudo -f /etc/sudoers.d/<sec_adm_user>
<sec_adm_user> ALL=(ALL) TYPE=secadm_t ROLE=secadm_r ALL- 注意:警告 确保您可以以分配给 secadm 角色的用户身份登录。如果不能,您可以防止以后修改系统的 SELinux 策略。
- 注意:重要 使用 semodule -d 命令,而不是使用 semodule -r 命令删除系统策略模块。semodule -r 命令从您的系统存储中删除模块,这意味着无法重新安装 selinux-policy-mls 软件包。
6.9. 在 MLS 中定义安全终端
- 要点:通过将类型添加到 /etc/selinux/mls/contexts/securetty_types 文件,允许从 MLS 策略下将特定终端登录被视为不安全。当 MLS 阻止用户通过常见终端类型登录时,这是必需的。
- 要点:SELinux 策略会检查用户从中连接的终端类型,并允许运行某些 SELinux 应用程序,例如 newrole,只从安全终端检查。从不安全的终端尝试此操作会产生错误: Error: you not allowed to change levels on a non secure terminal;.
- 列表:SELinux 策略设置为 mls。
- 列表:您从安全的终端进行连接,或者 SELinux 处于 permissive 模式。
- 列表:您有安全管理权限,这意味着您要分配给其中之一: secadm_r 角色。 如果启用了 sysadm_secadm 模块,进入 sysadm_r 角色。sysadm_secadm 模块默认启用。
- 列表:secadm_r 角色。
- 列表:如果启用了 sysadm_secadm 模块,进入 sysadm_r 角色。sysadm_secadm 模块默认启用。
- 列表:已安装 policycoreutils-python-utils 软件包。
- 命令/配置摘录:
console_device_t sysadm_tty_device_t user_tty_device_t staff_tty_device_t auditadm_tty_device_t secureadm_tty_device_t
# ls -Z `tty` root:object_r:user_devpts_t:s0 /dev/pts/0- 注意:警告 将终端类型添加到安全终端列表中,可使您的系统暴露于安全风险。
6.10. 允许 MLS 用户在较低级别上编辑文件
- 要点:默认情况下,MLS 用户无法写入在安全许可范围下较低限制下具有敏感度级别的文件。如果要允许用户在较低级别上编辑文件,您可以通过创建本地 SELinux 模块来实现。
- 要点:当 MLS 用户在较低级别上写入文件时,文件的敏感度级别会增加用户当前范围的较低值。
- 列表:SELinux 策略被设置为 mls。
- 列表:SELinux 模式设置为 enforcing。
- 列表:已安装 policycoreutils-python-utils 软件包。
- 列表:setools-console 和 audit 软件包进行验证。
- 列表:可选:切换到 permissive 模式,以方便进行故障排除。 # setenforce 0
- 列表:使用文本编辑器打开新的 .cil 文件,如 ~/local_mlsfilewrite.cil,并插入以下自定义规则: (typeattributeset mlsfilewrite (staff_t)) 您可以将 staff_t 替换为不同的 SELinux 类型。通过在此处指定 SELinux 类型,您可以控制哪些 SELinux 角色可以编辑低级别文件。 要让您的本地模块更好地组织,请在本地 SELinux 策略模块的名称中使用 local_ 前缀。
- 命令/配置摘录:
# setenforce 0
(typeattributeset mlsfilewrite (_staff_t_))- 注意:注意 要删除本地策略模块,请使用 semodule -r ~/local_mlsfilewrite。请注意,您必须引用不带 .cil 后缀的模块名称。
- 注意:重要 如果配置不正确,您用于验证的文件不应包含任何敏感信息,并且用户实际上可以访问未经授权的文件。
第 7 章 使用多类别安全(MCS)进行数据保密性
- 要点:您可以使用 MCS 通过分类数据来增强系统数据的机密性,然后授予某些进程和用户对特定类别的访问权限。
7.1. 多类别安全性(MCS)
- 要点:使用多类别安全 (MCS) 基于类别标签(如项目或部门名称)限制访问。MCS确保不同工作区之间的隔离和隐私。
- 要点:多类别 Security(MCS)是一个访问控制机制,它使用分配给进程和文件的类别。文件只能由分配到相同类别的进程访问。MCS 维护您系统上的数据机密性。
7.1.1. 多级别安全(MLS)中的 MCS
- 要点:您可以将 MCS 本身用作非分层系统。您还可以将其与多级安全 (MLS) 一起使用,作为分层系统中的非分层层。
- 要点:MLS 中的 MCS 示例可以是 secretive 研究机构,其中文件被分类为下表中所示:
- 列表:SELinux 用户
- 列表:SELinux 角色
- 列表:SELinux 类型
- 列表:MLS 敏感度级别
- 列表:MCS 类别
- 列表:使用多级别安全(MLS)
- 命令/配置摘录:
user_u:user_r:user_t:s1:c2- 注意:注意 范围为 s0:c0.1023 的用户可以访问分配给 s0 级所有类别的所有文件。其他安全机制,如DAC或类型强制策略规则,仍然可能禁止访问。
- 表格样本(共 6 行):
- 安全级别 | 类别
- 未指定 | 项目 X | 项目 Y | 项目 Z
- 未分类 | s0 | s0:c0 | s0:c1 | s0:c2
- 机密 | s1 | s1:c0 | s1:c1 | s1:c2
7.2. 为数据机密配置多类别安全性
- 要点:为用户配置多类别安全性(MCS),以帮助确保目标和 MLS 策略中的数据保密性。这包括创建一个本地 SELinux 模块,该模块根据 MCS 规则限制用户域。
- 要点:默认情况下,多类别安全(MCS)在 targeted 和 mls SELinux 策略中处于活跃状态,但不是为用户配置的。在 targeted 策略中,仅针对以下内容配置 MCS:
- 列表:OpenShift
- 列表:virt
- 列表:sandbox
- 列表:网络标记
- 列表:containers (container-selinux)
- 列表:SELinux 模式被设置为 'enforcing。
- 命令/配置摘录:
# touch local_mcs_user.cil
(typeattributeset mcs_constrained_type (user_t))- 注意:警告 更改某些文件的类别可能导致某些服务无法正常运行。如果您并不是相关系统的专家,请联系红帽销售代表并请求咨询服务。
7.3. 在 MCS 中定义类别标签
- 要点:通过编辑 setrans.conf 文件,为 MCS 类别或 MLS 级别组合定义人类可读的标签。通过定义这些标签,用户可以更轻松地管理和使用类别,尽管 MCS 功能保持不变。
- 要点:通过编辑 setrans.conf,您可以管理和维护 MCS 类别的标签,或使用 MLS 级别管理 MCS 类别组合。在这个文件中,SELinux 在内部敏感度和类别级别及其人类可读标签之间保持映射。请查看您系统上的 setrans.conf (5) 手册页。
- 列表:SELinux 模式设置为 enforcing。
- 列表:SELinux 策略被设置为 targeted 或 mls。
- 列表:已安装 policycoreutils-python-utils 和 mcstrans 软件包。
- 列表:通过在文本编辑器中编辑 /etc/selinux/<selinux_policy>/setrans.conf 文件来修改现有类别或创建新类别。根据您使用的 SELinux 策略,将 <selinux_policy> 替换为 targeted 或 mls。例如: # vi /etc/selinux/targeted/setrans.conf
- 列表:在您策略的 setrans.conf 文件中,使用语法 s_<security_level>:c<category_number>_=<category_name> 定义您的场景所需的类别组合,例如: s0:c0=Marketing s0:c1=Finance s0:c2=Payroll s0:c3=Personnel 您可以使用 c0 到 c1023 中的类别号。 在 targeted 策略中,使用 s0 安全级别。 在 mls 策略中,您可以标记各个敏感度级别和类别的组合。
- 列表:您可以使用 c0 到 c1023 中的类别号。
- 命令/配置摘录:
# vi /etc/selinux/targeted/setrans.conf
s0:c0=Marketing s0:c1=Finance s0:c2=Payroll s0:c3=Personnel- 注意:注意 类别标签只让用户更易于使用类别。无论您定义标签或是否定义标签,MCS 的效果都相同。
7.4. 为 MCS 中的用户分配类别
- 要点:您可以通过为 Linux 用户分配类别来定义用户授权。分配了类别的用户可以访问和修改用户类别子集的文件。用户也可以为他们自己分配到的类别分配文件。
- 要点:无法将 Linux 用户分配给在为相关 SELinux 用户定义的安全范围之外的类别。
- 列表:SELinux 模式设置为 enforcing。
- 列表:SELinux 策略被设置为 targeted 或 mls。
- 列表:已安装 policycoreutils-python-utils 软件包。
- 列表:Linux 用户被分配给 SELinux 受限用户: 非特权用户将分配给 user_u. 特权用户被分配给 staff_u。
- 列表:非特权用户将分配给 user_u.
- 列表:特权用户被分配给 staff_u。
- 命令/配置摘录:
# semanage user -m -rs0:c0,c1-s0:c0.c9 <user_u>
# semanage login -m -rs0:c1 <Linux.user1>- 注意:注意 类别访问权限在登录期间分配。因此,在用户再次登录前,用户无法访问新分配的类别。同样,如果您撤销了对类别的访问权限,这仅在用户再次登录后有效。
7.5. 为 MCS 中的文件分配类别
- 要点:为文件分配多类别安全 (MCS) 类别以限制这些类别的用户访问。通过限制不同工作组之间的数据访问,从而提高了隐私性。
- 要点:您必须具有管理员权限才能为用户分配 MCS 类别。然后用户可以为文件分配类别。要更改文件类别,用户必须有权访问该文件。用户只能将文件分配给他们拥有的类别。
- 列表:SELinux 模式设置为 enforcing。
- 列表:SELinux 策略被设置为 targeted 或 mls。
- 列表:policycoreutils-python-utils 软件包安装在您的系统中。
- 列表:访问 Linux 用户,即: 分配给 SELinux 用户。 已分配给您要给该文件的类别。有关详细信息,请参阅为 MCS 中的用户分配类别。
- 列表:分配给 SELinux 用户。
- 列表:已分配给您要给该文件的类别。有关详细信息,请参阅为 MCS 中的用户分配类别。
- 命令/配置摘录:
$ chcat -- +<category1>,+<category2> <path/to/file1>
$ chcat -- -<category1>,-<category2> <path/to/file1>- 注意:注意 系统同时使用类别规则和正常文件访问权限。例如,如果类别为大脚的用户利用DAC阻止对文件的访问,则其他大脚用户无法访问该文件。即使拥有所有类别的用户也可能无法访问所有文件。
- 注意:注意 删除类别时,必须在使用 -<category> 语法前在命令行中键入 --。如果您跳过此步骤,chcat 命令会将类别读取为命令标志。
第 8 章 编写自定义 SELinux 策略
- 要点:编写并使用自定义 SELinux 策略来限制应用程序并增加主机系统的安全性。自定义策略定义了根据您的应用程序要求量身定制的精确访问规则。
8.1. 自定义 SELinux 策略和相关工具
- 要点:自定义 SELinux 安全策略包含管理进程和系统资源之间的交互的规则。内核通过拒绝定义的规则未明确允许的所有访问请求来强制实施此策略。
- 要点:SELinux 安全策略是 SELinux 规则的集合。策略是 SELinux 的核心组件,它由 SELinux 用户空间工具载入内核。内核强制使用 SELinux 策略来评估系统中的访问请求。默认情况下,SELinux 拒绝所有请求,但与载入策略中指定的规则匹配的那些请求。
- 列表:快速开始编写自定义 SELinux 策略(红帽知识库)
- 命令/配置摘录:
ALLOW apache_process apache_log:FILE READ;
$ ls -Z /etc/passwd system_u:object_r:passwd_file_t:s0 /etc/passwd8.2. 为自定义应用程序创建并强制 SELinux 策略
- 要点:您可以创建并强制执行定制的 SELinux 策略,以限制自定义应用程序并增加主机系统和用户数据的安全性。
- 要点:因为每个应用程序都有特定的要求,因此根据您的用例,修改这个示例流程,来创建约束一个简单的守护进程的 SELinux 策略。有关流程中使用的命令的详细信息,请参阅系统上 sepolgen (8), ausearch (8), audit2allow (1), audit2why (1), sealert (8) 手册页。
- 列表:selinux-policy-devel 软件包及其依赖项已安装在您的系统上。
- 列表:在本例中,准备一个简单的守护进程,它将打开 /var/log/messages 文件进行写入: 创建一个新文件,然后在您选择的文本编辑器中打开,例如: $ vi mydaemon.c 插入以下代码: #include <unistd.h> #include <stdio.h> FILE *f; int main(void) { while(1) { f = fopen("/var/log/messages","w"); sleep(5); fclose(f); } } 编译文件: $ gcc -o mydaemon mydaemon.c 为您的守护进程创建一个 systemd 单元文件: $ vi mydaemon.serv…
- 列表:创建一个新文件,然后在您选择的文本编辑器中打开,例如: $ vi mydaemon.c
- 列表:插入以下代码: #include <unistd.h> #include <stdio.h> FILE *f; int main(void) { while(1) { f = fopen("/var/log/messages","w"); sleep(5); fclose(f); } }
- 列表:编译文件: $ gcc -o mydaemon mydaemon.c
- 列表:为您的守护进程创建一个 systemd 单元文件: $ vi mydaemon.service [Unit] Description=Simple testing daemon [Service] Type=simple ExecStart=/usr/local/bin/mydaemon [Install] WantedBy=multi-user.target
- 命令/配置摘录:
$ vi mydaemon.c
#include <unistd.h> #include <stdio.h> FILE *f; int main(void) { while(1) { f = fopen("/var/log/messages","w"); sleep(5); fclose(f); } }8.3. 其他资源
- 列表:SELinux 策略研讨会(红帽 | 行业)
第 9 章 为容器创建 SELinux 策略
- 要点:使用 Udica 工具为容器创建 SELinux 策略。这些策略可提高容器安全性。它们控制容器如何访问主机资源,如存储和网络设备。
- 要点:使用Udica,您可以保护您的集装箱免受安全违规,并满足合规性要求。
9.1. udica SELinux 策略生成器介绍
- 要点:您可以使用 Udica 为自定义容器创建新的 SELinux 策略。您可以使用此工具根据容器 JSON 文件的检查来创建策略,该文件包含 Linux 功能、挂载点和端口定义。
- 要点:因此,该工具将从检查结果生成的规则与从指定的 SELinux 通用中间语言(CIL)块继承的规则合并。
- 列表:以 JSON 格式解析容器 spec 文件
- 列表:根据第一部分的结果查找合适的允许规则
- 列表:生成最终 SELinux 策略
- 列表:允许访问主目录
- 列表:允许访问日志文件
- 列表:允许访问与 X 服务器 的通信。
9.2. 为自定义容器创建和使用 SELinux 策略
- 要点:创建并使用 Udica 生成的 SELinux 策略模块,以限制容器对主机系统的访问。此策略将容器仅限制为必要的资源,从而最大程度降低容器受到破坏的潜在影响。
- 要点:先决条件
- 列表:已安装用于管理容器的 podman 工具。如果没有,使用 dnf install podman 命令。
- 列表:一个自定义 Linux 容器 - 本例中是 ubi8。
- 列表:安装 udica 软件包: # dnf install -y udica 或者,安装 container-tools 模块,它提供一组容器软件包,包括 udica : # dnf module install -y container-tools
- 列表:启动 ubi8 容器,它使用只读权限挂载 /home 目录,以及具有读取和写入的权限的 /var/spool 目录。容器会公开端口 21。 # podman run --env container=podman -v /home:/home:ro -v /var/spool:/var/spool:rw -p 21:21 -it ubi8 bash 请注意,现在容器使用 container_t SELinux 类型运行。这个类型是 SELinux 策略中所有容器的通用域。针对于您的具体情况,这可能太严格或太宽松。
- 列表:打开新会话,并输入 podman ps 命令以获取容器的 ID: # podman ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 37a3635afb8f registry.access.redhat.com/ubi8:latest bash 15 minutes ago Up 15 minutes ago heuristic_lewin
- 列表:创建容器 JSON 文件,并使用 udica 命令根据 JSON 文件中的信息创建策略模块: # podman inspect 37a3635afb8f > container.json # udica -j container.json my_container Policy my_container with container id 37a3635afb8f created! … 或者: # podman inspect 37a3635afb8f | udica my_container Policy my_container with container id 37a3635afb8f created! Please lo…
- 命令/配置摘录:
# dnf install -y udica
# dnf module install -y container-tools第 10 章 在多个系统中部署相同的 SELinux 配置
- 要点:在多个系统中有效地部署您经过测试和验证的 SELinux 配置。自动化部署有助于确保跨基础架构一致的安全策略。
- 要点:您可以使用以下方法之一在多个系统上部署验证的 SELinux 配置:
- 列表:使用 RHEL web 控制台
- 列表:在脚本中使用 semanage 导出和导入命令
10.1. 在 web 控制台中创建 SELinux 配置 Ansible Playbook
- 要点:从 RHEL web 控制台直接生成 Ansible Playbook,以捕获您当前的 SELinux 配置设置。您可以复制此脚本并将其应用到多个系统,以快速部署一致的配置。
- 要点:先决条件
- 列表:您已安装了 RHEL 10 web 控制台。 具体说明请参阅安装并启用 Web 控制台。
- 列表:登录到 RHEL 10 web 控制台。
- 列表:点 SELinux。
- 列表:点 View the automation script。 此时会打开一个带有生成的脚本的窗口。您可以在 shell 脚本和 Ansible Playbook 生成选项选项卡之间导航。
- 列表:点 Copy to clipboard 按钮选择脚本或 playbook 并应用它。 因此,您有一个可应用到更多机器的自动脚本。如需更多信息,请参阅系统中的 ansible-playbook (1) 手册页。
10.2. 使用 semanage 将 SELinux 设置传送到另一个系统中
- 要点:使用 semanage export 和 semanage import 命令,在 RHEL 10 系统之间传输已验证的自定义 SELinux 配置设置。这是复制安全设置的可靠方法。
- 要点:先决条件
- 列表:policycoreutils-python-utils 软件包安装在您的系统中。
- 列表:导出验证的 SELinux 设置: # semanage export -f ./<my-selinux-settings.mod>
- 列表:使用设置将该文件复制到新系统: # scp ./<my-selinux-settings.mod> <new-system-hostname>:
- 列表:登录新系统: $ ssh root@<new-system-hostname>
- 列表:在新系统中导入设置: <new-system-hostname># semanage import -f ./<my-selinux-settings.mod>
- 命令/配置摘录:
# semanage export -f ./<my-selinux-settings.mod>
# scp ./<my-selinux-settings.mod> <new-system-hostname>:第 11 章 使用 RHEL 系统角色配置 SELinux
- 要点:通过使用 selinux RHEL 系统角色在多个系统中自动执行 SELinux 配置,以实现一致的安全策略管理。
- 要点:例如,在以下任务中使用 selinux 角色:
- 列表:清理与 SELinux 布尔值、文件上下文、端口和登录相关的本地策略修改。
- 列表:设置 SELinux 策略布尔值、文件上下文、端口和登录。
- 列表:在指定文件或目录中恢复文件上下文。
- 列表:管理 SELinux 模块。
11.1. 使用 selinux RHEL 系统角色恢复目录上的 SELinux 上下文
- 要点:要在目录中远程重置 SELinux 上下文,您可以使用 selinux RHEL 系统角色。使用不正确的 SELinux 上下文时,应用程序可能无法访问文件。
- 要点:先决条件
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Restore SELinux context ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_restore_dirs: - /var/www/ - /etc/ 示例 playbook 中指定的设置包括如下: selinux_restore_dirs: <…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Restore SELinux context ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_restore_dirs: - /var/www/ - /etc/
$ ansible-playbook --syntax-check ~/playbook.yml11.2. 使用 selinux RHEL 系统角色管理 SELinux 网络端口标签
- 要点:如果要在非标准端口上运行服务,您必须在此端口上设置对应的 SELinux 类型标签,以防止 SELinux 拒绝服务的权限。通过使用 selinux RHEL 系统角色,您可以自动化此任务,并在端口上远程分配一个类型标签。
- 要点:先决条件
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Set http_port_t label on network port ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_ports: - ports: <port_number> proto: tcp setype: http_port_t stat…
- 列表:验证 playbook 语法: $ ansible-playbook --syntax-check ~/playbook.yml 请注意,这个命令只验证语法,不能防止错误的、但有效的配置。
- 列表:运行 playbook: $ ansible-playbook ~/playbook.yml
- 命令/配置摘录:
--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Set http_port_t label on network port ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_ports: - ports: <port_number> proto: tcp setype: http_port_t state: present
$ ansible-playbook --syntax-check ~/playbook.yml11.3. 使用 selinux RHEL 系统角色部署 SELinux 模块
- 要点:如果默认的 SELinux 策略不满足您的要求,您可以创建自定义模块来允许您的应用程序访问所需的资源。通过使用 selinux RHEL 系统角色,您可以自动化此过程,并远程部署 SELinux 模块。
- 要点:先决条件
- 列表:您已准备好控制节点和受管节点。
- 列表:您以可在受管主机上运行 playbook 的用户身份登录到控制节点。
- 列表:用于连接到受管节点的帐户具有这些节点的 sudo 权限。
- 列表:您要部署的 SELinux 模块存储在与 playbook 同样的目录中。
- 列表:SELinux 模块以通用中间语言(CIL)或策略软件包(PP)格式提供。 如果使用 PP 模块,请确保受管节点上的 policydb 版本与用来构建 PP 模块的版本相同或更新。
- 列表:创建一个包含以下内容的 playbook 文件,如 ~/playbook.yml : --- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Deploying a SELinux module ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_modules: - path: <module_file> priority: <value> state: enabled 示例 playbook 中…
- 命令/配置摘录:
--- - name: Managing SELinux hosts: managed-node-01.example.com tasks: - name: Deploying a SELinux module ansible.builtin.include_role: name: redhat.rhel_system_roles.selinux vars: selinux_modules: - path: <module_file> priority: <value> state: enabled
$ ansible-playbook --syntax-check ~/playbook.yml第 12 章 配置 polyinstantiated 目录
- 要点:为 /tmp、/var/tmp 和主目录配置polyinstantiated 目录,以防止出现竞争条件攻击和信息泄漏。此配置会为每个用户创建单独的隔离挂载,防止利用共享临时存储。
- 要点:默认情况下,所有程序、服务和用户都将 /tmp、/var/tmp 以及主目录用作临时存储。这使得这些目录容易受到基于文件名的竞争条件攻击和信息泄漏的影响。您可以使 /tmp/、/var/tmp 和主目录实例化,以使它们不再在所有用户之间共享,并且每个用户的 /tmp-inst 和 /var/tmp/tmp-inst 分别挂载到 /tmp 和 /var/tmp 目录。如需更多信息,请参阅通过 pam-docs 软件包安装的 /usr/share/doc/pam-docs/txts/README.pam_namespace 文件。
- 列表:在 SELinux 中启用 polyinstantiation: # setsebool -P allow_polyinstantiation 1 您可以通过输入 getsebool allow_polyinstantiation 命令来验证 SELinux 中是否启用了 polyinstantiation。
- 列表:创建具有必要权限的目录结构,以便数据在重启后保持不变: # mkdir /tmp-inst /var/tmp/tmp-inst --mode 000
- 列表:恢复整个安全上下文,包括 SELinux 用户部分: # restorecon -Fv /tmp-inst /var/tmp/tmp-inst Relabeled /tmp-inst from unconfined_u:object_r:default_t:s0 to system_u:object_r:tmp_t:s0 Relabeled /var/tmp/tmp-inst from unconfined_u:object_r:tmp_t:s0 to system_u:object_r:tmp_t:s0
- 列表:如果您的系统使用 fapolicyd 应用程序控制框架,当通过启用 /etc/fapolicyd/fapolicyd.conf 配置文件中的allow_filesystem_mark 选项绑定挂载了文件系统时,允许 fapolicyd 监控底层文件系统上的文件访问事件。 allow_filesystem_mark = 1
- 列表:启用 /tmp、/var/tmp/ 和用户主目录的实例化: 重要 使用 /etc/security/namespace.conf 而不是 /etc/security/namespace.d/ 目录中单独的文件,因为 pam_namespace_helper 程序不会读取 /etc/security/namespace.d 中的其他文件。 在具有多级安全(MLS)的系统上,取消 /etc/security/namespace.conf 文件中最后三行的注释: /tmp /tmp-inst/ level root,adm /var/tmp /var/tmp/tmp-inst/ level root,adm $HOME $HOME/$U…
- 列表:在具有多级安全(MLS)的系统上,取消 /etc/security/namespace.conf 文件中最后三行的注释: /tmp /tmp-inst/ level root,adm /var/tmp /var/tmp/tmp-inst/ level root,adm $HOME $HOME/$USER.inst/ level
- 命令/配置摘录:
# setsebool -P allow_polyinstantiation 1
# mkdir /tmp-inst /var/tmp/tmp-inst --mode 000- 注意:重要 使用 /etc/security/namespace.conf 而不是 /etc/security/namespace.d/ 目录中单独的文件,因为 pam_namespace_helper 程序不会读取 /etc/security/namespace.d 中的其他文件。
完整目录
- 防止用户和进程使用增强安全的 Linux (SELinux)与文件和设备执行未授权的交互
- 对红帽文档提供反馈
- 第 1 章 SELinux 入门
- 1.1. SELinux 简介
- 1.2. 运行 SELinux 的好处
- 1.3. SELinux 示例
- 1.4. SELinux 构架和软件包
- 1.5. SELinux 状态和模式
- 第 2 章 更改 SELinux 状态和模式
- 2.1. SELinux 状态和模式的更改
- 2.2. 更改 SELinux 模式时重新标记文件系统
- 2.3. 将 SELinux 更改为 permissive 模式
- 2.4. 将 SELinux 更改为 enforcing 模式
- 2.5. 在之前禁用的系统中启用 SELinux
- 2.6. 禁用 SELinux
- 2.7. SELinux 内核引导参数
- 第 3 章 管理受限的和未受限的用户
- 3.1. SELinux 中限制的和未限制的用户
- 3.2. SELinux 用户的角色和访问权限
- 3.3. SELinux 中约束的非管理员角色
- 3.4. SELinux 中受限的管理员角色
- 3.5. 添加一个新用户会自动映射到 SELinux unconfined_u 用户
- 3.6. 以 SELinux 限制的用户身份添加新用户
- 3.7. 在 SELinux 中限制常规用户
- 3.8. 通过映射到 sysadm_u 来限制管理员
- 3.9. 使用 sudo 和 sysadm_r 角色约束管理员
- 3.10. 其他资源
- 第 4 章 为使用非标准配置的应用程序和服务配置 SELinux
- 4.1. 在非标准配置中为 Apache HTTP 服务器自定义 SELinux 策略
- 4.2. 使用 SELinux 布尔值调整用于共享 NFS 和 CIFS 卷的策略
- 4.3. 查找用于管理访问非标准目录的正确的 SELinux 类型
- 4.4. 管理非特权 SELinux 用户对非标准共享目录的访问
- 第 5 章 故障排除与 SELinux 相关的问题
- 5.1. 识别 SELinux 拒绝
- 5.2. 分析 SELinux 拒绝信息
- 5.3. 分析 SELinux 拒绝的修复
- 5.4. 创建本地 SELinux 策略模块
- 5.5. 审计日志中的 SELinux 拒绝
- 5.6. 其他资源
- 第 6 章 使用多级别安全(MLS)
- 6.1. 多级别安全(MLS)
- 6.2. MLS 中的 SELinux 角色
- 6.3. 将 SELinux 策略切换到 MLS
- 6.4. 在 MLS 中建立用户明确
- 6.5. 在 MLS 中定义的安全范围内更改用户安全许可的级别
- 6.6. 在 MLS 中增大文件敏感级别
- 6.7. 在 MLS 中更改文件敏感度
- 6.8. 在 MLS 中将系统管理与安全管理分离
- 6.9. 在 MLS 中定义安全终端
- 6.10. 允许 MLS 用户在较低级别上编辑文件
- 第 7 章 使用多类别安全(MCS)进行数据保密性
- 7.1. 多类别安全性(MCS)
- 7.1.1. 多级别安全(MLS)中的 MCS
- 7.2. 为数据机密配置多类别安全性
- 7.3. 在 MCS 中定义类别标签
- 7.4. 为 MCS 中的用户分配类别
- 7.5. 为 MCS 中的文件分配类别
- 7.1. 多类别安全性(MCS)
- 第 8 章 编写自定义 SELinux 策略
- 8.1. 自定义 SELinux 策略和相关工具
- 8.2. 为自定义应用程序创建并强制 SELinux 策略
- 8.3. 其他资源
- 第 9 章 为容器创建 SELinux 策略
- 9.1. udica SELinux 策略生成器介绍
- 9.2. 为自定义容器创建和使用 SELinux 策略
- 第 10 章 在多个系统中部署相同的 SELinux 配置
- 10.1. 在 web 控制台中创建 SELinux 配置 Ansible Playbook
- 10.2. 使用 semanage 将 SELinux 设置传送到另一个系统中
- 第 11 章 使用 RHEL 系统角色配置 SELinux
- 11.1. 使用 selinux RHEL 系统角色恢复目录上的 SELinux 上下文
- 11.2. 使用 selinux RHEL 系统角色管理 SELinux 网络端口标签
- 11.3. 使用 selinux RHEL 系统角色部署 SELinux 模块
- 第 12 章 配置 polyinstantiated 目录
