美文网首页工具与知识管理
从运行中的 Nginx 提取配置信息

从运行中的 Nginx 提取配置信息

作者: 雪轩辕 | 来源:发表于2021-12-28 14:13 被阅读0次

    背景

    由于某疑似计划删库跑路的同学的骚操作,导致测试服务器上 Nginx 配置文件(/etc/nginx/conf.d) 被直接删除……一番骚操作试图恢复无果后,日子就在“只要我不重启服务,尴尬的就不是我”的平静中安详的度过,直到……我需要重启服务器……

    目标

    1. 前提条件:

      1. Nginx 的配置文件内容已被破坏或覆盖,文件无法恢复
      2. Nginx 服务并未重启或重新读取新的配置内容
    2. 设法在不停止当前 Nginx 服务的前提下,提取运行中的 Nginx 正在使用的配置内容并恢复到文本文件

    基本原理

    参考资料

    思路描述

    1. 在服务器确认 nginx 相关的进程并获取 pid
    2. 根据 pid 定位进程内存映射
    3. nginx 配置内容通常存储在进程的堆栈中([heap]),使用 gdb dump 从内存中提取该部分数据到文件
    4. 打印配置内容,并通过正则进行提取

    代码实现(基于 Shell)

    #! /bin/bash
    ### 用于扫描 Nginx 进程并从中反向分析配置
    
    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
    

    后续分析处理

    获取文件后,可以做如下分析:

    1. 用 NotePad++ 打开并搜索 /etc/nginx/conf.d ,如果有记录则复制完整内容,到新的NotePad++空白页粘贴

    2. 将粘贴后的内容复制到 Sublime 中开始处理;

    3. 用正则替换:

      1. 搜索: (/etc/nginx/conf.d/[^\.]+\.conf) \1.+?server {
      2. 替换为:\n\n--> \1\nserver {
    4. 对结果文档进行人工判断,删除无用部分即可

    相关文章

      网友评论

        本文标题:从运行中的 Nginx 提取配置信息

        本文链接:https://www.haomeiwen.com/subject/cnepqrtx.html