打造基于Nginx的敏感信息泄露检测系统
字数 1125 2025-08-18 11:37:28

基于Nginx的敏感信息泄露检测系统构建指南

一、系统概述

本系统利用OpenResty(集成了Nginx和Lua模块)构建一个实时检测和记录Web应用中敏感信息泄露的解决方案,特别针对数据库错误信息等敏感数据泄露场景。

二、环境准备

1. 基础环境

  • 操作系统: CentOS 7 Minimal
  • 核心组件:
    • OpenResty (Nginx + Lua模块)
    • Splunk Free版 (用于日志收集和分析)

2. 软件安装

  • Splunk下载:
    https://download.splunk.com/products/splunk/releases/7.1.2/linux/splunk-7.1.2-a0c72a66db66-linux-2.6-x86_64.rpm
    

三、系统架构与原理

1. Nginx Lua模块执行阶段

系统主要利用两个关键阶段:

  • body_filter阶段: 处理服务器响应体,检测敏感信息
  • log阶段: 记录检测到的敏感信息并发送到Splunk

2. 数据处理流程

  1. body_filter阶段匹配响应体中的敏感内容
  2. 通过ngx.ctx跨阶段传递日志到log阶段
  3. log阶段向Splunk发送结构化日志
  4. Splunk进行统计、告警和分析

四、核心代码实现

1. body_filter阶段 (body_filter.lua)

local resp_body = ngx.arg[1]  -- 获取响应体
local eof = ngx.arg[2]
local ctx_log = {}  -- 日志table
local regex = [[You have an error in your SQL syntax]]  -- 匹配的敏感内容正则

-- 对响应体做正则匹配
local m = ngx.re.match(resp_body, regex, 'jio')

if m then  -- 如果匹配到敏感信息
    ctx_log.rule_match = m[0]  -- 将匹配内容写入日志
    ctx_log.Request_line = ngx.var.request  -- 记录请求URL(含GET参数)
    ctx_log.Request_headers = ngx.req.get_headers()  -- 记录请求头部
    ngx.ctx.log = ctx_log  -- 日志赋值给跨阶段的ngx.ctx.log
end

2. log阶段 (log.lua)

local logger = require "socket"  -- 加载logger socket库
local cjson = require "cjson.safe"  -- 加载cjson库

-- 初始化logger
if not logger.initted() then
    local ok,err = logger.init{
        host = "127.0.0.1",  -- splunk IP
        port = 8888,         -- splunk端口
        sock_type = "tcp",   -- 日志socket类型
        flush_limit = 1,     -- 刷新限制
    }
    
    if not ok then  -- 初始化失败处理
        ngx.log(ngx.ERR,"failed to initialize the logger: ",err)
        return
    end
end

-- 接收跨阶段传过来的日志信息
local log = ngx.ctx.log

-- 判断日志不为空则记录
if type(log) == "table" then
    local bytes, err = logger.log(cjson.encode(log) .. "\r\n")
    if err then
        ngx.log(ngx.ERR, "failed to log message: ", err)
    end
end

3. Nginx配置文件 (test.conf)

lua_package_path '/data/code/?.lua;;';

body_filter_by_lua_file /data/code/body_filter.lua;
log_by_lua_file /data/code/log.lua;

lua_code_cache on;

五、Splunk配置

1. 关键配置修改

编辑/opt/splunk/etc/system/local/props.conf,添加以下内容:

[_json]  # 指定sourcetype
SHOULD_LINEMERGE = false  # 禁止Splunk自动合并多行JSON日志

六、系统部署

  1. 将所有代码文件放置在/data/code目录下
  2. 在Nginx的http配置块中include test.conf
  3. 启动Splunk服务并确保监听指定端口(8888)

七、测试与验证

1. 测试架构

  • Nginx(反向代理) → httpd + php(DVWA)

2. 测试方法

  1. 在DVWA的SQL注入部分输入单引号触发MySQL错误
  2. 检查Splunk中是否记录以下信息:
    • 客户端请求头部(Request_headers)
    • 请求URL(Request_line)
    • 服务器响应体匹配数据(rule_match)

八、扩展与优化

  1. POST请求处理: 需要在access阶段额外处理POST请求体
  2. 正则表达式优化: 可根据实际需求扩展敏感信息匹配规则
  3. 性能调优: 根据流量调整lua_code_cache和flush_limit参数

九、参考资源

  1. OpenResty官方文档
  2. OpenResty最佳实践: https://moonbingbing.gitbooks.io/openresty-best-practices/lua/main.html

注:本文实现方案适用于检测数据库错误信息泄露,可根据实际需求扩展其他敏感信息检测规则。

基于Nginx的敏感信息泄露检测系统构建指南 一、系统概述 本系统利用OpenResty(集成了Nginx和Lua模块)构建一个实时检测和记录Web应用中敏感信息泄露的解决方案,特别针对数据库错误信息等敏感数据泄露场景。 二、环境准备 1. 基础环境 操作系统 : CentOS 7 Minimal 核心组件 : OpenResty (Nginx + Lua模块) Splunk Free版 (用于日志收集和分析) 2. 软件安装 Splunk下载 : 三、系统架构与原理 1. Nginx Lua模块执行阶段 系统主要利用两个关键阶段: body_ filter阶段 : 处理服务器响应体,检测敏感信息 log阶段 : 记录检测到的敏感信息并发送到Splunk 2. 数据处理流程 body_ filter阶段匹配响应体中的敏感内容 通过ngx.ctx跨阶段传递日志到log阶段 log阶段向Splunk发送结构化日志 Splunk进行统计、告警和分析 四、核心代码实现 1. body_ filter阶段 (body_ filter.lua) 2. log阶段 (log.lua) 3. Nginx配置文件 (test.conf) 五、Splunk配置 1. 关键配置修改 编辑 /opt/splunk/etc/system/local/props.conf ,添加以下内容: 六、系统部署 将所有代码文件放置在 /data/code 目录下 在Nginx的http配置块中include test.conf 启动Splunk服务并确保监听指定端口(8888) 七、测试与验证 1. 测试架构 Nginx(反向代理) → httpd + php(DVWA) 2. 测试方法 在DVWA的SQL注入部分输入单引号触发MySQL错误 检查Splunk中是否记录以下信息: 客户端请求头部(Request_ headers) 请求URL(Request_ line) 服务器响应体匹配数据(rule_ match) 八、扩展与优化 POST请求处理 : 需要在access阶段额外处理POST请求体 正则表达式优化 : 可根据实际需求扩展敏感信息匹配规则 性能调优 : 根据流量调整lua_ code_ cache和flush_ limit参数 九、参考资源 OpenResty官方文档 OpenResty最佳实践: https://moonbingbing.gitbooks.io/openresty-best-practices/lua/main.html 注:本文实现方案适用于检测数据库错误信息泄露,可根据实际需求扩展其他敏感信息检测规则。