Ubuntu SELinux如何诊断安全问题
小樊
37
2025-12-20 10:59:26
Ubuntu SELinux 安全问题诊断流程
一 快速确认是否由 SELinux 引起
- 查看运行状态与模式:使用命令 getenforce 或 sestatus,确认是否为 Enforcing/Permissive/Disabled。若为 Disabled,SELinux 未生效。若为 Enforcing,继续排查。
- 仅用于定位的临时切换:将 SELinux 切到 Permissive 模式以观察是否问题消失(不会真正拦截):执行 sudo setenforce 0;恢复用 sudo setenforce 1。注意这仅是诊断手段,排查后应回到 Enforcing。
- 排除其他安全模块干扰:Ubuntu 常见还有 AppArmor,可用 aa-status 查看其状态;若怀疑其影响,可暂时将其相关 profile 切到 complain 模式验证。
- 若服务端口已放行但仍不可达,除防火墙外,也要考虑 SELinux 对端口/进程的限制因素。
二 收集与定位 AVC 拒绝日志
- 确保审计服务运行:启动并常驻 auditd(日志写入 /var/log/audit/audit.log),命令:sudo systemctl start auditd && sudo systemctl enable auditd。
- 快速检索拒绝事件:
- 查看全部 AVC:ausearch -m avc
- 最近 10 分钟:ausearch -m avc -ts recent
- 指定服务(按进程名 comm):ausearch -m avc -c httpd
- 生成汇总报告:aureport -a
- 可读性增强:加上 –interpret/-i 更易读,或 –raw/-r 便于脚本处理。
- 若怀疑有拒绝被策略的 dontaudit 规则隐藏,可临时执行 semodule -DB 禁用 dontaudit 再复现问题(排查完成后用 semodule -B 恢复)。
三 解读 AVC 并给出修复方案
- 典型 AVC 关键信息:
- scontext(主体上下文,如:system_u:system_r:httpd_t:s0)
- tcontext(客体上下文,如:unconfined_u:object_r:var_t:s0)
- tclass(客体类别,如:file、dir、chr_file)
- 被拒绝的 permission(如:getattr、read、open)
- 优先用 sealert 做根因分析与修复建议:执行 sealert -a /var/log/audit/audit.log,会给出如“restorecon 修复标签”或“生成本地策略模块”的具体步骤。
- 常见修复路径:
- 文件/目录标签错误:用 semanage fcontext 添加期望类型,再用 restorecon -R 应用。例如 Web 内容目录:
- semanage fcontext -a -t httpd_sys_content_t “/web/content(/.*)?”
- restorecon -Rv /web/content
- 需要开启的功能性开关:用 getsebool -a 查看布尔值,必要时 setsebool -P on 持久化开启(如 httpd 网络相关能力)。
- 确需放行的最小权限:基于日志用 audit2allow 生成模块并加载:
- ausearch -c ‘httpd’ --raw | audit2allow -M my-httpd
- semodule -X 300 -i my-httpd.pp
- 操作顺序建议:优先“恢复正确标签/类型”和“调整布尔值”,最后才考虑“新增 allow 规则”。
四 Ubuntu 启用与基线配置要点
- 安装与启用:
- 安装基础组件:sudo apt update && sudo apt install selinux-basics selinux-policy-default
- 激活 SELinux:sudo selinux-activate
- 确保启动时启用:编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX_DEFAULT 中加入 security=selinux,然后更新 grub 并重启。
- 基线加固与验证:
- 确认模式为 Enforcing:getenforce
- 检查审计与报告:aureport -a、ausearch -m avc -ts today
- 定期审计日志与清理,避免过大影响性能。
五 常见场景与命令清单
- 场景 A:服务访问非标准目录(如 /abc/www/html)被拒
- 修复标签:semanage fcontext -a -t httpd_sys_content_t “/abc/www/html(/.*)?” && restorecon -Rv /abc/www
- 场景 B:端口已放行但仍无法访问(防火墙 OK)
- 排查顺序:服务是否监听正确端口与地址(如 0.0.0.0)、是否存在 AppArmor 限制、再回到 SELinux 对端口/进程的限制分析。
- 场景 C:需要临时观察完整拒绝而不阻断
- 诊断模式:setenforce 0;恢复:setenforce 1(排查后务必恢复 Enforcing)。