读懂 SELinux:强制访问控制 MAC,解决 httpd 服务权限报错实战

一、SELinux基础介绍

SELinux(Security‑Enhanced Linux)安全增强Linux,属于强制访问控制MAC

传统Linux权限为自主访问控制DAC:仅管控用户/组权限,无法防止被入侵程序滥用文件。

MAC由系统策略强制管控,进程仅能访问策略允许的资源,未定义的操作全部拒绝,提升系统安全。

SELinux三种工作模式

模式 说明
Enforcing(强制) 加载并执行安全策略,违规操作直接拒绝,RHEL默认模式
Permissive(宽容) 加载策略,不拒绝操作,只记录违规日志,用于调试排错
Disabled(关闭) SELinux完全关闭,不加载策略、不记录日志,生产环境不建议使用

注意:setenforce只能临时切换Enforcing/Permissive,重启失效;selinux=0内核参数直接完全关闭SELinux。

模式相关命令

bash 复制代码
# 查看当前SELinux模式
getenforce

# 临时切换模式,1=Enforcing,0=Permissive
setenforce 1
setenforce 0

永久修改SELinux模式

编辑配置文件 /etc/selinux/config

ini 复制代码
SELINUX=enforcing       # enforcing / permissive / disabled
SELINUXTYPE=targeted    # 默认targeted,保护指定进程

修改后需要重启系统生效

二、SELinux上下文(标签)

系统中进程、文件、目录、端口都带有SELinux上下文标签;策略根据标签判断是否允许访问。

上下文格式示例:

unconfined_u:object_r:httpd_sys_content_t:s0

  • user:SELinux用户
  • role:角色
  • type:类型,targeted策略主要依靠type做权限判断,大多以_t结尾
  • level:安全级别

示例:httpd进程标签httpd_t;网站静态文件标签httpd_sys_content_t;httpd策略允许httpd_t读取httpd_sys_content_t类型文件。

查看上下文,使用 -Z 参数

bash 复制代码
ps axZ          # 查看进程SELinux上下文
ls -Z           # 查看文件/目录上下文
ls -Zd          # 只看目录本身上下文,不看内部文件

文件上下文继承规则

  1. 复制文件cp:生成新inode,继承目标目录的SELinux上下文。
  2. 同分区移动mv:保留原文件SELinux上下文,不会继承目标目录。

修改SELinux上下文

  1. chcon:临时修改上下文,不会写入策略库;执行restorecon或者系统重新标记会被覆盖,适合临时测试。
bash 复制代码
chcon -t httpd_sys_content_t /virtual
  1. semanage fcontext:写入SELinux策略库,永久定义路径默认标签,搭配restorecon生效,生产环境标准用法。
    语法:semanage fcontext -a -t 类型 '路径(/.*)?'

(/.*)? 正则:匹配目录本身,也匹配目录下面所有子文件子目录。

bash 复制代码
# 添加自定义上下文策略
semanage fcontext -a -t httpd_sys_content_t '/dir1(/.*)?'
# 将策略应用到实际文件目录
restorecon -RFvv /dir1

# 查看本地自定义策略
semanage fcontext -l -C

软件包依赖:

  • semanage 需要:policycoreutils-python-utils
  • restorecon 需要:policycoreutils

三、SELinux布尔值 boolean

布尔值是SELinux策略内置开关,可以开启/关闭部分可选策略规则,不需要修改策略源码。

常用命令

bash 复制代码
# 查看全部布尔值状态
getsebool -a

# 查看httpd相关布尔值
semanage boolean -l | grep httpd

# 临时修改布尔值,重启失效
setsebool httpd_enable_homedirs on

# -P 参数:持久化写入磁盘,重启依旧生效
setsebool -P httpd_enable_homedirs on

# 查看本地修改过的布尔值
semanage boolean -l -C

示例:httpd_enable_homedirs=on 允许httpd访问用户家目录网页。

四、SELinux端口标签

SELinux会给网络端口打上类型标签,服务只能绑定策略允许的端口;非标准端口需要手动标记,否则服务启动失败。

常用命令

bash 复制代码
# 查看全部端口标签
semanage port -l

# 过滤查看http相关端口
semanage port -l | grep http

# 添加端口标签
semanage port -a -t http_port_t -p tcp 82

# 修改已有端口标签
semanage port -m -t http_port_t -p tcp 82

# 删除端口标签
semanage port -d -t gopher_port_t -p tcp 71

# 查看本地自定义端口规则
semanage port -l -C

示例:httpd要监听82端口,需要将82端口标记为http_port_t类型。

五、SELinux故障排查

SELinux拒绝访问会在/var/log/audit/audit.log记录AVC审计日志。

需要安装排错工具包:

bash 复制代码
yum install -y setroubleshoot-server

排错工具

  1. ausearch:检索audit审计日志
bash 复制代码
# 查看最近AVC拒绝事件
ausearch -m AVC -ts recent
  1. sealert:解析SELinux告警,给出修复建议
bash 复制代码
# 分析全部审计日志
sealert -a /var/log/audit/audit.log

# 根据日志给出的UUID查看单条告警详情
sealert -l UUID

常见报错修复方案

  1. 文件标签错误:优先使用 semanage fcontext + restorecon -Rv 目录
  2. 策略开关未打开:使用setsebool -P开启对应布尔值
  3. 端口绑定失败:使用semanage port给端口打上对应服务端口标签
  4. 临时调试:setenforce 0切换宽容模式验证是否是SELinux导致故障,不要生产环境永久关闭

六、排错流程总结

  1. 现象出现,先确认是否SELinux问题:setenforce 0复现测试。
  2. 查看审计日志 ausearch -m AVC -ts recent,或者用sealert解析日志。
  3. 根据告警提示修复:修改文件上下文 / 开启布尔值 / 修改端口标签。
  4. 修复完成,恢复SELinux强制模式 setenforce 1,验证业务。

注意:SELinux只管控安全标签,不会替代普通文件权限、防火墙规则,排查故障需要同时检查文件rwx权限与firewalld。

相关推荐
w01_02_034 分钟前
linux, 桌面, 自启动。
linux·运维·服务器
(Charon)9 分钟前
【C++】网络缓冲区设计(三):Chain Buffer链式缓冲区、动态扩容与跨节点读写
服务器·c++
charliejohn13 分钟前
计算机考研 408 网络 以太网、ARP、NAT、DHCP概念
网络·计算机网络
商业白皮书16 分钟前
企业大模型应用可获得哪些安全防护能力?Amazon Bedrock Guardrails 从内容过滤到规则验证搭建 AI 安全护栏
网络·人工智能·安全
云飞云共享云桌面17 分钟前
SolidWorks+AutoCAD,多并发。可以多人共享一台设计服务器吗
运维·服务器·3d·自动化·制造
伩仁17 分钟前
WSL2 跑起 Web 服务后,本机和局域网设备怎么都能访问?一套两步法彻底搞懂
运维
Yan-英杰17 分钟前
从“投屏“到“办公“,ToDesk鸿蒙版4.8.0.0补齐远控“进入→处理→离开“全流程
服务器·人工智能·爬虫·机器学习·ai开发工具
CCYe、24 分钟前
企业AI网关中的密钥生命周期:从一把Key走天下到自动轮换
网络·人工智能·安全
从零开始的嵌入式之旅28 分钟前
day36
linux·c语言·经验分享·笔记·嵌入式硬件
吴声子夜歌44 分钟前
Linux命令——查找文件
linux·运维·学习