在 Ubuntu 下使用 SELinux 进行排错,核心思路是:确认是否启用 → 查看拒绝日志 → 分析策略 → 调整策略或上下文。下面按实战流程说明。
Ubuntu 默认使用 AppArmor,SELinux 默认是 关闭或未安装。
dpkg -l | grep selinux
常见包:
selinux-basicsselinux-policy-defaultselinux-utilsgetenforce
可能结果:
Disabled:未启用Permissive:启用但只记录不拦截Enforcing:启用且拦截如果提示命令不存在:
sudo apt install selinux-utils
sestatus
sudo apt update
sudo apt install selinux-basics selinux-policy-default auditd
sudo selinux-activate
编辑 GRUB:
sudo nano /etc/default/grub
在 GRUB_CMDLINE_LINUX 中加入:
security=selinux selinux=1
更新 GRUB:
sudo update-grub
重启:
reboot
临时切换到 Permissive 模式 测试:
sudo setenforce 0
如果问题消失 → 基本可确定是 SELinux
ausearch(推荐)sudo ausearch -m avc -ts recent
常见关键字:
deniedscontext(源上下文)tcontext(目标上下文)tclass(对象类型)sudo tail -f /var/log/audit/audit.log
或:
sudo journalctl -t audit
sealert 自动分析(强烈推荐)sudo apt install setroubleshoot
sealert -a /var/log/audit/audit.log
它会给出:
ls -Z /path/to/file
sudo semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
sudo restorecon -Rv /data/www
semanage port -l | grep http
sudo semanage port -a -t http_port_t -p tcp 8080
getsebool -a | grep http
sudo setsebool -P httpd_can_network_connect on
grep denied /var/log/audit/audit.log | audit2allow -M mypolicy
sudo semodule -i mypolicy.pp
| 功能 | 命令 |
|---|---|
| 查看状态 | sestatus |
| 临时关闭 | setenforce 0 |
| 临时开启 | setenforce 1 |
| 查看拒绝 | ausearch -m avc |
| 自动分析 | sealert -a audit.log |
| 文件上下文 | ls -Z |
| 修改上下文 | chcon / semanage fcontext |
| 恢复上下文 | restorecon |
| 管理端口 | semanage port |
| 管理布尔值 | setsebool |
1. setenforce 0 验证
2. ausearch / sealert 看拒绝
3. 检查文件/端口/布尔值
4. 修改上下文或布尔值
5. 必要时生成自定义策略
如果你愿意,可以直接把 audit.log 中的拒绝日志贴出来,我可以帮你逐条分析并给出精确修复命令。