Ubuntu 上启用与配置 SELinux 的完整指南
一 前置说明与准备
- Ubuntu 默认使用 AppArmor 而非 SELinux。如确需使用 SELinux,需要手动安装、启用并进行策略调优。为便于排错,建议安装审计服务并将 SELinux 初始设为Permissive(宽容)模式,确认业务稳定后再切到Enforcing(强制)。
- 建议安装的基础组件与用途如下(按发行版可用情况选择):
- 核心与策略:selinux-basics、selinux-policy-default
- 审计与排错:auditd、setools、audit2allow
- 策略与布尔管理:policycoreutils、semanage(部分环境需单独安装)
- 安装与激活示例:
- sudo apt update
- sudo apt install -y selinux-basics selinux-policy-default auditd setools
- sudo selinux-activate
- 重启后验证:getenforce、sestatus。
二 启用与模式切换
- 配置文件路径:/etc/selinux/config,关键项为:
- SELINUX=enforcing|permissive|disabled
- SELINUXTYPE=default|mls|src(Ubuntu 常见为 default)
- 临时切换(无需重启):
- 设为宽容:sudo setenforce 0
- 设为强制:sudo setenforce 1
- 永久切换:
- 编辑 /etc/selinux/config 设置 SELINUX=…,保存后重启生效
- 从 Enforcing ↔ Permissive 可用 setenforce 即时切换;涉及 Disabled 时必须改配置并重启
- 首次启用或策略/文件上下文不一致时,建议创建自动重标记标志并重启:
- sudo touch /.autorelabel
- sudo reboot
- 验证命令:
- 当前模式:getenforce
- 详细状态:sestatus。
三 策略与端口管理
- 端口标签(示例:将 8080/tcp 加入 http 端口类型)
- 查看端口类型:semanage port -l | grep http_port_t
- 添加端口:sudo semanage port -a -t http_port_t -p tcp 8080
- 文件上下文与 restorecon
- 添加上下文规则:sudo semanage fcontext -a -t httpd_sys_content_t “/var/www/html(/.*)?”
- 应用上下文:sudo restorecon -Rv /var/www/html
- 布尔值(示例:允许 httpd 访问用户主目录)
- sudo setsebool -P httpd_enable_homedirs 1
- 自定义模块(从拒绝日志生成并加载)
- 提取并生成模块:grep avc /var/log/audit/audit.log | audit2allow -M mypol
- 加载模块:sudo semodule -i mypol.pp
- 常用排错
- 查看最近拒绝:sudo ausearch -m avc -ts recent
- 生成 AVC 报告:sudo aureport -m avc。
四 常见问题与注意事项
- 与 AppArmor 的冲突
- Ubuntu 默认启用 AppArmor。启用 SELinux 前可先停止或卸载 AppArmor(如:sudo systemctl stop apparmor;谨慎使用 purge 以避免系统不稳定),再启用 SELinux 并重启。
- 切换模式与重启
- 在 Enforcing/Permissive 间切换可用 setenforce 即时生效;涉及 Disabled 或首次从 disabled 启用时,必须修改 /etc/selinux/config 并重启;文件系统需要重标记时创建 /.autorelabel 后重启。
- 日志与审计
- 确保 auditd 运行,SELinux 拒绝日志位于 /var/log/audit/audit.log;结合 ausearch/audit2allow 分析并生成策略模块。
- 备份与回滚
- 建议备份 /etc/selinux 配置目录:
- 备份:sudo rsync -a /etc/selinux/ ~/selinux-backup/
- 恢复:sudo rsync -a ~/selinux-backup/ /etc/selinux/
- 使用建议
- 生产环境优先使用 Enforcing 并通过策略逐步收敛;若对 SELinux 不熟悉,Ubuntu 上 AppArmor 通常更易上手。