一、SELinux 架构

1.1 什么是 SELinux?

SELinux 是 Linux 内核中的安全增强模块,通过实施 ** 强制访问控制(MAC)** 来保护系统资源。它对文件、端口和其他资源的访问进行精细级别的控制,进程仅被允许访问其 SELinux 策略或布尔值设置指定的资源。

1.2 文件权限控制的局限性

传统的文件权限控制(如读、写、执行权限)存在明显局限性:

文件权限不会阻止具有文件访问权限的授权用户将文件用于非预期用途。

例如,具有文件写访问权限的编辑器,可能被恶意程序利用修改特定程序的结构数据,导致数据损坏或安全问题。

文件权限限制只会阻止此类修改,而不控制文件的使用方式,仅能控制读取、写入或执行文件。

1.3 SELinux 的工作方式

SELinux 由开发人员定义的若干应用相关策略组成,这些策略声明了对于应用使用的每个二进制可执行文件、配置文件和数据文件,哪些操作和访问是恰当且被允许的。此配置称为目标策略,因为一个策略定义了应用的活动。策略声明了各个程序、文件和网络端口上配置的预定义标签。

二、SELinux 基本概念

2.1 强制访问控制(MAC)

SELinux 提供了一个额外的基于对象的安全层,它在粒度规则中定义,称为强制访问控制(MAC)。MAC 策略适用于所有用户,无法通过自主配置设置来针对特定用户绕过这些策略。

特点

强制执行:系统级强制规则,所有主体和客体必须遵守。

高安全性:即使攻击者已泄露应用或系统服务访问权限,也能限制其操作范围。

策略驱动:访问规则由管理员定义,不受用户 / 进程自主控制。

2.2 SELinux 上下文

所有资源(如进程、文件和端口)都有一个标签,称为 SELinux 上下文。上下文标签与定义的 SELinux 策略规则匹配,以允许进程访问带有这些标签的资源。默认情况下,策略不允许任何访问,除非有显式规则授予了访问权限。

SELinux 上下文格式:

user:role:type:level

例如:unconfined_u:object_r:httpd_sys_content_t:s0

