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 # 查看进程的上下文
修改上下文:
- 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
- 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>" 提示符,无法进入系统
解决步骤:
- 在 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
- 进入系统后重建 GRUB 配置:
grub2-mkconfig -o /boot/grub2/grub.cfg
2. 文件系统只读故障
故障现象:无法创建文件,提示 "Read-only file system
解决方案:
- 卸载分区:
umount /dev/sda1
- 强制修复(ext 文件系统):
fsck -y /dev/sda1
- 强制修复(xfs 文件系统):
xfs_repair /dev/sda1
- 重新挂载:
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%
快速定位与解决
- 查找未释放空间的进程:
lsof -n | grep deleted
- 定位大文件:
du -xh --max-depth=1 / | sort -hr
- 常见清理:
- 日志清理:
journalctl --vacuum-size=100M
- 临时文件清理:
rm -rf /tmp/*.tmp
- 日志清理:
5. SSH 登录缓慢
故障现象:SSH 连接延迟超过 10 秒
优化配置:
- 编辑 sshd_config:
- 设置
UseDNS no
- 关闭
GSSAPIAuthentication no
- 设置
- 重启 sshd 服务使配置生效
6.root密码遗忘
在RHEL/CentOS 7及更新版本中,如果忘记root密码,可以通过以下步骤重置(需物理/虚拟控制台访问权限):
方法原理
通过修改GRUB2启动参数进入单用户模式,绕过身份验证直接获取root权限
详细操作步骤
重启系统并中断引导
# 当系统启动到GRUB菜单时,快速按下方向键阻止自动引导 # 选择默认内核条目(通常第一条)按 `e` 键进入编辑模式
修改内核参数
# 在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
进入紧急模式
# 按 Ctrl+X 启动系统,进入紧急救援模式的shell环境 # 此时文件系统挂载在/sysroot(只读模式)
切换根目录
chroot /sysroot
修改root密码
# 此时已获得完整root权限: passwd root # 输入新密码两次(不会显示输入内容)
修复SELinux上下文
# 强制重新标记文件系统(重要!): touch /.autorelabel
退出并重启
exit reboot
关键参数说明
参数 | 作用 |
---|---|
rd.break | 在内核加载初期中断启动流程 |
enforcing=0 | 临时禁用SELinux强制模式 |
注意事项
磁盘加密系统:若启用了LUKS加密,需先解密再操作
云服务器:部分云平台需通过VNC或救援模式操作
时间控制:
.autorelabel
会导致首次重启时间较长(约5-15分钟)UEFI系统:可能需要关闭Secure Boot功能
审计日志:系统日志会记录密码修改操作(/var/log/audit/audit.log)
替代方案(适用于不同场景)
init方法:
# 在GRUB的linux行后追加: init=/bin/bash
systemd方法:
systemctl edit --force --full rescue.target