第2章 安装与启用SELinux:配置 /etc/selinux/config、设置 enforcing/permissive、使用 setenforce、检查 sestatus

2.1 原理概述

SELinux 的安全策略由内核安全模块加载,并在系统启动时根据配置文件 /etc/selinux/config 决定工作模式。三种模式决定了安全策略的强制程度:

  • enforcing(强制模式):所有违反策略的操作被阻止并记录日志。
  • permissive(宽容模式):违反策略的操作仅记录日志,不阻止执行,常用于调试和策略开发。
  • disabled(禁用模式):SELinux 完全关闭,不加载任何策略,系统启动时跳过。

运行时可以通过 setenforce 在 enforcing 和 permissive 之间动态切换,无需重启系统。修改配置文件则需要重启系统才能生效(disabled 模式下必须重启才能启用)。

关键原则:生产环境推荐始终开启 enforcing 模式。仅在开发和调试策略时临时置为 permissive。禁用 SELinux 会削弱系统安全基线,不应作为长期方案。

2.2 实现流程

  1. 使用 sestatus 检查当前 SELinux 状态。
  2. 根据需求编辑 /etc/selinux/config 文件,设定 SELINUX 和 SELINUXTYPE。
  3. 若需要立即切换模式(非 disabled),使用 sudo setenforce 0(permissive)或 sudo setenforce 1(enforcing)。
  4. 重启系统(若将模式从 disabled 改为 enforcing/permissive,或修改了策略类型)。
  5. 使用 getenforce 和 sestatus 验证模式生效。

2.3 关键配置文件解析

配置文件 /etc/selinux/config 是 SELinux 启动时的核心入口。典型的文件内容如下:

# SELINUX 取值为 enforcing、permissive 或 disabled
SELINUX=enforcing

# SELINUXTYPE 指定策略类型:targeted(默认)、minimum、mls
SELINUXTYPE=targeted
参数 取值 说明
SELINUX enforcing 安全策略严格执行,阻止违规操作
permissive 策略仅记录告警,不阻止操作
disabled SELinux 不加载,关闭所有安全功能
SELINUXTYPE targeted 仅保护特定系统服务(默认推荐)
minimum 最小策略,仅保护少数核心组件
mls 多级安全策略,实现强制访问控制(MLS)

2.4 常用命令与使用场景

2.4.1 sestatus – 查看完整状态

# 基本输出
$ 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:      33

2.4.2 getenforce – 快速获取当前模式

$ getenforce
Enforcing

2.4.3 setenforce – 运行时切换模式

  • sudo setenforce 0 → 设置为 permissive
  • sudo setenforce 1 → 设置为 enforcing
警告: setenforce 只能在 enforcing 和 permissive 之间切换。如果配置文件为 disabled,则无法在运行时启用 SELinux,必须修改配置文件并重启系统。

2.5 调试与验证技巧

切换模式后立即验证:

# 临时改为 permissive 并验证
sudo setenforce 0
getenforce            # 输出 Permissive
sestatus | grep 'Current mode'  # 输出 Current mode: permissive

# 改回 enforcing
sudo setenforce 1
getenforce            # 输出 Enforcing

若切换失败,检查内核启动参数中是否设定了 selinux=0 或 enforcing=0,这些参数会覆盖文件配置。可使用 cat /proc/cmdline 查看。

2.6 常见错误与解决方法

错误现象 原因 解决方法
setenforce: SELinux is disabled 配置文件或内核参数将SELinux设为disabled 编辑 /etc/selinux/config 改为 enforcing/permissive,并检查内核参数
系统启动后 SELinux 仍为 disabled 配置文件修改后未重启 重启系统;如果仍无效检查 grub 启动参数
启动时出现 Failed to load policy 策略文件损坏或 SELINUXTYPE 指定的策略不存在 重新安装策略包:dnf reinstall selinux-policy-targeted(RHEL/Fedora)
应用程序在 enforcing 模式下启动失败 缺少对应域的策略规则 先切到 permissive 模式收集审计日志,再编写策略(后续章节详解)

2.7 状态转换与配置决策流程

SELinux 启用与状态转换流程图 系统启动 读取 /etc/selinux/config SELINUX=? disabled permissive enforcing setenforce 0/1 注意 disabled 模式 无法运行时切换 必须修改配置并重启

2.8 稳定性与性能影响

  • enforcing 模式:增加少量内核安全检查开销,通常对整体性能影响 <1%(取决于策略复杂度)。但不当的频繁策略拒绝会消耗额外日志写入 I/O。
  • permissive 模式:仍进行完整权限检查并记录审计日志,CPU 开销与 enforcing 相近,磁盘日志写入可能加大。
  • disabled 模式:零安全开销,但完全牺牲了强制访问控制带来的纵深防御。
  • 优化建议:生产环境使用 targeted 策略类型,避免启用 mls 等复杂策略(除非有明确多级安全需求)。定期检查 /var/log/audit/audit.log 避免日志积压。
实践建议:在首次部署 SELinux 时,可先将 SELINUX=permissive 并运行应用一段时间,收集审计日志熟悉策略违规,待确认后再切换为 enforcing。此方法可避免误阻断导致业务中断。