Nginx 结合 ELK 实现安全审计需规范日志格式、可靠传输与精准解析:自定义 security 日志格式分离关键字段;优先用 Filebeat 采集并配置 ES 输出;在 Logstash 或 Ingest Pipeline 中做 GeoIP、UA 解析及高风险行为标记;Kibana 中构建异常登录、可疑 UA 看板并设置告警。

要在 Nginx 中使用 ELK(Elasticsearch、Logstash、Kibana)收集并分析访问日志以实现安全审计,核心是把 Nginx 日志结构化地接入 ELK 栈,再通过 Kibana 做可视化与告警。关键不在于“能不能”,而在于日志格式是否规范、传输是否可靠、解析是否准确。
确保 Nginx 日志格式支持结构化解析
Nginx 默认的 combined 日志格式对安全审计不够友好(如 user-agent、状态码、响应时间混在一起),建议自定义 log_format,显式分离关键字段:
log_format security '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'$request_time $upstream_response_time '
'$http_x_forwarded_for $http_x_real_ip';
access_log /var/log/nginx/access.log security;
</font><p>这样 Logstash 就能用 grok 精准匹配每个字段,避免因空格或引号嵌套导致解析失败。特别注意 <strong>$http_x_forwarded_for</strong> 和 <strong>$http_x_real_ip</strong>,它们对识别真实客户端 IP 很重要——尤其在有反向代理或 CDN 的场景下。</p><H3>用 Filebeat 或 Logstash 直接采集日志</H3><p>推荐优先使用 Filebeat(轻量、资源占用低、支持 TLS 和重试),而不是 Logstash 做日志采集:</p><ul><li>Filebeat 配置示例(/etc/filebeat/filebeat.yml):</li></ul><font color="gray"><pre class="brush:php;toolbar:false;">
filebeat.inputs:
- type: filestream
enabled: true
paths:
- /var/log/nginx/access.log
fields:
log_type: nginx_access
<p>output.elasticsearch:
hosts: ["<a href="https://www.php.cn/link/28e7862e866b542d465bdf453eccc326">https://www.php.cn/link/28e7862e866b542d465bdf453eccc326</a>"]
username: "filebeat_user"
password: "xxx"
ssl.verification_mode: none</p>启动前记得用 filebeat setup 加载索引模板,否则字段类型可能不匹配(比如 status 被当成 text 而不是 keyword/number,影响聚合统计)。
在 Logstash 或 Elasticsearch 中做安全相关解析与 enrichment
仅采集原始日志远远不够。安全审计需要补充上下文:
- 用 GeoIP 过滤器识别 IP 归属地(判断异常地域访问)
- 用 User-Agent 解析器提取浏览器、OS、是否为爬虫
- 添加条件判断标记高风险行为:如 status == 401/403(未授权/禁止)、status == 500(可能暴露系统信息)、request 包含 sql 注入特征('union select'、'sleep(' 等)、大量 404(目录爆破迹象)
- 对高频 IP 做简单计数(如 1 分钟内请求 >100 次),输出到独立索引用于告警
这些逻辑可在 Logstash filter 阶段完成,也可用 Elasticsearch 的 Ingest Pipeline 实现(更轻量、无需额外组件)。
在 Kibana 中构建安全审计看板与告警
Kibana 不只是图表工具,更是审计入口:
- 创建「异常登录尝试」视图:筛选 status=401 且 path 包含 /login 或 /wp-login.php,按 IP 和时间排序
- 构建「可疑 UA 行为」面板:筛选 ua.os == "Unknown" 或 ua.name == "python-requests" + 高频请求
- 设置告警规则(Alerting):例如「过去 5 分钟内,同一 IP 触发 >20 次 404」触发 Slack 通知
- 保存常用搜索为 Saved Object,比如 “sqlmap user-agent”、“扫描器指纹”,方便快速复用
别忽略时间范围选择器——安全事件回溯常需跨天甚至跨周比对,建议默认设为最近 7 天,并开启 auto-refresh(但别太频繁,避免 ES 压力过大)。


















