一、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