CentOS 中 SELinux 上下文的主要限制
一 核心机制带来的限制
- 强制访问控制优先于传统 DAC:即使文件权限为 777 或以 root 运行,只要安全上下文不匹配,访问仍会被拒绝。内核在策略加载后即强制执行,这是与 DAC(自主访问控制) 的根本差异。
- 上下文结构约束:安全上下文通常为 user:role:type:sensitivity:category。在 CentOS 7 常见为 4 段(如:system_u:system_r:httpd_t:s0),其中对访问控制起决定作用的是第 3 段 type/domain;在 targeted 策略下,类别(category)一般不启用。
- 策略类型限制:默认启用 targeted 策略,仅对选定进程做强制控制;strict/MLS 更严格但配置复杂、兼容性要求高,日常使用较少。
- 默认拒绝语义:未被策略明确允许的操作都会被拒绝(默认拒绝),因此“没有报错≠被允许”。
二 常见限制场景与典型影响
- 服务与文件类型不匹配:例如 Nginx/Apache 默认只允许访问 httpd_sys_content_t 等类型的内容;把文件放在自定义目录且类型为 default_t 时会被拒绝(常见 403)。正确做法是为目录设置持久化类型(如 httpd_sys_content_t)并恢复上下文。
- 端口与布尔开关:服务绑定端口、启用特性受策略与布尔值约束;例如 vsftpd 的端口类型需与策略匹配,某些功能需要打开相应 sebool 开关,否则会被拒绝或降级功能。
- 进程域转换受限:进程从一个域切换到目标域必须满足三要素——对入口点可执行文件的执行权限、该可执行文件被标记为目标的 entrypoint、以及源域到目标域的 transition 许可;任一缺失都无法完成域切换,导致服务无法进入预期受限环境。
- 家目录与敏感目录隔离:如 httpd_t 默认不能读取 user_home_t 等位置的内容,这是策略刻意隔离,避免 Web 服务越权访问用户数据。
三 管理边界与运维限制
- 持久化与临时性差异:使用 chcon 修改的上下文可能在 restorecon、重打标签或策略更新后丢失;应使用 semanage fcontext + restorecon 建立持久规则。
- 变更生效范围:setenforce 0/1 仅切换 Permissive/Enforcing,不重启即可生效;将 SELINUX=permissive/disabled 写入 /etc/selinux/config 后,通常需要重启系统才能完全生效。
- 策略与系统一致性:不同 SELinux 策略类型/版本 对可用类型、端口、布尔值支持不同;跨版本或自定义策略时需先在测试环境验证,避免上线后访问异常。
- 最小权限原则:避免让服务长期运行在 unconfined_t 等不受限域;应为服务使用专有域并通过策略或布尔值精细化授权。
四 排查与规避建议
- 快速判定是否被 SELinux 拦截:查看 /var/log/audit/audit.log 或使用 ausearch -m avc -ts recent;必要时用 sealert 辅助分析。
- 修复思路优先级:先迁移数据到策略认可路径或设置正确类型(如 httpd_sys_content_t),再用 semanage fcontext/restorecon 固化;确需额外权限时,优先调整布尔值或编写最小化的自定义策略模块,避免直接 setenforce 0 或过度放宽策略。