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

相关推荐
律宏阔15 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔16 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴16 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
大熊猫侯佩16 小时前
macOS27 上可变界面尺寸 iOS App 揭秘
macos·ios·swiftui
tangzzzfan16 小时前
把 ADB 装进 macOS app
macos
乱码三千16 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei3716 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei3716 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化
yunwei3716 小时前
eBPF 示例教程:使用 XDP 捕获 TCP 信息
linux·后端·性能优化
judezh16 小时前
api 容器一直 unhealthy?我把一个 Agent 运行时的健康检查逐条拆了,查出四个问题
运维·docker