十五、中秋特别篇:深入理解 SELinux - 系统安全的“月饼”与“门禁”

十五、中秋特别篇:深入理解 SELinux - 系统安全的“月饼”与“门禁”

值此中秋佳节,皓月当空,阖家团圆。在享受美味月饼的同时,我们不妨来聊聊Linux 系统中那位默默守护“家宅平安”的忠诚卫士——SELinux
SELinux (Security-Enhanced Linux) 是一个由美国国家安全局 (NSA)主导开发的强制访问控制 (MAC)安全子系统。它不再仅仅依赖“钥匙”,而是像一个一丝不苟的智能门禁系统。在这个系统里,每个人(进程) 和每个房间(文件、端口)都被贴上了独一无二的电子标签 (安全上下文)。门禁系统手握一本厚厚的“通行规则手册” (安全策略),严格规定了“谁”在什么时间可以进入“哪个房间”做什么事。

思维导图

在这里插入图片描述
在这里插入图片描述

一、SELinux 的核心概念与工作流程

想象一下中秋家宴,SELinux就像家里的管家,确保一切井然有序。

核心概念中秋家宴比喻描述示例
主体家庭成员/客人发起动作实体,通常是进程httpd 进程 (想端菜的厨师)
客体月饼/菜肴/房间被操作实体,可以是文件、目录、端口等。/var/www/html/index.html (一盘月饼)
策略家规一套规则集合。定义了谁能什么什么事“只有厨师 (httpd_t) 才能碰厨房里的月饼 (httpd_sys_content_t)。”
安全上下文身份胸牌/物品标签最重要的概念。是附加每个人/物上的安全标签system_u:object_r:httpd_sys_content_t:s0

安全上下文的结构:user:role:type:level

user (用户):SELinux用户,与Linux系统用户不同。
role (角色): 用于角色基于访问控制 (RBAC)。
type (类型): 最核心的部分。策略主要是基于主体和客体的类型来制定规则的。type也常被称为域 (Domain) (当用于主体时) 和 类型 (Type) (当用于客体时)。
level (级别): 用于多级别安全 (MLS),通常保持为 s0

SELinux 的工作流程
当一个主体(如 httpd 进程)尝试访问一个客体(如 /var/www/html/index.html 文件) 时,内核中的 SELinux安全模块会拦截这个操作,并执行以下检查流程:

在这里插入图片描述

二、SELinux 的三种工作模式

SELinux可以工作在三种不同的模式下。你可以临时切换模式,也可以永久修改配置文件。

模式SELINUX 配置值描述
强制模式enforcing默认且最安全的模式。严格执行安全策略,任何违反策略的访问都会被阻止,并记录审计日志 (/var/log/audit/audit.log)。
宽容模式permissive不阻止任何违反策略的访问,但会将其记录到审计日志中。此模式主要用于调试和排错,可以发现哪些操作会被阻止不影响服务正常运行
禁用模式disabled完全关闭 SELinux。不推荐在生产环境中使用。注意:从 disabled 切换到 enforcingpermissive需要重启系统

1. 常用管理命令 (临时切换与查看)

# 查看 SELinux 的当前状态和模式 sestatus # 获取当前的工作模式 (Enforcing, Permissive, Disabled) getenforce # 临时切换工作模式 (重启后失效)# 切换到宽容模式 setenforce 0# 切换回强制模式 setenforce 1
在这里插入图片描述

2. 通过配置文件修改 (永久生效)

要永久更改SELinux 的工作模式,你需要编辑其主配置文件。

配置文件路径/etc/selinux/config

操作步骤:
1.使用文本编辑器打开该文件。

vim /etc/selinux/config 

2.找到 SELINUX= 这一行。

在这里插入图片描述

3.将其值修改为你期望的模式:enforcing, permissive, 或 disabled

配置文件示例:

