在 Ubuntu 上出现 SELinux 阻止访问,通常是因为以下几类原因。不过先说明一个重要事实:
Ubuntu 默认并不使用 SELinux,而是使用 AppArmor。
如果你在 Ubuntu 上遇到“SELinux 阻止访问”,通常是:
- 手动启用了 SELinux
- 使用了 CentOS/RHEL 镜像或容器
- 看错了提示(其实是 AppArmor)
下面分情况解释。
apparmor="DENIED"
✅ 如果你在 Ubuntu 上“看到 SELinux”,先确认:
getenforce
Disabled / 命令不存在 → 不是 SELinuxEnforcing → 你启用了 SELinux(少见)SELinux 阻止访问的根本原因是:
SELinux 通过 类型强制(TE) 控制:
例如:
httpd_t) 访问 /data/www/data/www 是 default_t
→ 被拒绝查看拒绝原因:
ausearch -m avc -ts recent
或
dmesg | grep avc
修复示例:
semanage fcontext -a -t httpd_sys_content_t "/data/www(/.*)?"
restorecon -Rv /data/www
某些操作需要开启策略开关:
getsebool -a | grep httpd
setsebool -P httpd_can_network_connect on
例如:
init_tmyapp_t如果你看到的是:
apparmor="DENIED" operation="open"
解决方式:
sudo aa-status
sudo aa-complain /usr/sbin/nginx
# 或
sudo nano /etc/apparmor.d/usr.sbin.nginx
sudo systemctl reload apparmor
# 是否有 SELinux
which getenforce
getenforce
# 是否有 AppArmor
aa-status
如果你愿意,可以发:
dmesg / journalctl)我可以告诉你 到底是 SELinux 还是 AppArmor,以及具体怎么放行。