user:SELinux 用户身份(如 unconfined_u

role:角色(如 object_r 表示文件 / 目录角色)

type:类型(Type),是 SELinux 策略中最重要的部分,定义了对象的安全属性(如 httpd_sys_content_t 表示 Web 内容类型)

level:安全级别,在默认的 targeted 策略中通常为 s0

2.3 策略访问规则概念

SELinux 策略定义了进程类型(如 httpd_t)和文件类型(如 httpd_sys_content_t)之间的访问规则。例如:

Apache Web 服务器进程使用 httpd_t 类型上下文运行。

策略允许 httpd_t 访问标记为 httpd_sys_content_t 类型的文件和目录。

默认情况下,httpd_t 不允许访问标记为 tmp_t 类型的文件(如 /tmp 目录),即使文件权限允许,也会被 SELinux 阻止。

三、SELinux 模式

SELinux 具有以下操作模式:

模式 描述
Enforcing 强制执行加载的策略,是红帽企业 Linux 中的默认模式。
Permissive 加载策略并处于活动状态,但不强制执行访问控制规则,仅记录访问违规。用于应用和规则测试。
Disabled 已关闭,SELinux 违规不会被拒绝或记录。强烈建议不要禁用。

3.1 临时更改 SELinux 模式

使用 getenforce 命令查看当前 SELinux 模式,使用 setenforce 命令临时更改模式:

# 查看当前模式
getenforce

# 临时切换到 Permissive 模式(宽松模式,记录违规但不阻止)
setenforce 0

# 临时切换到 Enforcing 模式(严格模式)
setenforce 1

3.2 永久设置默认模式

要持久配置 SELinux 模式,编辑 /etc/selinux/config 文件:

# 编辑配置文件
vi /etc/selinux/config

# 设置为 Enforcing 模式
SELINUX=enforcing

# 或设置为 Permissive 模式
# SELINUX=permissive

重启系统后生效。

四、SELinux 上下文管理

4.1 查看 SELinux 上下文

许多列出资源的命令使用 -Z 选项来管理 SELinux 上下文:

# 查看进程上下文
ps axZ
ps -ZC httpd

# 查看文件上下文
ls -Z /var/www
ls -Zd /var/www/html

4.2 初始 SELinux 上下文

SELinux 在 /etc/selinux/targeted/contexts/files/ 目录中维护基于文件的标签策略数据库。新文件在文件名与现有标签策略匹配时获得默认标签。

移动文件:在同一文件系统内移动文件,会保留原始 SELinux 上下文。

复制文件:复制文件会创建新的索引节点,文件会从目标目录继承新的 SELinux 上下文。

保留上下文:使用 cp --preserve=contextcp -p 命令可保留源文件的上下文。

4.3 更改 SELinux 上下文

管理文件的 SELinux 上下文主要使用以下命令:

命令 作用 特点
semanage fcontext 定义文件上下文的默认策略(永久生效) 推荐方法,策略重启后依然有效
restorecon 根据策略恢复文件的默认上下文 semanage 配合使用
chcon 直接在文件上更改上下文(临时生效) 重启或执行 restorecon 后会被覆盖
实战示例:定义 /custom 目录的上下文规则

需求:将 /custom 目录及其中所有文件的上下文类型设置为 httpd_sys_content_t,以便 Apache 服务可以访问。

定义永久上下文策略

semanage fcontext -a -t httpd_sys_content_t "/custom(/.*)?"

-a:添加一条新的上下文规则

-t httpd_sys_content_t:指定目标上下文类型

"/custom(/.*)?":正则表达式,匹配 /custom 目录及其下所有子文件和子目录

应用上下文策略

restorecon -Rv /custom

-R:递归处理目录下所有内容

-v:显示修改过程的详细信息

五、SELinux 布尔值:灵活调整策略

SELinux 布尔值是策略中可调整的开关,用于启用或禁用特定的安全规则,无需重新编译整个策略。

5.1 管理布尔值

# 列出所有布尔值
getsebool -a

# 查看特定布尔值
getsebool httpd_enable_homedirs

# 临时设置布尔值
setsebool httpd_enable_homedirs on

# 永久设置布尔值(重启后生效)
setsebool -P httpd_enable_homedirs on

5.2 示例:允许 Apache 访问用户主目录

默认情况下,Apache 服务(httpd_t)不允许访问用户主目录(user_home_dir_t)。通过启用 httpd_enable_homedirs 布尔值,可以允许 Apache 访问用户主目录:

setsebool -P httpd_enable_homedirs on

六、监控 SELinux 违规:排查安全问题

当应用因 SELinux 访问策略而意外失败时,可以通过以下方法排查问题:

检查日志

SELinux 违规事件记录在 /var/log/audit/audit.log/var/log/messages 中。使用 sealert 工具分析日志,生成详细的违规报告:

sealert -a /var/log/audit/audit.log

排查步骤

检查服务的端口标签是否正确。

验证文件的 SELinux 上下文是否符合策略要求。

检查相关的 SELinux 布尔值是否需要启用。

必要时切换到 Permissive 模式,确认问题是否由 SELinux 策略导致。

七、总结与最佳实践

核心思想:SELinux 通过强制访问控制(MAC),为系统提供了深度防御,即使应用程序存在漏洞,也能限制攻击者的操作范围。

上下文管理:使用 semanage fcontext + restorecon 是管理文件上下文的推荐方法,确保策略永久生效。

模式选择:生产环境中始终使用 Enforcing 模式,Permissive 模式仅用于调试和测试。

布尔值应用:利用布尔值灵活调整策略,避免修改复杂的安全规则。

日志监控:定期检查 SELinux 日志,及时发现和处理安全违规事件。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