# This file controls the state of SELinux on the system.# SELINUX= can take one of these three values:# enforcing - SELinux security policy is enforced.# permissive - SELinux prints warnings instead of enforcing.# disabled - No SELinux policy is loaded.SELINUX=enforcing # SELINUXTYPE= can take one of three two values:# targeted - Targeted processes are protected,# minimum - Modification of targeted policy. Only selected processes are protected. # mls - Multi Level Security protection.SELINUXTYPE=targeted 
在这里插入图片描述
  1. 保存并退出文件。

重要提示:

如果你将模式从 enforcingpermissive 修改为 disabled,或者反之,必须重启系统 才能使更改完全生效。
如果你只是在 enforcingpermissive 之间切换,修改配置文件后,新模式会在下次系统启动时自动应用,无需立即重启。但如果你想立即生效,仍需配合setenforce 命令临时切换。

三、SELinux 安全上下文

管理文件和目录的安全上下文是日常SELinux运维中最常见的操作。

安全上下文的结构:user:role:type:level

user (用户):SELinux 用户,与 Linux 系统用户不同。

常见示例:

system_u—— 系统进程或内核使用的用户。
user_u—— 普通登录用户对应的 SELinux 用户。
unconfined_u—— 不受 SELinux 限制的自由用户(常见于桌面环境)。

role (角色):用于角色基于访问控制 (RBAC)。
常见示例:

object_r—— 文件、目录等客体角色。
system_r—— 系统进程角色。
user_r—— 普通用户角色。

type (类型)最核心的部分。策略主要是基于主体和客体的类型来制定规则的。
常见示例:

httpd_t—— Apache Web 服务进程类型。
httpd_sys_content_t—— Web 内容文件类型。
sshd_t—— SSH 服务进程类型。
var_log_t—— 系统日志文件类型。

level (级别):用于多级别安全 (MLS),通常保持为 s0

示例:

system_u:object_r:httpd_sys_content_t:s0—— Web 目录下文件的常见安全上下文。
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023—— 不受限用户的完整上下文标签。

1. 查看安全上下文 (ls -Z, ps -Z)

# 查看文件的安全上下文ls -Z /etc/passwd # 查看目录的安全上下文ls -ldZ /var/www/html # 查看进程的安全上下文ps -aux |grep httpd 
在这里插入图片描述

2. 临时修改安全上下文 (chcon)

chcon 用于临时修改文件或目录的安全上下文,适合快速测试,但重启或 restorecon 后会失效。

语法:chcon -t <type> <file_path>

# 1. 创建一个临时网页目录和文件mkdir -p /tmp/demo_web echo"Hello from SELinux test"|tee /tmp/demo_web/index.html # 2. 修改 Apache 配置,让它使用这个目录(假设系统已安装 httpd)sed -i 's#DocumentRoot "/var/www/html"#DocumentRoot "/tmp/demo_web"#' /etc/httpd/conf/httpd.conf sed -i 's#<Directory "/var/www/html">#<Directory "/tmp/demo_web">#' /etc/httpd/conf/httpd.conf systemctl restart httpd 
在这里插入图片描述

此时网页访问失败

curl http://localhost # 输出可能为:403 Forbidden# 因为 /tmp/demo_web 的类型是 default_t,不被 httpd 进程允许访问ls -Z /tmp/demo_web # 你会看到类似:unconfined_u:object_r:default_t:s0
在这里插入图片描述


使用 chcon 临时修正

chcon -R -t httpd_sys_content_t /tmp/demo_web # 现在类型是 httpd_sys_content_t systemctl restart httpd curl http://localhost # 成功访问:网页能正常显示内容
在这里插入图片描述

恢复后再次被阻止

# 恢复上下文为默认值(模拟系统重启后的效果) restorecon -Rv /tmp/demo_web curl http://localhost # 又回到 403 Forbidden
临时修改适合测试一次性应急,但不是长期方案。

3.永久修改与恢复安全上下文 (semanage fcontext, restorecon)

使用 semanage fcontext定义永久规则,再用 restorecon应用生效,是生产环境的正确做法。

