十五、中秋特别篇:深入理解 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与蓝耘通义万相2.1的无缝融合引领行业智能化变革

AI革命先锋:DeepSeek与蓝耘通义万相2.1的无缝融合引领行业智能化变革

云边有个稻草人-ZEEKLOG博客 目录 引言 一、什么是DeepSeek? 1.1 DeepSeek平台概述 1.2 DeepSeek的核心功能与技术 二、蓝耘通义万相2.1概述 2.1 蓝耘科技简介 2.2 蓝耘通义万相2.1的功能与优势 1. 全链条智能化解决方案 2. 强大的数据处理能力 3. 高效的模型训练与优化 4. 自动化推理与部署 5. 行业专用解决方案 三、蓝耘通义万相2.1与DeepSeek的对比分析 3.1 核心区别 3.2 结合使用的优势 四、蓝耘注册流程 五、DeepSeek与蓝耘通义万相2.1的集成应用 5.1 集成应用场景 1. 智能医疗诊断

By Ne0inhk
如何通过 3 个简单步骤在 Windows 上本地运行 DeepSeek

如何通过 3 个简单步骤在 Windows 上本地运行 DeepSeek

它是免费的——社区驱动的人工智能💪。         当 OpenAI 第一次推出定制 GPT 时,我就明白会有越来越多的人为人工智能做出贡献,并且迟早它会完全由社区驱动。         但从来没有想过它会如此接近😂让我们看看如何在 Windows 机器上完全免费使用第一个开源推理模型!  步骤 0:安装 Docker 桌面         我确信很多人已经安装了它,所以可以跳过,但如果没有 — — 这很简单,只需访问Docker 的官方网站,下载并运行安装 👍         如果您需要一些特定的设置,例如使用 WSL,那么有很多指导视频,请查看!我将继续下一步。 步骤 1:安装 CUDA 以获得 GPU 支持         如果您想使用 Nvidia 显卡运行 LLM,则必须安装 CUDA 驱动程序。(嗯……是的,它们需要大量的计算能力)         打开CUDA 下载页面,

By Ne0inhk
在 VSCode 中本地运行 DeepSeek,打造强大的私人 AI

在 VSCode 中本地运行 DeepSeek,打造强大的私人 AI

本文将分步向您展示如何在本地安装和运行 DeepSeek、使用 CodeGPT 对其进行配置以及开始利用 AI 来增强您的软件开发工作流程,所有这些都无需依赖基于云的服务。  步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT         要在本地运行 DeepSeek,我们首先需要安装Ollama,它允许我们在我们的机器上运行 LLM,以及CodeGPT,它是集成这些模型以提供编码辅助的 VSCode 扩展。 安装 Ollama Ollama 是一个轻量级平台,可以轻松运行本地 LLM。 下载Ollama 访问官方网站:https://ollama.com * 下载适合您的操作系统(Windows、macOS 或 Linux)的安装程序。 * 验证安装 安装后,打开终端并运行: ollama --version  如果 Ollama 安装正确,

By Ne0inhk
DeepSeek-R1是真码农福音?我们问了100位开发者……

DeepSeek-R1是真码农福音?我们问了100位开发者……

从GitHub Copilot到DeepSeek-R1,AI编程工具正在引发一场"效率革命",开发者们对这些工具的期待与质疑并存。据Gartner预测,到2028年,将有75%的企业软件工程师使用AI代码助手。 眼看着今年国产选手DeepSeek-R1凭借“深度思考”能力杀入战场,它究竟是真码农福音还是需要打补丁的"潜力股"? ZEEKLOG问卷调研了社区内来自全栈开发、算法工程师、数据工程师、前端、后端等多个技术方向的100位开发者(截止到2月25日),聚焦DeepSeek-R1的代码生成效果、编写效率、语法支持、IDE集成、复杂代码处理等多个维度,一探DeepSeek-R1的开发提效能力。 代码生成效果:有成效但仍需提升 * 代码匹配比例差强人意 在代码生成与实际需求的匹配方面,大部分开发者(58人)遇到生成代码与实际需求完全匹配无需修改的比例在40%-70%区间,12人遇到代码匹配比例在70%-100%这样较高的区间。 然而,有30人代码匹配比例低于40%。这说明DeepSeek-R1在代码生成方面有一定效果,但在部分复杂或特定场景下,仍有很大的提升空间。

By Ne0inhk