背景
由于某疑似計(jì)劃刪庫跑路的同學(xué)的騷操作,導(dǎo)致測(cè)試服務(wù)器上 Nginx 配置文件(/etc/nginx/conf.d) 被直接刪除……一番騷操作試圖恢復(fù)無果后,日子就在“只要我不重啟服務(wù)碟刺,尷尬的就不是我”的平靜中安詳?shù)亩冗^溃槐,直到……我需要重啟服務(wù)器……
目標(biāo)
-
前提條件:
- Nginx 的配置文件內(nèi)容已被破壞或覆蓋,文件無法恢復(fù)
- Nginx 服務(wù)并未重啟或重新讀取新的配置內(nèi)容
設(shè)法在不停止當(dāng)前 Nginx 服務(wù)的前提下哮幢,提取運(yùn)行中的 Nginx 正在使用的配置內(nèi)容并恢復(fù)到文本文件
基本原理
參考資料
思路描述
- 在服務(wù)器確認(rèn) nginx 相關(guān)的進(jìn)程并獲取 pid
- 根據(jù) pid 定位進(jìn)程內(nèi)存映射
- nginx 配置內(nèi)容通常存儲(chǔ)在進(jìn)程的堆棧中([heap])芯勘,使用 gdb dump 從內(nèi)存中提取該部分?jǐn)?shù)據(jù)到文件
- 打印配置內(nèi)容缰犁,并通過正則進(jìn)行提取
代碼實(shí)現(xiàn)(基于 Shell)
#! /bin/bash
### 用于掃描 Nginx 進(jìn)程并從中反向分析配置
BASE_WORK_DIR=$(cd `dirname "${BASH_SOURCE[0]}"` && pwd)
SCAN_DIR=${BASE_WORK_DIR}/analysisdir
SCAN_RESULT_FILE=${SCAN_DIR}/scanresult.txt
RESULT_DIR=${BASE_WORK_DIR}/resultdir
if [[ -d ${SCAN_DIR} ]]; then
rm -rf ${SCAN_DIR}
fi
if [[ -d ${RESULT_DIR} ]]; then
rm -rf ${RESULT_DIR}
fi
mkdir ${RESULT_DIR} && mkdir ${SCAN_DIR} && cd ${SCAN_DIR}
ps -ef | grep nginx | grep master | awk -F" " '{print $2}' | while read pid; do
workdir=${SCAN_DIR}/${pid}
mkdir ${workdir} && cd ${workdir}
# 生成 gdb 指令文件: dump memory
cat /proc/${pid}/maps | awk '$6 == "[heap]" {split ($1,mem_address,"-"); print "dump memory " $1 ".memo 0x" mem_address[1] " 0x" mem_address[2] ;}END{print "quit"}'> gdb-commands
gdb -p ${pid} -x gdb-commands
done
后續(xù)分析處理
獲取文件后滑频,可以做如下分析:
用 NotePad++ 打開并搜索 /etc/nginx/conf.d 捡偏,如果有記錄則復(fù)制完整內(nèi)容,到新的NotePad++空白頁粘貼
將粘貼后的內(nèi)容復(fù)制到 Sublime 中開始處理峡迷;
-
用正則替換:
- 搜索:
(/etc/nginx/conf.d/[^\.]+\.conf) \1.+?server {
- 替換為:
\n\n--> \1\nserver {
- 搜索:
對(duì)結(jié)果文檔進(jìn)行人工判斷银伟,刪除無用部分即可