CentOS 上要让 SELinux 策略真正起作用,需要同时满足以下关键条件
一 运行模式与策略类型配置正确
- 运行模式必须为非 Disabled:设为 Enforcing(强制执行)或 Permissive(仅告警不阻断);若为 Disabled,内核不加载任何 SELinux 策略,策略自然不生效。临时切换可用 setenforce 0|1,永久生效需修改 /etc/selinux/config 的 SELINUX= 并重启。注意:从 Disabled ↔ Enforcing/Permissive 的切换需要重启;而 Enforcing ↔ Permissive 可立即生效。配置文件中的 SELINUXTYPE= 选择策略模块(如 targeted/minimum/mls),需与系统所提供的策略包一致。可用 sestatus 查看“Loaded policy name”确认当前加载的策略。
二 安全上下文标签完整且正确
- 所有主体与客体必须具备有效的 安全上下文(security context),格式通常为 user:role:type:sensitivity:category;在 targeted 策略下访问控制主要基于 type。首次从 Disabled 切到 Enforcing/Permissive 并重启后,系统会为文件与进程打上标签;此后若移动/新建文件,需确保标签正确。可用 ls -Z 查看文件、ps -Z 查看进程上下文;若标签缺失或错误,可用 restorecon(按策略默认恢复)或 chcon(按需设置)修正。
三 策略规则与布尔值允许访问
- 访问是否被放行取决于“策略规则 + 布尔值”的组合。可通过 sestatus -b 或 getsebool -a 查看并调整布尔开关(如与 FTP、HTTP、NFS 等相关的开关),以打开或收紧特定功能。若默认策略过于严格,可在充分评估风险后用 audit2allow 生成定制模块并通过 semodule 加载,使策略与实际业务匹配。
四 与 DAC 权限共同满足
- SELinux 是 MAC,位于 DAC(rwx 权限、属主/属组) 之上。即便 SELinux 允许,若 DAC 不允许(例如文件权限为 000 或属主不匹配),访问仍会被拒绝;反之亦然。因此排障时要同时检查 ls -l 的 DAC 与 ls -Z 的 SELinux 上下文。
五 常见导致“策略看似不生效”的排查要点
- 当前为 Permissive 或 Disabled:用 getenforce 与 sestatus 确认;若是 Disabled,需改为 Enforcing 并重启。
- 配置文件与实际不一致:检查 /etc/selinux/config 与 /etc/sysconfig/selinux(该文件通常为指向 …/selinux/config 的符号链接),确保 SELINUX= 与 SELINUXTYPE= 正确。
- 标签缺失/错误:对迁移或新建的路径执行 restorecon -Rv <路径>;必要时用 chcon 或 semanage fcontext 持久化默认标签。
- 布尔值限制功能:用 getsebool -a 检查相关服务布尔开关,必要时用 setsebool -P on/off 持久化。
- 规则不足:分析 /var/log/audit/audit.log(或 journalctl 配合 ausearch/sealert),必要时用 audit2allow 生成并加载模块。