Ubuntu 启用 SELinux 与虚拟机环境实践
一 前置说明与准备
- Ubuntu 默认使用 AppArmor,而 SELinux 可并行启用;当启用 SELinux 后,AppArmor 不会生效,二者一般不会冲突。若希望仅保留 SELinux,可选择卸载 AppArmor(可选)。在虚拟机中操作前务必先做快照,以便回滚。建议安装审计组件 auditd 以收集拒绝日志,便于排错。
二 在 Ubuntu 宿主机启用 SELinux
- 安装所需软件包
- sudo apt update
- sudo apt install selinux-basics auditd setools selinux-policy-dev
- 激活 SELinux
- sudo selinux-activate(会在内核启动参数中添加 security=selinux,可检查 /boot/grub/grub.cfg 与 cat /proc/cmdline)
- 初始化文件标签
- sudo touch /.autorelabel(首次启用或大量迁移文件后用于为文件系统重新打标签)
- 配置模式
- 编辑 /etc/selinux/config:SELINUX=enforcing|permissive|disabled
- 运行时切换:setenforce 1|0(仅在 enforcing 与 permissive 间切换,无需重启;从/到 disabled 需重启)
- 重启并验证
- sudo reboot
- sestatus、getenforce 查看状态;必要时查看 auditd 日志(/var/log/audit/audit.log)定位拒绝事件。
三 KVM 虚拟化与 sVirt 安全隔离
- 安装与准备 KVM
- sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager
- 确认虚拟化与 KVM 模块:cat /proc/cpuinfo | egrep ‘vmx|svm’;lsmod | grep kvm
- SELinux 与 KVM 的 sVirt 集成
- 启用 SELinux 后,KVM/QEMU 进程与虚拟机磁盘镜像会被自动置于独立的 MCS/MLS 标签域,实现虚拟机之间的强制访问控制与隔离;即便同一用户启动多台 VM,也能通过标签隔离,降低横向移动风险。
- 实践要点
- 保持宿主机 SELinux 为 enforcing,避免关闭导致 sVirt 标签失效。
- 虚拟磁盘、快照等客体对象保持正确的 SELinux 类型与标签,避免被非授权域访问。
四 常见问题与排错要点
- 无法从 disabled 切换到 enforcing
- 修改 /etc/selinux/config 后必须重启;仅使用 setenforce 无法跨越 disabled 状态。
- 首次启用后服务启动失败或权限异常
- 检查是否存在 /.autorelabel,该文件会触发系统重启时的全量重打标签;如标签不完整,相关进程可能被拒绝访问必需文件。
- 拒绝日志定位
- 使用 ausearch -m avc -ts recent 或查看 /var/log/audit/audit.log,结合 setools(如 apol)分析策略与上下文。
- AppArmor 与 SELinux 的关系
- 二者可并存但不会同时生效;启用 SELinux 后 AppArmor 不生效。若追求单一安全框架,可选择卸载 AppArmor(可选)。