在企业级 Linux 系统中SELinuxSecurity-Enhanced Linux是防止越权访问的“终极防线”。它由美国国家安全局NSA开发openEuler 作为企业级发行版默认启用 SELinux 提供强制访问控制MAC远超传统的自主访问控制DAC。本章将带你从零理解 SELinux 的核心概念掌握日常管理命令让你在享受安全防护的同时不再被“SELinux 拒绝访问”所困扰。 本章目标理解 SELinux 的基本原理与强制访问控制MAC机制掌握 SELinux 的三种运行模式enforcing、permissive、disabled使用sestatus、getenforce查看 SELinux 状态理解安全上下文Security Context与文件标签使用ls -Z、chcon、restorecon管理文件上下文使用semanage管理端口、布尔值与策略实战修复因 SELinux 导致的 Web 服务无法启动问题17.1 什么是 SELinuxSELinuxSecurity-Enhanced Linux是 Linux 内核的一个安全模块提供强制访问控制Mandatory Access Control, MAC即使 root 用户也不能绕过。✅ 传统 DAC vs SELinux MAC机制自主访问控制DAC强制访问控制MAC权限模型用户/组/其他 rwx用户:角色:类型:级别谁能改权限文件所有者策略定义用户不能随意更改root 权限root 可以访问一切root 也受策略限制安全级别基础防护高强度隔离 类比DAC 房间门锁主人可以给任何人钥匙SELinux 门禁系统即使有钥匙也要看权限卡是否允许进入17.2 SELinux 运行模式SELinux 有三种运行模式可通过/etc/selinux/config永久设置。 三种模式模式说明命令enforcing强制模式拒绝违规操作并记录日志默认setenforce 1permissive宽容模式允许所有操作但记录违规调试用setenforce 0disabled禁用模式完全关闭 SELinux不推荐修改配置文件 查看 SELinux 状态sestatus输出示例SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SELinux root directory: /etc/selinux Loaded policy name: targeted Current mode: enforcing Mode from config file: enforcing Policy MLS status: enabled ...️ 临时切换模式sudosetenforce0# 切换到 permissivesudosetenforce1# 切换回 enforcing⚠️setenforce不能将 disabled 模式启用只能在 enabled 状态下切换 enforcing/permissive。 永久修改模式编辑配置文件sudovim/etc/selinux/config修改SELINUXenforcing # 可选enforcing, permissive, disabled SELINUXTYPEtargeted # 策略类型保持默认⚠️ 修改后需重启机器reboot生效。17.3 安全上下文Security ContextSELinux 通过为每个进程、文件、端口打上“标签”即安全上下文来控制访问。查看安全上下文ls-Z示例ls-Z/etc/passwd# 输出system_u:object_r:passwd_file_t:s0 /etc/passwd格式用户:角色:类型:级别部分说明system_uSELinux 用户不是 Linux 用户object_r角色object rolepasswd_file_t类型Type— 最关键决定谁能访问s0多级安全MLS级别常见文件类型示例类型用途httpd_sys_content_tApache 可读的网页文件httpd_sys_script_exec_tApache 可执行的 CGI 脚本ssh_home_t用户家目录下的 SSH 文件var_log_t日志文件bin_t可执行程序17.4 管理文件上下文 临时修改chcon# 将文件类型改为 httpd 可读sudochcon-thttpd_sys_content_t /var/www/html/index.html-t指定类型-u用户-r角色⚠️chcon的修改是临时的restorecon或make relabel会覆盖。 恢复默认上下文restorecon# 恢复单个文件sudorestorecon /var/www/html/index.html# 递归恢复目录sudorestorecon-R/var/www/html/# 查看将要恢复的内容不执行sudorestorecon-nR/var/www/html/✅ 推荐修改文件后使用restorecon而非chcon 查看默认上下文规则semanage fcontext-l|grep/var/www输出/var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0说明所有/var/www下的文件默认应为httpd_sys_content_t类型。17.5 使用semanage管理 SELinuxsemanage是 SELinux 的高级管理工具需安装sudodnfinstall-ypolicycoreutils-python-utils 管理端口Web 服务默认只能绑定 80、443、8080 等端口。若你使用 8081需添加# 添加 HTTP 服务可绑定的端口sudosemanage port-a-thttp_port_t-ptcp8081# 查看sudosemanage port-l|grephttp# 删除sudosemanage port-d-thttp_port_t-ptcp8081️ 管理布尔值Booleans布尔值用于开启/关闭某些 SELinux 策略行为。查看所有布尔值getsebool-a|grephttp常见布尔值httpd_can_network_connect允许 Apache 连接网络httpd_enable_homedirs允许 Apache 读取用户家目录allow_ssh_keysign允许 SSH 使用密钥签名修改布尔值# 临时生效setsebool httpd_can_network_connect on# 永久生效setsebool-Phttpd_can_network_connect on-P表示永久保存重启后仍有效。17.6 实战修复 SELinux 导致的服务无法启动场景你将 Nginx 的网站根目录设为/data/web但启动失败。sudosystemctl start nginx Jobfornginx.service failed...排查步骤1. 查看服务状态systemctl status nginx可能无明确错误。2. 查看 SELinux 拒绝日志sudoausearch-mavc-tsrecent或sudogrepdenied/var/log/audit/audit.log|tail-5输出typeAVC msgaudit(1712345678.123:456): avc: denied { read } for pid1234 commnginx nameindex.html devsda1 ino5678 scontextsystem_u:system_r:httpd_t:s0 tcontextunconfined_u:object_r:default_t:s0 tclassfile✅ 说明Nginx (httpd_t) 被拒绝读取文件类型为default_t3. 修复文件上下文# 临时修复sudochcon-R-thttpd_sys_content_t /data/web/# 或永久修复推荐sudosemanage fcontext-a-thttpd_sys_content_t/data/web(/.*)?sudorestorecon-R/data/web/4. 重新启动服务sudosystemctl start nginx systemctl status nginx✅ 服务成功启动✅ 本章小结命令用途示例sestatus查看 SELinux 状态setenforce 0/1临时切换模式ls -Z查看安全上下文ls -Z /etc/passwdchcon临时修改上下文chcon -t httpd_t filerestorecon恢复默认上下文restorecon -R /var/www/semanage fcontext永久设置上下文规则添加/data/web规则semanage port管理端口标签开放 8081 给 httpdsetsebool -P永久启用布尔值httpd_can_network_connect 课后练习运行sestatus查看当前 SELinux 模式。使用ls -Z查看/etc/shadow的安全上下文。创建一个目录/testweb放入index.html尝试用 Nginx 服务访问会失败。使用ausearch或grep audit.log查看 SELinux 拒绝记录。使用semanage fcontext和restorecon修复上下文使 Nginx 可访问。挑战将 Nginx 配置为监听 8081 端口并使用semanage port添加该端口到http_port_t。 下一章预告第18章《Shell 脚本编程基础》我们将学习什么是 Shell 脚本为何要写脚本脚本结构#!/bin/bash与执行方式变量定义与使用环境变量、位置参数条件判断if、test、[ ]、[[ ]]循环for、while、until函数定义与调用实战编写系统监控脚本准备好从“命令行用户”升级为“自动化工程师”了吗