目录
[1. SELinux 故障排除基础](#1. SELinux 故障排除基础)
[理解 SELinux 的工作方式](#理解 SELinux 的工作方式)
[2. SELinux 拒绝访问的常见场景](#2. SELinux 拒绝访问的常见场景)
[3. 监控和诊断工具详解](#3. 监控和诊断工具详解)
[3.1 日志文件:第一现场](#3.1 日志文件:第一现场)
[3.2 sealert:智能诊断工具](#3.2 sealert:智能诊断工具)
[sealert 命令详解](#sealert 命令详解)
[sealert 输出解析](#sealert 输出解析)
[3.3 ausearch:专业审计日志分析](#3.3 ausearch:专业审计日志分析)
[4. 实战故障排除流程](#4. 实战故障排除流程)
[5. 理解 sealert 建议的置信度](#5. 理解 sealert 建议的置信度)
[6. 常见问题分类和解决方案](#6. 常见问题分类和解决方案)
[6.1 文件上下文问题](#6.1 文件上下文问题)
[6.2 布尔值问题](#6.2 布尔值问题)
[6.3 端口绑定问题](#6.3 端口绑定问题)
[7. 故障排除思维导图](#7. 故障排除思维导图)
[8 重要提醒](#8 重要提醒)
[不要轻易禁用 SELinux](#不要轻易禁用 SELinux)
[理解 sealert 建议的局限性](#理解 sealert 建议的局限性)
1. SELinux 故障排除基础
理解 SELinux 的工作方式
SELinux 不是"阻止工作的障碍",而是系统的安全守护者。当出现访问拒绝时,通常是因为:
-
策略设计正确:SELinux 正在阻止潜在的危险操作
-
配置需要调整:应用或文件的配置需要与安全策略对齐
-
上下文标签错误:资源被标记了错误的上下文类型
核心故障排除原则
# 记住这些关键点:
# 1. 大多数拒绝表明 SELinux 正常工作
# 2. 文件上下文错误是最常见的问题
# 3. 布尔值可以启用可选功能
# 4. SELinux 不替代传统文件权限
2. SELinux 拒绝访问的常见场景
场景分析:文件上下文不匹配
bash
# 典型示例:从错误位置移动文件到Web目录
[root@host ~]# touch /root/mypage
[root@host ~]# mv /root/mypage /var/www/html/
[root@host ~]# curl http://localhost/mypage
# 结果:403 Forbidden
# 原因:文件保留了 admin_home_t 上下文,而不是 httpd_sys_content_t
访问决策流程回顾
bash
进程请求 → SELinux检查 → 策略规则匹配 → 允许/拒绝
↓ ↓ ↓ ↓
httpd_t httpd_sys_content_t 有规则? 决策结果
3. 监控和诊断工具详解
3.1 日志文件:第一现场
主要日志文件
bash
# 1. 主要审计日志(原始数据)
/var/log/audit/audit.log
# 2. 系统消息日志(摘要信息)
/var/log/messages
# 3. SELinux 故障排除日志
/var/log/setroubleshoot/
日志内容解析
bash
# 查看最近的AVC拒绝消息
tail /var/log/audit/audit.log | grep AVC
# 查看SELinux故障排除消息
tail /var/log/messages | grep setroubleshoot
3.2 sealert:智能诊断工具
安装故障排除工具
bash
# 安装setroubleshoot服务器
yum install setroubleshoot-server
# 重启服务以应用更改
systemctl restart auditd
sealert 命令详解
bash
# 查看特定UUID的事件
sealert -l 95741f98-6056-45bc-95da-ce67ec9a9ab7
# 分析整个审计日志
sealert -a /var/log/audit/audit.log
# 实时监控新事件
sealert -f /var/log/audit/audit.log
sealert 输出解析
bash
ba# 典型输出结构:
SELinux is preventing /usr/sbin/httpd from getattr access on the file.
***** Plugin restorecon (92.2 confidence) suggests ************************
If you want to fix the label.
/var/www/html/mypage default label should be httpd_sys_content_t.
Then you can run restorecon.
Do
# /sbin/restorecon -v /var/www/html/mypage
3.3 ausearch:专业审计日志分析
常用搜索模式
bash
# 搜索最近的AVC事件
ausearch -m AVC -ts recent
# 搜索特定时间范围内的事件
ausearch -m AVC -ts 10:00 -te 11:00
# 搜索特定进程的事件
ausearch -m AVC -c httpd
# 搜索特定文件的事件
ausearch -m AVC -f /var/www/html/mypage
输出信息解读
bash
# AVC消息关键字段:
type=AVC
msg=audit(1649249057.067:212):
avc: denied { getattr } # 被拒绝的操作
for pid=2332 comm="httpd" # 进程信息
path="/var/www/html/mypage" # 访问的文件
scontext=system_u:system_r:httpd_t:s0 # 源上下文(进程)
tcontext=unconfined_u:object_r:admin_home_t:s0 # 目标上下文(文件)
tclass=file # 目标类别
4. 实战故障排除流程
完整诊断示例
bash
# 1. 重现问题
curl http://localhost/mypage # 返回403错误
# 2. 检查系统日志
tail /var/log/messages
# 输出:SELinux is preventing /usr/sbin/httpd from getattr access...
# 输出:For complete SELinux messages run: sealert -l UUID
# 3. 使用sealert获取详细分析
sealert -l 95741f98-6056-45bc-95da-ce67ec9a9ab7
# 4. 根据建议修复(通常是文件上下文)
restorecon -v /var/www/html/mypage
# 5. 验证修复
curl http://localhost/mypage # 现在应该正常访问
文件上下文修复命令详解
bash
# 修复单个文件
restorecon -v /path/to/file
# 递归修复目录
restorecon -Rv /path/to/directory
# 强制重置(即使上下文正确也重新应用)
restorecon -FRv /path/to/directory
# 试运行(不实际更改)
restorecon -Rv -n /path/to/directory
5. 理解 sealert 建议的置信度
置信度评级说明
-
高置信度 (90%+):建议很可能解决问题
-
中置信度 (70-89%):建议可能有效,需要验证
-
低置信度 (<70%):建议需要仔细评估
评估建议的适用性
bash
# 示例:sealert 可能建议:
# 1. 修复文件上下文 ✓ (通常是正确的)
# 2. 创建新策略 ✗ (可能不合适)
# 3. 设置布尔值 ✗ (可能过度授权)
# 关键问题:文件真的应该在当前位置吗?
# - 如果是:修复上下文
# - 如果否:移动文件到正确位置
6. 常见问题分类和解决方案
6.1 文件上下文问题
bash
# 症状:文件在正确位置但访问被拒
# 解决方案:
ls -Z /path/to/file # 检查当前上下文
semanage fcontext -l | grep /path/to/directory # 查看应有上下文
restorecon -Rv /path/to/directory # 修复上下文
6.2 布尔值问题
bash
# 症状:功能缺失但文件上下文正确
# 解决方案:
getsebool -a | grep service_name # 查找相关布尔值
setsebool -P boolean_name on # 启用布尔值
6.3 端口绑定问题
bash
# 症状:服务无法绑定到端口
# 解决方案:
semanage port -l | grep service_name # 查看允许的端口
semanage port -a -t port_type -p tcp port_number # 添加端口
7. 故障排除思维导图
bash
SELinux 访问被拒
│
├── 文件上下文错误
│ ├── 检查: ls -Z
│ └── 修复: restorecon
│
├── 需要布尔值
│ ├── 检查: getsebool
│ └── 修复: setsebool -P
│
├── 端口绑定问题
│ ├── 检查: semanage port -l
│ └── 修复: semanage port -a
│
└── 策略缺失
├── 检查: sealert 建议
└── 修复: 创建自定义策略
8 重要提醒
不要轻易禁用 SELinux
bash
# 错误做法:
setenforce 0 # 临时禁用
# 或更糟:编辑 /etc/selinux/config 永久禁用
# 正确做法:
# 1. 诊断根本原因
# 2. 应用精确修复
# 3. 保持安全保护
理解 sealert 建议的局限性
-
技术正确性 ≠ 业务适当性
-
总是问:"这个建议在我的环境中合理吗?"
-
优先选择最小权限的解决方案
总结
SELinux 故障排除是一个系统化的过程:
-
识别问题:通过错误信息和日志定位拒绝访问
-
诊断原因:使用 sealert 和 ausearch 分析根本原因
-
评估方案:基于置信度和业务需求选择修复方案
-
实施修复:应用精确的、最小权限的解决方案
-
验证结果:确认问题解决且没有引入新问题