SELinux 在 CentOS 中的定位与核心概念
- SELinux 是 Linux 内核的强制访问控制(MAC)机制,在传统的自主访问控制(DAC,rwx 权限)之上增加细粒度控制,即使以 root 身份运行,仍会被策略限制。它通过给主体(进程)和客体(文件、端口、套接字等)打上安全上下文标签,再由策略规则决定是否放行。CentOS 默认启用 SELinux,常见策略为 targeted(仅保护选定的网络服务),也可选 mls(多级安全)。安全上下文通常形如:user:role:type,其中对访问控制最关键的是 type(进程域与文件类型)。
工作模式与配置文件
- 三种模式
- Enforcing:强制执行策略并记录拒绝日志。
- Permissive:仅记录违规,不阻断操作,适合排错。
- Disabled:完全关闭 SELinux,需重启生效。
- 配置文件
- 路径:/etc/selinux/config(符号链接 /etc/sysconfig/selinux)。
- 关键项:
- SELINUX=enforcing|permissive|disabled
- SELINUXTYPE=targeted|mls
- 模式切换要点
- Enforcing ⇄ Permissive:可用命令 setenforce 0/1 即时切换,无需重启。
- 涉及 Disabled 的切换(启用或彻底关闭)必须重启系统;从 Disabled 改回时,系统会进行重新标记(relabel),首次启动可能较慢。
常用管理命令与用法
- 状态与模式
- 查看:getenforce、sestatus
- 切换:setenforce 0|1
- 安全上下文查看
- 文件/目录:ls -Z
- 进程:ps -Z
- 用户:id -Z
- 上下文修复与变更
- 按策略恢复默认上下文:restorecon -R /path
- 临时修改上下文:chcon -t type /path
- 持久化文件上下文规则:semanage fcontext -a -t type “/path(/.*)?” && restorecon -R /path
- 端口类型
- 查看:semanage port -l | grep port
- 添加:semanage port -a -t http_port_t -p tcp 8080
- 布尔值(功能开关)
- 查看:getsebool -a
- 设置:setsebool -P httpd_can_network_connect on(持久化加 -P)
- 审计与策略生成
- 查看拒绝日志:ausearch -m avc -ts recent
- 生成模块:audit2allow -a -M mypolicy
- 安装模块:semodule -i mypolicy.pp
- 规则查询
- 查询允许规则:sesearch --allow
以上命令覆盖了日常运维中对 SELinux 的状态检查、上下文管理、端口与布尔值调整、日志分析与最小权限策略定制等核心操作。
排错流程与最小权限修复示例
- 标准排错流程
- 确认模式:getenforce(如为 Enforcing,可先 setenforce 0 切到 Permissive 验证是否为 SELinux 问题)。
- 查拒绝日志:ausearch -m avc -ts today 或 tail -f /var/log/audit/audit.log。
- 定位标签与进程:ls -Z /path、ps -Z -C processname。
- 先行修复上下文:restorecon -R /path;若仍失败,按需用 semanage fcontext 持久化规则。
- 若涉及网络端口,核对类型:semanage port -l | grep port。
- 若功能受限,核对布尔值:getsebool -a | grep servicename。
- 需要最小权限放行时,基于日志生成模块:audit2allow -a -M mysvc && semodule -i mysvc.pp。
- 验证无误后切回 Enforcing。
- 示例:Nginx 静态目录被拒
- 现象:访问返回 403,日志出现 AVC 拒绝,涉及进程域 httpd_t 与目标类型不匹配。
- 修复:
- 确认目录标签:ls -Z /usr/share/nginx/html
- 恢复默认标签:restorecon -R /usr/share/nginx/html
- 若仍不生效,持久化:
semanage fcontext -a -t httpd_sys_content_t “/usr/share/nginx/html(/.*)?”
restorecon -R /usr/share/nginx/html
- 如需对外端口(如 8080):
semanage port -a -t http_port_t -p tcp 8080
- 验证并切回强制模式。
该流程遵循“先诊断、再修复、最后最小化放行”的原则,既恢复业务,又保持最小暴露面。
生产环境最佳实践
- 保持 SELinux 为 Enforcing,仅在排错时短时切到 Permissive;避免直接 Disabled。
- 优先用布尔值与端口类型微调,其次再考虑自定义策略模块,避免“过度放行”。
- 对关键目录/文件使用 semanage fcontext + restorecon 持久化标签,避免拷贝/移动导致标签错乱。
- 上线前在测试环境验证策略变更,变更留痕(版本化管理策略模块与规则)。
- 建立审计与告警:定期分析 AVC 日志,必要时结合 setroubleshoot 与 sealert 生成可读报告。