# 1. 创建新网站目录mkdir -p /srv/website echo"Welcome to my site"|sudotee /srv/website/index.html # 修改 Apache 的 DocumentRootsed -i 's#DocumentRoot "/var/www/html"#DocumentRoot "/srv/website"#' /etc/httpd/conf/httpd.conf sed -i 's#<Directory "/var/www/html">#<Directory "/srv/website">#' /etc/httpd/conf/httpd.conf systemctl restart httpd curl http://localhost # 依旧 403 Forbidden,因为 /srv/website 目录类型错误ls -ldZ /srv/website # 结果可能是:unconfined_u:object_r:default_t:s0

使用 semanage 定义永久策略

# 定义 /srv/website 的默认上下文类型为 httpd_sys_content_t semanage fcontext -a -t httpd_sys_content_t "/srv/website(/.*)?"# 应用策略 restorecon -Rv /srv/website # 再次查看类型ls -Z /srv/website # 重启 Apache 并访问 systemctl restart httpd curl http://localhost 

四、管理 SELinux 布尔值

SELinux策略并非一成不变。布尔值 (Booleans) 是一种开关,允许管理员在不修改核心策略的情况下,动态调整某些策略规则的行为。

常用管理命令:
getsebool -a:列出所有的 SELinux 布尔值及其当前状态(on/off)。
setsebool [-P] <boolean_name> <on|off|1|0>:设置一个布尔值的状态。

不带 -P 选项:临时修改,重启后失效。
-P 选项:永久修改(Persist),会将设置写入策略文件。

代码案例 (允许 Apache 访问网络):

# 查看与 httpd 相关的布尔值 getsebool -a |grep httpd # 假设 httpd_can_network_connect 默认为 off,我们需要允许 httpd 访问外部数据库# 永久开启该布尔值 setsebool -P httpd_can_network_connect on 
在这里插入图片描述

五、故障排查

当 SELinux阻止了某个正常操作时,排查问题的关键在于分析日志。

审计日志: /var/log/audit/audit.log记录了所有被 SELinux拒绝 (denied)的操作。
setroubleshoot 服务: 这个服务会监控audit.log,并将复杂的拒绝信息翻译成人类可读的建议,通常记录在/var/log/messages 中,并提供解决问题的具体命令。
sealert 工具: (需要安装 setroubleshoot-server) sealert 是一个命令行工具,可以更直观地分析拒绝日志。
sealert -a /var/log/audit/audit.log 

该命令会分析日志并给出详细的报告和解决方案。

六、综合案例:中秋之夜 - 保护我们的家庭相册网站

场景描述:
中秋佳节,你想搭建一个简单的家庭相册网站,存放和分享家人团聚的照片。为了方便管理,你决定将所有照片存放在 /home/user/moon_festival_photos 目录下,并希望通过Apache (httpd)服务来展示这些照片。然而,SELinux这位尽职的“管家”,默认是不允许厨师 (httpd 进程)随便进入家庭成员的私人房间(/home/user/)拿取物品 (照片) 的。

操作步骤:

1.安装 httpd 并创建照片目录和示例文件:

yum install -y httpd mkdir -p /home/user/moon_festival_photos echo"<h1>Happy Mid-Autumn Festival!</h1><img src='moon.jpg'>"> /home/user/moon_festival_photos/index.html # (假设 /home/user/moon_festival_photos/moon.jpg 图片已存在)

2.修改 Apache 配置文件:
编辑 /etc/httpd/conf/httpd.conf,将 DocumentRoot<Directory> 指令的路径修改为你的照片目录。

DocumentRoot "/home/user/moon_festival_photos" <Directory "/home/user/moon_festival_photos"> Require all granted </Directory> 

3.尝试启动 httpd 并访问 (预期会失败):

systemctl restart httpd curl http://localhost # 此时,你很可能会看到 "403 Forbidden" 错误。

4.排查问题 - SELinux 在行动:

  • 查看审计日志,你会发现SELinux拒绝了 httpd 进程访问/home/user/... 目录下的文件。
