在 Ubuntu 上,SELinux 默认是不启用的(Ubuntu 官方默认使用 AppArmor)。如果你是在 Ubuntu 上手动启用了 SELinux,排错思路和 RHEL/CentOS 类似,但有一些 Ubuntu 特有的注意点。
下面按「确认状态 → 看日志 → 分析拒绝 → 临时/永久解决 → Ubuntu 特有坑」来排错。
getenforce
可能结果:
Disabled:SELinux 根本没开(Ubuntu 默认)Permissive:只记录不拦截(排错阶段建议)Enforcing:真正拦截查看详细状态:
sestatus
如果显示 SELinux status: disabled,那你的问题不是 SELinux 导致的。
Ubuntu 启用 SELinux 需要:
selinux-basicssudo apt install selinux-basics selinux-policy-default
sudo selinux-activate
reboot
⚠️ 不建议在生产 Ubuntu 上用 SELinux,除非你非常清楚在做什么。
sudo ausearch -m avc -ts recent
或实时看:
sudo tail -f /var/log/audit/audit.log
典型拒绝示例:
type=AVC msg=audit(...): denied { read } for pid=... comm="nginx"
sudo apt install setools setroubleshoot
sealert -a /var/var/log/audit/audit.log
它会告诉你:
setsebool 或 semanage)sudo setenforce 0
确认问题是否消失:
sudo ausearch -m avc -ts recent | audit2allow -M myfix
sudo semodule -i myfix.pp
⚠️ 不要无脑允许所有 AVC,否则等于关掉 SELinux。
例如 Web 服务 403:
ls -Z /var/www/html
修复:
sudo semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
sudo restorecon -Rv /var/www/html
查看:
getsebool -a | grep httpd
开启:
sudo setsebool -P httpd_can_network_connect on
Ubuntu 默认有 AppArmor:
sudo aa-status
如果两者都在:
Ubuntu 的:
在 SELinux 下经常异常。
Ubuntu 的 SELinux policy 远不如 RHEL 完善。
getenforce
sestatus
ausearch -m avc
sealert -a /var/log/audit/audit.log
setenforce 0 # 验证
audit2allow
restorecon
如果你愿意,可以把:
ausearch -m avc 的输出贴出来,我可以直接帮你分析该加哪条 SELinux 规则。