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

相关推荐
乔旭伟3 分钟前
Linux 服务器备份实战:一致性快照、日志归档与恢复演练
linux·运维·服务器
乔旭伟22 分钟前
Linux 服务器安全加固实战:SSH、防火墙、补丁与入侵排查
linux·服务器·安全
cpolar技术支持23 分钟前
把配置发出去怕带出密钥?先把含凭据配置转成脱敏只读快照,用 cpolar 给同事核对差异
运维·python·内网穿透·cpolar·配置脱敏
我不会起名字32242 分钟前
Redis 突然只能读不能写:MISCONF 报错的 3 类触发条件与 4 步恢复
运维·redis·持久化·排查·misconf
workflower1 小时前
Agentic AI 时代的企业ICT 基础设施运维
运维·人工智能·机器学习·重构·云计算·汽车
裕晟资质规划1 小时前
三类涉密资质延续时限差异分析:军工60日与集成印制3个月的边界
java·服务器·前端·网络·安全
szxinmai主板定制专家1 小时前
ZYNQ 数据采集方案踩坑总结:电力强电磁干扰、工业现场多协议适配优化
运维·人工智能·fpga开发·机器人·zynq
猫咪很可爱1 小时前
Oracle RAC 启动失败排查:私网通信与内核参数优化实战
运维·数据库·oracle
刘胡子大叔2 小时前
备份包只有 1.5K?
linux·服务器·网络
无足鸟ICT2 小时前
【RHCA+】RPM包验证和数字证书
linux·运维·服务器