grep"avc: denied" /var/log/audit/audit.log |grep httpd 
  • 查看文件上下文
ls -ldZ /home/user/moon_festival_photos 

你会发现它的类型很可能是 user_home_t,这是用户家目录的标准类型,默认不允许 httpd_t进程读取。

5.解决问题 - 使用 SELinux 布尔值 (更安全的方式)
直接修改/home 目录下文件的上下文是一种可行但不推荐的做法,因为它破坏了家目录的默认安全策略。SELinux提供了一个更优雅、更安全的开关——布尔值。

  • 查找相关布尔值:我们猜测应该有一个允许 httpd读取用户家目录内容的开关。
getsebool -a |grep httpd |grep home 
  • 你很可能会找到一个名为 httpd_enable_homedirs 的布尔值,它默认是 off
  • 永久开启该布尔值
setsebool -P httpd_enable_homedirs on 

6.最终测试:

# 无需重启 httpd 服务,布尔值更改通常立即生效curl http://localhost 

现在,即使在强制模式下,你的中秋相册网站也应该可以正常访问了!通过调整SELinux 的“家规”(布尔值),我们在没有破坏整体安全结构的前提下,满足了我们的特殊需求。


练习题

题目一:查看状态
写出一条命令,查看当前 SELinux 的完整状态,包括模式、策略类型等。

题目二:切换模式
如何将 SELinux临时切换到宽容模式?

题目三:查看文件上下文
如何查看 /home 目录自身的安全上下文?

题目四:查看进程上下文
如何查看当前bash shell 进程的安全上下文?

题目五:临时修改上下文
/tmp 目录下创建一个空文件 test.log。写出一条命令,将其类型临时修改为 var_log_t

题目六:永久修改上下文策略
你计划将 /data/mysql 目录用作 MySQL 数据库的存储路径。写出一条命令,添加一条策略,使得该目录及其下所有内容默认的安全上下文类型为 mysqld_db_t

题目七:应用上下文策略
接上题,写出一条命令,立即应用你刚刚添加的策略到 /data/mysql 目录。

题目八:查看布尔值
如何查看所有与 FTP 服务 (ftpd) 相关的 SELinux布尔值?

题目九:永久修改布尔值
写出一条命令,永久允许Apache (httpd)执行 CGI 脚本(对应的布尔值通常是 httpd_enable_cgi)。

题目十:日志分析
当你的服务因 SELinux 而无法启动时,你首先应该检查哪个日志文件来寻找拒绝 (denied)记录?

题目十一:chcon vs restorecon
简述 chconrestorecon 命令在修改文件上下文时的主要区别。

题目十二:setenforce 的持久性
使用 setenforce 0 命令后,如果重启系统,SELinux 会处于什么模式?

题目十三:semanage 的作用
semanage fcontext 命令直接修改了文件系统上的安全上下文吗?如果不是,它修改了什么?

题目十四:排错流程
描述一个排查SELinux相关问题的基本流程(至少三步)。

题目十五:综合应用
你需要让 vsftpd 服务能够读写FTP 用户的家目录。这通常需要开启一个布尔值。请写出查找并永久开启这个布尔值的完整命令序列 (假设该布尔值中包含 “ftp” 和 “home” 关键词)。

答案与解析

答案一:

sestatus 

答案二:

setenforce 0

答案三:

ls -ldZ /home 

答案四:

ps -Z 

答案五:

touch /tmp/test.log chcon -t var_log_t /tmp/test.log 

答案六:

semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"

答案七:

restorecon -Rv /data/mysql 

答案八:

getsebool -a |grep ftpd 

答案九:

setsebool -P httpd_enable_cgi on 

答案十:
应首先检查 /var/log/audit/audit.log 文件。

答案十一:
chcon:直接、临时地修改文件在文件系统上的当前上下文。 restorecon:不直接修改,而是根据semanage定义的策略来恢复文件的正确上下文。

答案十二:
SELinux 会恢复到/etc/selinux/config 文件中定义的永久模式(通常是 enforcing)。

