尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

十五、深入理解 SELinux - 指南

十五、深入理解 SELinux - 指南
📅 发布时间:2026/6/19 18:26:13

十五、深入理解 SELinux - 指南

2025-10-21 17:49  tlnshuju  阅读(0)  评论(0)    收藏  举报

在前几节的学习中,我们掌握了 Linux 的用户、权限、进程等基础管理知识。这些传统的自主访问控制机制赋予了文件所有者极大的权限,但也带来了安全隐患——一旦某个高权限进程,如 root 被攻破,整个系统都可能面临巨大风险。为了弥补这一不足,SELinux (Security-Enhanced Linux) 应运而生。

SELinux 是一个由美国国家安全局 (NSA) 主导开发的强制访问控制 (MAC) 安全子系统。它在内核层面,为所有的进程和文件都打上了安全标签 (Context),并通过预先定义好的安全策略,严格限制了“谁” (哪个进程) 可以对“什么” (哪个文件、端口、系统资源) 进行何种操作。

思维导图

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

一、SELinux 的核心概念

核心概念描述示例
主体发起访问请求的实体,通常是进程。httpd 进程、sshd 进程
客体被访问的实体,可以是文件、目录、端口、设备等。/var/www/html/index.html 文件、TCP 80 端口
策略一套规则的集合。定义了哪些主体可以对哪些客体进行哪些操作。“允许 httpd 进程读取 httpd_sys_content_t 类型的文件。”
安全上下文最重要的概念。是附加到每个主体和客体上的安全标签。system_u:object_r:httpd_sys_content_t:s0

SELinux 的工作流程
当一个主体尝试访问一个客体时,内核中的 SELinux 安全模块会拦截这个操作,并执行以下检查流程:

在这里插入图片描述

二、SELinux 的三种工作模式

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

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

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. 保存并退出文件。

重要提示:

如果你将模式从 enforcing 或 permissive 修改为 disabled,或者反之,必须重启系统 才能使更改完全生效。
如果你只是在 enforcing 和 permissive 之间切换,修改配置文件后,新模式会在下次系统启动时自动应用,无需立即重启。但如果你想立即生效,仍需配合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.confsystemctl 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" | sudo tee /srv/website/index.html
# 修改 Apache 的 DocumentRoot
sed -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.confsystemctl restart httpdcurl 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

在这里插入图片描述

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

六、综合案例:配置 Apache 访问非标准目录

这是一个非常经典的 SELinux 实战场景。

场景描述:
默认情况下,Apache (httpd 进程) 只能读取具有 httpd_sys_content_t 安全上下文的文件 (如 /var/www/html 目录下的文件)。现在,我们希望将网站根目录设置在一个新的、非标准的位置/website。

操作步骤:

1.安装 httpd 并创建新目录和文件:

yum install -y httpd
mkdir /website
echo "Welcome to my website on a custom directory!" > /website/index.html

2.修改 Apache 配置文件:

编辑 /etc/httpd/conf/httpd.conf,将 DocumentRoot 和 <Directory> 指令的路径修改为 /website。

DocumentRoot "/website"
Require all granted

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

systemctl start httpd
curl http://localhost
# 此时,你可能会看到 "403 Forbidden" 错误,并且服务日志中会有权限相关的错误

4.排查问题 - 查看 SELinux 日志和文件上下文:

切换到宽容模式进行诊断 (这是一个好习惯):

setenforce 0

再次访问 curl http://localhost,这次应该可以成功访问了。
检查审计日志,你会发现 SELinux 记录了httpd 进程访问/website/index.html 的拒绝事件。

grep "avc: denied" /var/log/audit/audit.log
  • 查看文件上下文:
ls -Z /website/index.html

你会发现它的类型是 default_t 或 unlabeled_t,而不是httpd期望的 httpd_sys_content_t。

5.解决问题 - 永久修改安全上下文:

# a. 添加一条新的文件上下文策略规则
semanage fcontext -a -t httpd_sys_content_t "/website(/.*)?"
# b. 应用策略,将 /website 目录及其下所有文件的上下文恢复为新策略定义的默认值
restorecon -Rv /website
# c. 验证修改
ls -Z /website/index.html
# 此时类型应已变为 httpd_sys_content_t

6.切换回强制模式并最终测试:

setenforce 1
systemctl restart httpd
curl http://localhost

现在,即使在强制模式下,Apache 也应该能够正常访问 /website 目录了。


练习题

题目一:查看状态
写出一条命令,查看当前 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
简述 chcon 和 restorecon 命令在修改文件上下文时的主要区别。

题目十二: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 | grep ftp | grep home
# 假设查找到的布尔值是 ftpd_full_access 或类似名称
# 2. 永久开启该布尔值
setsebool -P ftpd_full_access on

在这里插入图片描述

日期:2025年10月6日
专栏:Linux教程

相关新闻

  • 2025 年少儿英语品牌口碑排行榜最新发布:欧美外教 + 原版教材甄选,含最新推荐及靠谱选择指南
  • GitLab小坑:remote: GitLab: You are not allowed to create protected branches on this project.
  • 使用StockTV数据源对接美国股票数据

最新新闻

  • 深度解析macOS滚动事件拦截:构建专业级定制插件的完整指南
  • 常州多年黄金回收攻略,三十年实体经营,收的顶本地口碑有保障 - 奢侈品回收测评
  • 01_系统架构设计
  • 如何免费实现专业级直播抠像:obs-backgroundremoval插件完全指南
  • 新手必看!抖音保存视频到相册的详细步骤技巧 - 工具软件使用方法推荐
  • LaTeX长表格排版进阶:如何用longtable宏包实现跨页表格的精细控制?

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号