Linux系统 SELinux 安全管理与故障排查

一、SELinux 安全上下文管理

1. SELinux 简介

SELinux(Security-Enhanced Linux)是 Linux 内核的强制访问控制(MAC)安全子系统,通过基于标签的访问控制实现细粒度权限管理,遵循最小权限原则。

SELinux 有三种工作模式:

  • Enforcing:强制执行策略,拒绝非法操作并记录日志
  • Permissive:仅记录违规操作,不阻止(用于调试)
  • Disabled:完全关闭 SELinux(需重启生效)

2. 基础操作命令

查看 SELinux 状态

复制代码
getenforce  # 查看当前模式
sestatus    # 详细状态信息

注意:setenforce 仅临时生效,永久修改需编辑/etc/selinux/config文件

切换工作模式

复制代码
setenforce 0  # 切换到Permissive模式
setenforce 1  # 切换到Enforcing模式

3. 安全上下文管理

查看上下文

复制代码
ls -Z /var/www/html  # 查看文件/目录的上下文
ps -Z -C httpd       # 查看进程的上下文

修改上下文

  1. chcon 命令(临时修改):

    设置文件类型

    sudo chcon -t httpd_sys_content_t /var/www/html/index.html

    递归修改目录

    sudo chcon -R -t httpd_sys_content_t /var/www/html/

    参照文件上下文

    sudo chcon --reference=file1 file2

  2. semanage 命令(永久修改):

    为自定义目录设置默认上下文

    sudo semanage fcontext -a -t httpd_sys_content_t "/opt/webapps(/.*)?"
    sudo restorecon -Rv /opt/webapps # 应用更改

4. 常见 SELinux 问题解决

Web 服务器 403 错误

复制代码
# 检查文件上下文
ls -Z /var/www/html

# 修复上下文
restorecon -Rv /var/www/html

服务无法绑定非标准端口

复制代码
# 将8080端口添加到HTTP服务端口列表
semanage port -a -t http_port_t -p tcp 8080

管理 SELinux 布尔值

复制代码
# 查看Apache相关布尔值
getsebool -a | grep httpd

# 永久启用HTTP访问用户家目录
setsebool -P httpd_enable_homedirs=on

二、常见 Linux 系统故障排查案例

1. GRUB 引导故障

故障现象:系统启动卡在 "GRUB>" 提示符,无法进入系统

解决步骤

  1. 在 GRUB 命令行执行以下命令临时启动系统:

plaintext

复制代码
insmod xfs
set root=(hd0,msdos1)
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/centos-root ro rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet
initrd16 /initramfs-3.10.0-1160.el7.x86_64.img
boot
  1. 进入系统后重建 GRUB 配置:grub2-mkconfig -o /boot/grub2/grub.cfg

2. 文件系统只读故障

故障现象:无法创建文件,提示 "Read-only file system

解决方案

  1. 卸载分区:umount /dev/sda1
  2. 强制修复(ext 文件系统):fsck -y /dev/sda1
  3. 强制修复(xfs 文件系统):xfs_repair /dev/sda1
  4. 重新挂载:mount -a

3. OOM Killer 触发

故障现象:关键进程突然被终止,系统日志出现 "Killed process"

优化方案

  • 调整进程 OOM 优先级:echo -100 > /proc/[PID]/oom_score_adj

  • 修改内存分配策略:

    vm.overcommit_memory = 2
    vm.overcommit_ratio = 80

4. 磁盘空间耗尽

故障现象:服务异常,df 显示使用率 100%

快速定位与解决

  1. 查找未释放空间的进程:lsof -n | grep deleted
  2. 定位大文件:du -xh --max-depth=1 / | sort -hr
  3. 常见清理:
    • 日志清理:journalctl --vacuum-size=100M
    • 临时文件清理:rm -rf /tmp/*.tmp

5. SSH 登录缓慢

故障现象:SSH 连接延迟超过 10 秒

优化配置

  1. 编辑 sshd_config:
    • 设置UseDNS no
    • 关闭GSSAPIAuthentication no
  2. 重启 sshd 服务使配置生效

6.root密码遗忘

在RHEL/CentOS 7及更新版本中,如果忘记root密码,可以通过以下步骤重置(需物理/虚拟控制台访问权限):

方法原理

通过修改GRUB2启动参数进入单用户模式,绕过身份验证直接获取root权限

详细操作步骤

  1. 重启系统并中断引导
复制代码
# 当系统启动到GRUB菜单时,快速按下方向键阻止自动引导
# 选择默认内核条目(通常第一条)按 `e` 键进入编辑模式
  1. 修改内核参数
复制代码
# 在linux16行(或linux行)末尾追加:
rd.break enforcing=0
​
# 修改后的完整行示例:
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=/dev/mapper/rhel-root rw rd.break enforcing=0
  1. 进入紧急模式
复制代码
# 按 Ctrl+X 启动系统,进入紧急救援模式的shell环境
# 此时文件系统挂载在/sysroot(只读模式)
  1. 切换根目录
复制代码
chroot /sysroot
  1. 修改root密码
复制代码
# 此时已获得完整root权限:
passwd root
# 输入新密码两次(不会显示输入内容)
  1. 修复SELinux上下文
复制代码
# 强制重新标记文件系统(重要!):
touch /.autorelabel
  1. 退出并重启
复制代码
exit
reboot

关键参数说明

参数 作用
rd.break 在内核加载初期中断启动流程
enforcing=0 临时禁用SELinux强制模式

注意事项

  1. 磁盘加密系统:若启用了LUKS加密,需先解密再操作

  2. 云服务器:部分云平台需通过VNC或救援模式操作

  3. 时间控制.autorelabel会导致首次重启时间较长(约5-15分钟)

  4. UEFI系统:可能需要关闭Secure Boot功能

  5. 审计日志:系统日志会记录密码修改操作(/var/log/audit/audit.log)


替代方案(适用于不同场景)

  1. init方法

    复制代码
    # 在GRUB的linux行后追加:
    init=/bin/bash
  2. systemd方法

    复制代码
    systemctl edit --force --full rescue.target

相关推荐
聚梦小课堂5 分钟前
2025.11.16 AI快讯
人工智能·安全·语言模型
偶像你挑的噻16 分钟前
3-Linux驱动开发-简单内核模块代码详解
linux·驱动开发·stm32·嵌入式硬件
赖small强16 分钟前
【Linux驱动开发】 Linux字符设备开发详细指南
linux·驱动开发·字符设备
p666666666821 分钟前
【☀Linux驱动开发笔记☀】linux下led驱动(非设备树)_03
linux·驱动开发·笔记·嵌入式硬件·学习
木易 士心23 分钟前
Protocol Buffers (Protobuf) 详解
运维·服务器
金士镧(厦门)新材料有限公司31 分钟前
稀土氧化物:材料科技中的“隐形力量”
科技·安全·全文检索
百***241338 分钟前
Nginx反向代理出现502 Bad Gateway问题的解决方案
运维·nginx·gateway
以琦琦为中心1 小时前
在RK3568开发板嵌入式开发中,配置NFS服务是实现与Ubuntu虚拟机之间文件共享的常用方法
linux·运维·ubuntu·rk3568
Nimsolax1 小时前
Linux网络DNS与ICMP
linux·网络
赖small强1 小时前
【Linux驱动开发】Linux UART 通信详解:从硬件到驱动再到应用
linux·驱动开发·uart