答案十三:
不是。它修改的是 SELinux 的策略数据库。

答案十四:
先用 getenforce/sestatus 确认 SELinux 状态 → 再用 audit2why 或检查 /var/log/audit/audit.log 找出被拒绝的操作原因 → 最后根据需要临时调整策略(setsebool/写 policy 模块)或修改文件上下文(restorecon/semanage fcontext)来解决。

答案十五:

# 1. 查找相关的布尔值 getsebool -a |grepftp|grep home # 假设查找到的布尔值是 ftpd_full_access 或类似名称# 2. 永久开启该布尔值 setsebool -P ftpd_full_access on 

Read more

AI+游戏开发:如何用 DeepSeek 打造高性能贪吃蛇游戏

AI+游戏开发:如何用 DeepSeek 打造高性能贪吃蛇游戏

文章目录 * 一、技术选型与准备 * 1.1 传统开发 vs AI生成 * 1.2 环境搭建与工具选择 * 1.3 DeepSeek API 初步体验 * 二、贪吃蛇游戏基础实现 * 2.1 游戏结构设计 * 2.2 初始化游戏 * 2.3 DeepSeek 生成核心逻辑 * 三、游戏功能扩展 * 3.1 多人联机模式 * 3.2 游戏难度动态调整 * 3.3 游戏本地保存与回放 * 3.4 跨平台移植 * 《Vue.js项目开发全程实录/软件项目开发全程实录》 * 编辑推荐 * 内容简介 * 作者简介 * 目录 一、

By Ne0inhk
[DeepSeek] 入门详细指南(上)

[DeepSeek] 入门详细指南(上)

前言 今天的是 zty 写DeepSeek的第1篇文章,这个系列我也不知道能更多久,大约是一周一更吧,然后跟C++的知识详解换着更。 来冲个100赞兄弟们 最近啊,浙江出现了一匹AI界的黑马——DeepSeek。这个名字可能对很多人来说还比较陌生,但它已经在全球范围内引发了巨大的关注,甚至让一些科技巨头感到了压力。简单来说这 DeepSeek足以改变世界格局                                                   先   赞   后   看    养   成   习   惯  众所周知,一篇文章需要一个头图                                                   先   赞   后   看    养   成   习   惯   上面那行字怎么读呢,让大家来跟我一起读一遍吧,先~赞~后~看~养~成~习~惯~ 想要 DeepSeek从入门到精通.pdf 文件的加这个企鹅群:953793685(

By Ne0inhk
DeepFace深度学习库+OpenCV实现——情绪分析器

DeepFace深度学习库+OpenCV实现——情绪分析器

目录 应用场景 实现组件 1. 硬件组件 2. 软件库与依赖 3. 功能模块 代码详解(实现思路) 导入必要的库 打开摄像头并初始化变量 主循环 FPS计算 情绪分析及结果展示 显示FPS和图像 退出条件 编辑 完整代码 效果展示 自然的 开心的 伤心的 恐惧的 惊讶的  效果展示 自然的 开心的 伤心的 恐惧的 惊讶的   应用场景         应用场景比较广泛,尤其是在需要了解和分析人类情感反应的场合。: 1. 心理健康评估:在心理健康领域,可以通过长期监控和分析一个人的情绪变化来辅助医生进行诊断或治疗效果评估。 2. 用户体验研究:在产品设计、广告制作或网站开发过程中,通过观察用户在使用过程中的情绪反应,来优化产品的用户体验。 3. 互动娱乐:在游戏或虚拟现实应用中,根据玩家的情绪状态动态调整游戏难度或故事情节,以增加沉浸感和互动性。

By Ne0inhk
最全java面试题及答案(208道)

最全java面试题及答案(208道)

本文分为十九个模块,分别是:「Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM」 ,如下图所示: 共包含 208 道面试题,本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单,下面一起进入主题吧。 Java 基础 1. JDK 和 JRE 有什么区别? * JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java

By Ne0inhk