chaitin / SafeLine

serve as a reverse proxy to protect your web services from attacks and exploits.
https://waf.chaitin.com
GNU General Public License v3.0
13.28k stars 817 forks source link

通过waf代理站点无法通过配置proxy_buffering off; 关闭缓冲区 #283

Closed conghua1013 closed 1 year ago

conghua1013 commented 1 year ago

反馈内容

通过waf代理站点后http长链接无法通过配置proxy_buffering off; 关闭缓冲区

站点通过http 长链接实时推送消息,通过waf 代理并在配置文件 proxy_params 中添加如下配置项

proxy_buffering off;

重启容器后,长链接无法实时输出打印内容 直接访问业务接口可以正确实时输出打印内容

zclaiqcc commented 1 year ago

那看起来就不是通过这个字段?没懂需要什么样的支持。如果是如何自定义 NGINX conf,可以参考文档 https://waf-ce.chaitin.cn/docs/faq/other#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%AB%99%E7%82%B9-nginx-conf 或者继续在 issue 里面讨论。

如果是「为什么代理站点 HTTP 长链接无法实时访问」,这个暂时没有什么相关建议。只能说师傅先 DIY 改下 NGINX conf,尝试定位和判断下问题在哪,通过手动添加 NGINX conf 来解决。换句话说,我也不知道应该添加什么 conf 来解决师傅问题,需要师傅自行排查。

conghua1013 commented 1 year ago

目前问题是如果是Nginx 通过 proxy_buffering off 关闭缓冲区, 相同的配置在 tengine 中也生效,迁移到waf 配置中后缓冲区关闭失败 waf 中流量是否是经过 tengine 时还经过其他组件,导致缓冲区关闭失败的;

或者请教一下如何配置代理站点才能关闭缓冲区

conghua1013 commented 1 year ago

将safeline_unix.conf 配置文件中流量转发关闭,缓冲区关闭生效,

# 修改配置文件safeline_unix.conf 关闭流量拦截缓冲区关闭生效

upstream detector_server {
    keepalive   256;
    server      unix:/resources/detector/snserver.sock;
}

# 此处关闭转发后,缓冲区配置生效
t1k_intercept off; # enable request detection 

t1k_body_size 1m;        # max forward size of request body

# 此处关闭转发后,缓冲区配置生效
tx_intercept off; # enable response detection

tx_body_size 1m;         # max forward size of response body
tx_ignore_types          # ignore certain types of response body
    image/gif
    image/png
    image/jpeg
    audio/wave
    audio/wav
    audio/x-wav
    audio/x-pn-wav
    audio/webm
    audio/ogg
    video/webm
    video/ogg
    application/ogg
    application/octet-stream
    video/x-flv;

t1k_ulog 10000;
t1k_stat 10000;          # enable nginx stat info

t1k_extra_header on;
t1k_extra_body on;

foreach_server {
    location @safeline {
        internal;
        t1k_pass detector_server;
        t1k_connect_timeout 1s;
        t1k_read_timeout 1s;
        t1k_send_timeout 1s;
        proxy_buffering off;
    }
    location @safelinex {
        internal;
        tx_pass detector_server;
        tx_connect_timeout 1s;
        tx_read_timeout 1s;
        tx_send_timeout 1s;
        proxy_buffering off;
    }
}
zclaiqcc commented 1 year ago

将safeline_unix.conf 配置文件中流量转发关闭,缓冲区关闭生效,

# 修改配置文件safeline_unix.conf 关闭流量拦截缓冲区关闭生效

upstream detector_server {
    keepalive   256;
    server      unix:/resources/detector/snserver.sock;
}

# 此处关闭转发后,缓冲区配置生效
t1k_intercept off; # enable request detection 

t1k_body_size 1m;        # max forward size of request body

# 此处关闭转发后,缓冲区配置生效
tx_intercept off; # enable response detection

tx_body_size 1m;         # max forward size of response body
tx_ignore_types          # ignore certain types of response body
    image/gif
    image/png
    image/jpeg
    audio/wave
    audio/wav
    audio/x-wav
    audio/x-pn-wav
    audio/webm
    audio/ogg
    video/webm
    video/ogg
    application/ogg
    application/octet-stream
    video/x-flv;

t1k_ulog 10000;
t1k_stat 10000;          # enable nginx stat info

t1k_extra_header on;
t1k_extra_body on;

foreach_server {
    location @safeline {
        internal;
        t1k_pass detector_server;
        t1k_connect_timeout 1s;
        t1k_read_timeout 1s;
        t1k_send_timeout 1s;
        proxy_buffering off;
    }
    location @safelinex {
        internal;
        tx_pass detector_server;
        tx_connect_timeout 1s;
        tx_read_timeout 1s;
        tx_send_timeout 1s;
        proxy_buffering off;
    }
}

了解,我们内部确认一下这个问题,也看下有没有比较好的解决方案。

zclaiqcc commented 1 year ago

@conghua1013 师傅可以试一下:保留请求检测 t1k_intercept @safeline;,只关闭响应检测 tx_intercept off;

conghua1013 commented 1 year ago

师傅可以试一下:保留请求检测 t1k_intercept @safeline;,只关闭响应检测 tx_intercept off;

该配置亲测有效

conghua1013 commented 1 year ago

保留请求检测 t1k_intercept @safeline;,只关闭响应检测 tx_intercept off; 该配置对系统略有影响,

  1. 攻击日志中无法查看响应报文
  2. 无法通过结束时间进行搜索
  3. 攻击日志在事件列表中日志数量统计错误
  4. 无法通过点击事件列表中日志数量跳转查看攻击日志 (疑似与2有关)
zclaiqcc commented 1 year ago

保留请求检测 t1k_intercept @safeline;,只关闭响应检测 tx_intercept off; 该配置对系统略有影响,

  1. 攻击日志中无法查看响应报文
  2. 无法通过结束时间进行搜索
  3. 攻击日志在事件列表中日志数量统计错误
  4. 无法通过点击事件列表中日志数量跳转查看攻击日志 (疑似与2有关)

1 是预期的,因为是关闭了响应检测部分。2-4 我理解是预期是有 1 分钟的延迟。因为原本的逻辑是请求和响应拼装之后入库,现在没有响应部分了,请求这边会等待 1 分钟,然后等不到响应,就自己入库了

zclaiqcc commented 1 year ago

issue 先关闭了,短期没有太好的解法。WAF 需要拿到完整信息之后才能进行检测。后面推出流式检测能力有可能可以优雅地解决这类场景。

woodchen-ink commented 10 months ago

发现按照这个修改,顺带解决了反代群晖7.2.1时,/webapi/entry.cgi 持续链接的错误。

ReasonDuan commented 8 months ago

是否还修改了别的内容,按照建议tx_intercept off; 关闭这个没有生效

nkdns commented 1 month ago

issue 先关闭了,短期没有太好的解法。WAF 需要拿到完整信息之后才能进行检测。后面推出流式检测能力有可能可以优雅地解决这类场景。

能否考虑添加一个单独修改某个站点或者某个路径tx_intercept off;,以及官方文档中如何自定义 NGINX conf的文档好像不见了