第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 实现流程
- 使用
sestatus检查当前 SELinux 状态。 - 根据需求编辑
/etc/selinux/config文件,设定SELINUX和SELINUXTYPE。 - 若需要立即切换模式(非 disabled),使用
sudo setenforce 0(permissive)或sudo setenforce 1(enforcing)。 - 重启系统(若将模式从 disabled 改为 enforcing/permissive,或修改了策略类型)。
- 使用
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→ 设置为 permissivesudo 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 状态转换与配置决策流程
2.8 稳定性与性能影响
- enforcing 模式:增加少量内核安全检查开销,通常对整体性能影响 <1%(取决于策略复杂度)。但不当的频繁策略拒绝会消耗额外日志写入 I/O。
- permissive 模式:仍进行完整权限检查并记录审计日志,CPU 开销与 enforcing 相近,磁盘日志写入可能加大。
- disabled 模式:零安全开销,但完全牺牲了强制访问控制带来的纵深防御。
- 优化建议:生产环境使用 targeted 策略类型,避免启用 mls 等复杂策略(除非有明确多级安全需求)。定期检查
/var/log/audit/audit.log避免日志积压。
实践建议:在首次部署 SELinux 时,可先将
SELINUX=permissive 并运行应用一段时间,收集审计日志熟悉策略违规,待确认后再切换为 enforcing。此方法可避免误阻断导致业务中断。