十五、中秋特别篇:深入理解 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

Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

Godot被AI代码“围攻”!维护者崩溃发声:“不知道还能坚持多久”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 当大模型能在几秒钟内生成一段“看起来像那么回事”的补丁时,开源社区却开始付出另一种代价。 最近,开源游戏引擎 Godot 的核心维护团队公开吐槽:他们正被大量“AI 生成的低质量代码”淹没。那些代码往往结构完整、注释齐全、描述洋洋洒洒,但真正的问题是——提交者可能并不理解自己交上来的内容。 这件事,并不是简单的“有人偷懒用 AI 写代码”。它正在触及开源协作最核心的东西:信任。 一场悄无声息的“AI 洪水” 事情的导火索来自一条 Bluesky 讨论帖。 Godot 主要维护者之一、同时也是 Godot 商业支持公司 W4 Games 联合创始人的 Rémi Verschelde 表示,所谓的“AI slop”

By Ne0inhk
诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

诺奖得主辛顿最新访谈:1 万个 AI 可以瞬间共享同一份“灵魂”,这就是为什么人类注定被超越

当宇宙级的“嘴炮”遇到降维打击。 编译 | 王启隆 来源 | youtu.be/l6ZcFa8pybE 出品丨AI 科技大本营(ID:rgznai100) 打开最新一期知名播客 StarTalk 的 YouTube 评论区,最高赞的一条留言是这样写的: “我长这么大,第一次看到尼尔·德葛司·泰森(Neil deGrasse Tyson)在一档节目里几乎全程闭嘴,像个手足无措的小学生一样乖乖听讲。” 作为全美最知名的天体物理学家,泰森平时的画风是充满激情、喋喋不休、用宇宙的宏大来震撼嘉宾。但这一次,坐在他对面的那位满头银发、带着温和英音的英国老人,仅仅用最平淡的语气,就让整个演播室陷入了数次令人窒息的沉默。 这位老人是 Geoffrey Hinton。深度学习三巨头之一,2024 年诺贝尔物理学奖得主,被公认为“AI 教父”。 对经常阅读 Hinton 演讲的我来说,这也是比较新奇的一幕—

By Ne0inhk
48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

48小时“烧光”56万!三人创业团队濒临破产,仅因Gemini API密钥被盗:“AI账单远超我们的银行余额”

整理 | 苏宓 出品 | ZEEKLOG(ID:ZEEKLOGnews) 「仅过了 48 小时,一笔 8.2 万美元的天价费用凭空出现,较这家小型初创公司的正常月费暴涨近 46000%。」 这不是假设的虚幻故事,而是一家墨西哥初创公司正在经历的真实危机。 近日,一位名为 RatonVaquero 的开发者在 Reddit 发帖求助称,由于他的 Gemini API 密钥被盗用,原本每月仅约 180 美元(约 1242 元)的费用,在短短 48 小时内暴涨到 82,314.44 美元(约 56.8 万元)。对于这家只有三名开发者的小型创业团队来说,这笔突如其来的账单,几乎等同于灭顶之灾。 “我现在整个人都处在震惊和恐慌之中。”RatonVaquero

By Ne0inhk
曝Windows 12将于今年发布?以AI为核心、NPU成「硬件门槛」,网友吐槽:“不想要的全塞进来了”

曝Windows 12将于今年发布?以AI为核心、NPU成「硬件门槛」,网友吐槽:“不想要的全塞进来了”

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 当年,微软一句“Windows 10 将是最后一个版本”的表态,让不少用户以为 Windows 进入了“只更新、不换代”的时代。但几年过去,现实却完全不同。 在 Windows 11 发布之后,如今关于 Windows 12 的传闻再次密集出现。从内部代号、代码片段,到硬件厂商的暗示与 OEM 预热标签,种种线索拼在一起,勾勒出一个明显的趋势——这不会只是一次常规升级,而更像是一次围绕 AI 的平台级重构。 更关键的是,这次争议,可能远比当年 TPM 2.0 更大。 精准卡位 Windows 10 退场的时间?

By Ne0inhk