在 Ubuntu 上出现 “SELinux 拒绝访问” 的情况,通常有以下几种原因。先说明一个容易混淆的点:
Ubuntu 默认使用的不是 SELinux,而是 AppArmor
如果你在 Ubuntu 上看到了 SELinux 相关的拒绝信息,通常是:
- 你手动安装并启用了 SELinux
- 或者是误把 AppArmor 的拒绝当成 SELinux
- 或者你在使用 CentOS/RHEL 风格的容器/虚拟机
enforcing 模式SELinux 会严格按安全策略检查:
例如:
type=AVC msg=audit(...): denied { read } for pid=...
常见原因:
Ubuntu 默认文件系统没有为 SELinux 打标签。
例如:
ls -Z /var/www/html
# 显示 unlabeled_t 或 wrong_t
SELinux 会直接拒绝访问。
✅ 解决:
semanage fcontext -a -t httpd_sys_content_t "/var/www/html(/.*)?"
restorecon -Rv /var/www/html
例如:
getsebool -a | grep httpd
setsebool -P httpd_can_network_connect on
SELinux 会限制服务监听端口。
例如:
semanage port -l | grep http
semanage port -a -t http_port_t -p tcp 8080
Ubuntu 默认是 AppArmor:
aa-status
AppArmor 拒绝示例:
apparmor="DENIED" operation="open"
✅ 如果是 AppArmor 问题,应该:
sudo aa-complain /usr/sbin/nginx
# 或
sudo aa-disable /usr/sbin/nginx
# 是否启用 SELinux
sestatus
getenforce
# 是否使用 AppArmor
aa-status
✅ Ubuntu 默认不会用 SELinux
✅ 如果看到 SELinux 拒绝,说明你主动启用了 SELinux
✅ 大多数 Ubuntu 用户真正遇到的是 AppArmor 拒绝
如果你愿意,可以贴出:
dmesg / /var/log/audit/audit.log)我可以直接帮你判断是 SELinux 还是 AppArmor,并给具体解决方法。