# 日志

# 拦截日志

拦截日志日志存储在 error.log 中。拦截记录的日志等级为 ALERT。 格式为 ngx_waf: [规则类型][触发的具体规则]

您可以使用下列命令快速查看拦截日志。

cat /path/to/error.log | grep ngx_waf:

下面是两个例子。

2020/01/20 22:56:30 [alert] 6666#0: *30 ngx_waf: [BLACK-URL][(?i)(?:/\.env$)], client: 192.168.1.1, server: example.com, request: "GET /v1/.env HTTP/1.1", host: "example.com", referrer: "http:/example.com/v1/.env"

2020/01/20 22:58:40 [alert] 6667#0: *11 ngx_waf: [BLACK-POST][(?i)(?:select.+(?:from|limit))], client: 192.168.1.1, server: example.com, request: "POST /xmlrpc.php HTTP/1.1", host: "example.com", referrer: "https://example.com/"

# 调试日志

当您在 nginx 的配置文件中将错误日志的等级调整为 debug 时,会在 error.log 中输出调试日志, 用以排障。格式为 ngx_waf_debug: 调试信息

您可以使用下列命令快速查看调试日志。

cat /path/to/error.log | grep ngx_waf_debug:

下面是一段典型的调式日志,表示了一次 CC 防御检测的流程。

2021/02/21 20:35:33 [debug] 6666#0: *1 ngx_waf_debug: Start the CC inspection process.
2021/02/21 20:35:33 [debug] 6666#0: *1 ngx_waf_debug: The module context has been obtained.
2021/02/21 20:35:33 [debug] 6666#0: *1 ngx_waf_debug: The configuration of the module has been obtained.
2021/02/21 20:35:33 [debug] 6666#0: *1 ngx_waf_debug: Detection has begun.
2021/02/21 20:35:33 [debug] 6666#0: *1 ngx_waf_debug: Shared memory is locked.
2021/02/21 20:35:33 [debug] 6666#0: *1 ngx_waf_debug: Shared memory is unlocked.
2021/02/21 20:35:33 [debug] 6666#0: *1 ngx_waf_debug: Detection is over.
2021/02/21 20:35:33 [debug] 6666#0: *1 ngx_waf_debug: The CC detection process is fully completed.

敏感信息泄露

在最新的 Current 版本中,调试日志可能会包含一些敏感信息,比如服务器接收和发送的数据,验证码的密钥等。 提供调试日志时建议通过邮箱发送给我们。你可以在这里 (opens new window)找到我们的邮箱。

# 自定义日志格式

nginx 允许自定义日志格式,并且一个 server 块可以同时写入多个日志文件, 这就给我我们自定义日志格式的机会。本模块提供了几个内置变量,稍加利用即可实现。 下面是一个例子。

...

http {
    ...

    log_format  main    '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

    log_format yaml     '- remote_addr: "$remote_addr"\n'
                        '  remote_user: "$remote_user"\n'
                        '  time_local: "$time_local"\n'
                        '  request: "$request"\n'
                        '  status: "$status"\n'
                        '  body_bytes_sent: "$body_bytes_sent"\n'
                        '  http_referer: "$http_referer"\n'
                        '  http_user_agent: "$http_user_agent"\n'
                        '  http_x_forwarded_for: "$http_x_forwarded_for"\n'
                        '  waf_blocked: $waf_blocked\n'
                        '  waf_spend: $waf_spend\n'
                        '  waf_rule_type: "$waf_rule_type"\n'
                        '  waf_rule_details: "$waf_rule_details"\n';


    server {
        ...

        access_log  logs/access.log  main;
        access_log  logs/access.yml  yaml   if=$waf_log;
        access_log  logs/waf.yml     yaml   if=$waf_blocking_log;

        ...
    }

    ...
}

...

上述配置会有如下效果:

  • 常规的访问日志写入 logs/access.log 中。
  • YAML 格式的访问日志写入 logs/access.yml 中。
  • YAML 格式的拦截日志写入 logs/waf.yml 中。

日志分析

你可以自定义日志格式,然后通过程序分析并制作统计图表。

关于 YAML 格式

YAML 是一种可读性高的数据序列化格式,学习十分简单,只要能看懂 JSON,学习 YAML 也就一会儿的事情。 可以自行搜索 YAML 的格式说明。