打造基于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. 数据处理流程
- body_filter阶段匹配响应体中的敏感内容
- 通过ngx.ctx跨阶段传递日志到log阶段
- log阶段向Splunk发送结构化日志
- 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日志
六、系统部署
- 将所有代码文件放置在
/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
注:本文实现方案适用于检测数据库错误信息泄露,可根据实际需求扩展其他敏感信息检测规则。