Ubuntu 上 SELinux 错误的定位与修复指南
一 快速判断与定位
- 确认 SELinux 状态与模式:使用命令查看当前状态与模式(Enforcing/Permissive/Disabled)。
- 查看拒绝日志:SELinux 拒绝事件通常记录在 /var/log/audit/audit.log,可用 ausearch -m avc 或 aureport -m avc 快速检索;若未安装审计服务,可临时用 dmesg 辅助排查。
- 检查文件与进程上下文:用 ls -Z 查看文件/目录的 SELinux 上下文,用 ps -eZ 查看进程的上下文,判断是否因上下文不当导致访问被拒。
- 辅助解释工具:使用 audit2why 将 AVC 拒绝转换为可读的原因说明,便于确定缺失的权限类型。
二 常见修复路径
- 临时放行(用于紧急恢复):将 SELinux 切到宽容模式以恢复业务,再继续排错。
- 永久策略修复(推荐):基于 AVC 日志生成最小权限模块并加载,既解决问题又保持安全。
- 上下文修复:对文件/目录执行 restorecon 恢复默认上下文,修复因误改或迁移导致的标签错误。
- 端口类型修复:当服务端口变更被 SELinux 拒绝时,使用 semanage port 将新端口加入对应类型(如 ssh_port_t)。
三 命令示例与操作要点
- 状态与模式
- 查看状态:sestatus 或 getenforce
- 临时切换:sudo setenforce 0(Permissive)/ sudo setenforce 1(Enforcing)
- 日志分析
- 检索当天 AVC:sudo ausearch -m avc -ts today
- 生成 AVC 报告:sudo aureport -m avc
- 解释拒绝原因:grep AVC /var/log/audit/audit.log | tail -3 | audit2why
- 策略生成与加载
- 生成模块:grep -i denied /var/log/audit/audit.log | audit2allow -M mypol
- 加载模块:sudo semodule -i mypol.pp
- 上下文修复
- 递归恢复默认标签:sudo restorecon -Rv /path/to/dir
- 端口类型(以 SSH 为例)
- 安装端口管理工具:sudo apt-get -y install selinux-policy-dev
- 查看当前端口类型:sudo semanage port -l | grep ssh(常见为 ssh_port_t tcp 22)
- 添加新端口:sudo semanage port -a -t ssh_port_t -p tcp 3389
- 验证并重启服务:sudo systemctl restart sshd.service;必要时放行防火墙端口
四 启用与兼容性提示
- Ubuntu 默认使用 AppArmor 而非 SELinux;在 Ubuntu 上启用 SELinux 属于可选方案,社区与文档支持相对有限,生产环境需充分测试。
- 若仅为个别服务(如 Nginx/Apache/SSH)遇到权限问题,优先尝试“最小权限策略修复 + 上下文修复”,尽量避免长期关闭 SELinux。
- 修改 /etc/selinux/config 的 SELINUX= 值后需重启;变更前务必备份数据与配置。
五 最小化策略模块模板
- 场景:为自定义脚本 /usr/local/bin/my_script 授予对 /var/www/html 的读写访问。
- 步骤:
- 抓取相关 AVC 并生成模块:grep -i denied /var/log/audit/audit.log | audit2allow -M myscript
- 在生成的 myscript.te 中补充规则(示例):
- policy_module(myscript, 1.0)
- type myscript_t;
- type myscript_exec_t;
- init_daemon_domain(myscript_t, myscript_exec_t)
- allow myscript_t httpd_sys_rw_content_t:dir { read write add_name remove_name };
- allow myscript_t httpd_sys_rw_content_t:file { create open read write unlink getattr };
- 编译并加载:make -f /usr/share/selinux/devel/Makefile 然后 sudo semodule -i myscript.pp
- 修复文件上下文并验证:sudo restorecon -v /usr/local/bin/my_script;必要时对目标目录执行 restorecon -Rv /var/www/html。