读懂 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。

相关推荐
我星期八休息1 小时前
扩展—DNS与ICMP
linux·服务器·网络
MC皮蛋侠客1 小时前
DNP3 系列(三):伪传输层——分段、重组与可靠传输
网络·dnp3
代码方舟1 小时前
企业级对公银行 KYC 架构:基于天远人脸身份证比对A构建自动化客户尽调网关
运维·人工智能·架构·自动化
筝筝ba2 小时前
linux 查询当前登录的用户数量
linux·服务器·网络
ShiXZ2132 小时前
网络调试四剑客:ping / telnet / nc / netstat 速查指令集
运维·开发语言·网络·php
小五传输2 小时前
Serv-U替代方案怎么选?政务机关文件安全传输对比与迁移指南
大数据·运维·安全
woniu_buhui_fei2 小时前
日常工作常用的命令(Linux+JDK)
linux·运维·服务器
snow@li2 小时前
Telnet 全景教程:全平台安装、命令使用、故障排查与安全规范
运维·网络
coward913 小时前
全志T507 (sun50iw9p1)sunxi pinctrl 子系统实现分析
linux·嵌入式硬件
Bruce_Liuxiaowei3 小时前
自动化渗透测试——用AI构建自动化渗透测试流程
运维·人工智能·自动化