深入理解 SELinux:架构、概念与基本操作
目录
1. 什么是 SELinux?
SELinux 解决的问题
2. SELinux 架构与核心概念
目标策略架构
基本概念解析
上下文标签
策略规则
3. SELinux 操作模式
强制模式 (Enforcing)
宽容模式 (Permissive)
禁用模式 (Disabled)
4. SELinux 基本操作命令
查看当前模式
临时更改模式
查看 SELinux 上下文
启动时配置
持久化配置
5. SELinux 决策流程
总结
1. 什么是 SELinux?
安全增强型 Linux (SELinux) 是 Linux 系统的一项重要安全功能,它在传统的文件权限控制基础上提供了一个额外的安全层。与标准的用户、组和文件权限(自主访问控制 DAC)不同,SELinux 实现了强制访问控制 (MAC),这意味着安全策略适用于所有用户,无法通过自主配置来绕过。
SELinux 解决的问题
传统文件权限只能控制谁可以读取、写入或执行文件,但无法控制文件的使用方式。例如:
-
具有写权限的用户可能使用不合适的编辑器修改结构化数据文件,导致数据损坏
-
恶意用户可能利用应用程序漏洞访问非授权资源
SELinux 通过精细的访问控制解决了这些问题,即使应用程序本身存在安全漏洞,也能限制其破坏范围。
注:也能控制某一个进程能不能访问这个文件
2. SELinux 架构与核心概念
目标策略架构
SELinux 采用目标策略架构,特点包括:
-
由应用开发人员定义应用相关策略
-
策略声明了每个二进制文件、配置文件和数据的允许操作
-
具有策略的应用在受限域中运行,没有策略的应用则不受限制运行
基本概念解析
上下文标签
每个资源(文件、进程、目录、端口)都有一个 SELinux 上下文标签,格式为:
user:role:type:level
在 RHEL 的默认目标策略中,主要使用 type 字段来定义规则,类型上下文通常以 _t 结尾。
策略规则
SELinux 策略是安全规则的集合,定义了进程如何访问资源。关键原则:
-
默认拒绝所有访问
-
必须有显式规则才能允许访问
-
规则基于类型上下文匹配
示例场景:
-
Web 服务器进程:
httpd_t类型 -
Web 内容文件:
httpd_sys_content_t类型 -
策略规则:允许
httpd_t访问httpd_sys_content_t -
结果:Web 服务器只能访问标记为 Web 内容的文件,无法访问
/tmp目录(标记为tmp_t),必须要进程的上下文和目标文件上下文一致才能访问
3. SELinux 操作模式
SELinux 有三种操作模式:
强制模式 (Enforcing)
-
SELinux 强制执行加载的策略
-
违反策略的操作会被拒绝并记录
-
红帽企业 Linux 中的默认模式
宽容模式 (Permissive)
-
SELinux 加载策略但不强制执行
-
违反策略的操作会被记录但不会阻止
-
用于测试和故障排除
禁用模式 (Disabled)
-
SELinux 完全关闭
-
强烈不建议使用此模式
-
在 RHEL 9+ 中,只能通过内核参数
selinux=0禁用
重要提示:自 RHEL 9 起,在
/etc/selinux/config中设置SELINUX=disabled会导致 SELinux 启动但不加载任何策略,从而拒绝所有操作。
4. SELinux 基本操作命令
查看当前模式
# 查看当前 SELinux 模式
getenforce# 示例输出
Enforcing
临时更改模式
# 切换到宽容模式
setenforce 0
# 或
setenforce Permissive# 切换回强制模式
setenforce 1
# 或
setenforce Enforcing
查看 SELinux 上下文
# 查看进程的 SELinux 上下文
ps -ZC httpd# 查看文件的 SELinux 上下文
ls -Z /var/www# 查看目录的 SELinux 上下文
ls -Zd /var/www/html
启动时配置
# 使用内核参数
# 宽容模式:enforcing=0
# 强制模式:enforcing=1
# 禁用 SELinux:selinux=0(不推荐)
持久化配置
编辑 /etc/selinux/config 文件:# 设置默认模式
SELINUX=enforcing
# 或
SELINUX=permissive
5. SELinux 决策流程
SELinux 的访问控制决策流程如下:
-
进程请求访问资源(如 Web 服务器写入文件)
-
Linux 安全模块子系统 将决策转发给 SELinux
-
SELinux 子系统 检查策略规则
-
上下文匹配:比较进程类型(如
httpd_t)和资源类型(如httpd_sys_content_t) -
决策执行:
-
如果策略允许:操作继续进行
-
如果策略拒绝:操作被阻止并记录
-
总结
SELinux 为 Linux 系统提供了强大的强制访问控制机制,通过类型强制策略和上下文标签,实现了细粒度的资源访问控制。虽然初始配置可能有些复杂,但一旦正确设置,它能显著提升系统的安全性,防止权限升级和横向移动攻击。
