SELinux 安全策略配置与故障排查实战
SELinux 安全策略配置与故障排查实战
一、SELinux 概述
1.1 什么是 SELinux
SELinux(Security-Enhanced Linux)是由 NSA 开发的 Linux 安全模块,提供强制访问控制(MAC)机制。与传统的自主访问控制(DAC)不同,SELinux 基于策略规则,对进程和文件进行细粒度访问控制。
1.2 SELinux 工作模式
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Enforcing | 强制模式,阻止违规操作并记录 | 生产环境 |
| Permissive | 宽容模式,仅记录不阻止 | 调试/测试 |
| Disabled | 完全禁用 | 不推荐 |
1.3 查看 SELinux 状态
1 | # 查看 SELinux 状态 |
sestatus 输出示例:
1 | SELinux status: enabled |
二、SELinux 核心概念
2.1 安全上下文(Security Context)
每个进程和文件都有安全上下文,格式为:
1 | user:role:type:level |
查看安全上下文:
1 | # 查看文件上下文 |
示例输出:
1 | # 文件上下文 |
2.2 类型(Type)- 最重要的概念
SELinux 主要使用 类型强制(Type Enforcement) 控制访问:
- 进程类型:如
httpd_t、mysqld_t、sshd_t - 文件类型:如
httpd_sys_content_t、mysqld_db_t、ssh_home_t
规则:进程类型只能访问允许的文件类型。
2.3 布尔值(Booleans)
布尔值是 SELinux 策略的可调节开关,用于启用/禁用特定功能。
1 | # 查看所有布尔值 |
三、SELinux 配置管理
3.1 配置文件
主配置文件:/etc/selinux/config
1 | # /etc/selinux/config |
修改后需重启生效。
3.2 模式切换
1 | # 临时切换(重启失效) |
3.3 策略管理
1 | # 查看已安装策略 |
四、故障排查流程
4.1 典型故障现象
- 服务启动失败
- 文件访问被拒绝(Permission denied)
- 网络连接被阻止
- 端口绑定失败
4.2 排查步骤
步骤 1:确认是否为 SELinux 问题
1 | # 临时切换到 Permissive 模式 |
步骤 2:查看审计日志
1 | # 查看 SELinux 拒绝日志 |
日志示例:
1 | type=AVC msg=audit(1711180800.123:456): avc: denied { read } for |
日志解读:
denied { read }: 拒绝的操作comm="httpd": 进程名称scontext: 源上下文(进程)tcontext: 目标上下文(文件)tclass=file: 对象类别
步骤 3:分析问题原因
1 | # 使用 audit2why 分析原因 |
步骤 4:生成并应用策略
方法 1:使用 audit2allow 自动生成策略
1 | # 从日志生成策略模块 |
方法 2:手动修复文件上下文
1 | # 查看文件当前上下文 |
方法 3:启用相关布尔值
1 | # 查看相关布尔值 |
4.3 常见故障案例
案例 1:Nginx 无法访问自定义目录
现象: Nginx 返回 403 Forbidden
排查:
1 | # 查看日志 |
解决:
1 | # 方法 1:修改文件上下文 |
案例 2:MySQL 无法在非标准目录创建数据
现象: MySQL 启动失败,报错 Permission denied
排查:
1 | ausearch -m avc -ts recent | grep mysqld |
解决:
1 | # 设置正确的上下文 |
案例 3:应用无法绑定非标准端口
现象: 应用启动失败,无法绑定端口 8080
排查:
1 | # 查看端口上下文 |
解决:
1 | # 添加端口到 http_port_t 类型 |
案例 4:Docker 容器无法访问宿主机目录
现象: 容器内无法读取挂载的宿主机目录
解决:
1 | # 方法 1:设置容器共享上下文 |
五、最佳实践
5.1 生产环境配置建议
1 | # 1. 保持 Enforcing 模式 |
5.2 开发/测试环境建议
1 | # 使用 Permissive 模式便于调试 |
5.3 策略定制流程
- 在 Permissive 模式下测试应用
- 收集所有 AVC 拒绝日志
- 使用 audit2allow 生成策略
- 审查生成的策略(重要!)
- 切换回 Enforcing 模式
- 安装自定义策略模块
- 验证应用正常运行
5.4 常用布尔值参考
Web 服务:
1 | setsebool -P httpd_can_network_connect on # 允许外连 |
数据库服务:
1 | setsebool -P mysql_connect_any on # MySQL 任意连接 |
容器服务:
1 | setsebool -P container_manage_cgroup on # 管理 cgroup |
文件共享:
1 | setsebool -P nfs_export_all_rw on # NFS 读写 |
六、监控与告警
6.1 日志监控
1 | # 实时监控 SELinux 拒绝 |
6.2 Prometheus 监控
1 | # 使用 node_exporter 收集 SELinux 指标 |
6.3 告警规则
1 | # prometheus/alerts/selinux.yml |
七、故障排查命令速查表
| 目的 | 命令 |
|---|---|
| 查看状态 | getenforce, sestatus |
| 切换模式 | setenforce 0/1 |
| 查看文件上下文 | ls -Z file |
| 查看进程上下文 | ps -eZ |
| 查看端口上下文 | semanage port -l |
| 查看布尔值 | getsebool -a |
| 设置布尔值 | setsebool -P name on/off |
| 查看拒绝日志 | ausearch -m avc -ts recent |
| 分析拒绝原因 | audit2why |
| 生成策略 | audit2allow -M mypol |
| 安装策略 | semodule -i mypol.pp |
| 设置文件上下文 | semanage fcontext -a -t type path |
| 应用上下文 | restorecon -Rv path |
| 添加端口类型 | semanage port -a -t type -p tcp port |
八、总结
SELinux 故障排查的核心思路:
- 确认问题:切换到 Permissive 模式验证是否为 SELinux 问题
- 查看日志:使用
ausearch和audit2why分析拒绝原因 - 选择方案:
- 文件上下文错误 → 使用
semanage fcontext+restorecon - 缺少策略规则 → 使用
audit2allow生成策略 - 功能被布尔值限制 → 启用相关布尔值
- 文件上下文错误 → 使用
- 验证修复:切换回 Enforcing 模式,验证应用正常
- 文档记录:记录策略变更,便于后续维护
重要原则:
- 生产环境保持 Enforcing 模式
- 不要随意禁用 SELinux
- 自定义策略要审查后再应用
- 定期审计和清理无用策略
参考文档:
- SELinux 官方文档:https://selinuxproject.org/
- Red Hat SELinux 指南:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_and_managing_selinux/index
- audit2allow 手册:man audit2allow
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 体系所运维知识库!