跳到主要内容

chaitin-waf

chaitin-waf 插件与长亭 WAF (SafeLine) 服务集成,提供先进的 Web 威胁检测和预防功能,增强应用程序安全性并保护敏感用户数据。

响应头

根据 append_waf_resp_headerappend_waf_debug_header 的配置,插件可以添加以下响应头:

响应头描述
X-APISIX-CHAITIN-WAF指示 APISIX 是否将请求转发给 WAF 服务器。
yes: 请求已转发给 WAF 服务器。
no: 请求未转发给 WAF 服务器。
unhealthy: 请求匹配配置的规则,但没有可用的 WAF 服务。
err: 插件执行期间发生错误。X-APISIX-CHAITIN-WAF-ERROR 头也包含详细信息。
waf-err: 与 WAF 服务器交互时出错。X-APISIX-CHAITIN-WAF-ERROR 头也包含详细信息。
timeout: 对 WAF 服务器的请求超时。
X-APISIX-CHAITIN-WAF-TIME请求到 Chaitin WAF 服务器的往返时间 (RTT)(毫秒),包括网络延迟和 WAF 服务器处理时间。
X-APISIX-CHAITIN-WAF-STATUSWAF 服务器返回给 APISIX 的状态码。
X-APISIX-CHAITIN-WAF-ACTIONWAF 服务器返回给 APISIX 的动作。
pass: 请求被 WAF 服务允许。
reject: 请求被 WAF 服务阻止。
X-APISIX-CHAITIN-WAF-ERROR调试头。包含 WAF 错误消息。
X-APISIX-CHAITIN-WAF-SERVER调试头。指示选择了哪个 WAF 服务器。

示例

以下示例展示了如何在不同场景下配置 chaitin-waf 插件。

在继续之前,请确保你已安装 Chaitin WAF (SafeLine)

在路由上阻止恶意请求

以下示例演示了如何与 Chaitin WAF 集成以保护路由上的流量,立即拒绝恶意请求。

使用插件元数据配置 Chaitin WAF 连接详细信息(相应地更新地址):

curl "http://127.0.0.1:9180/apisix/admin/plugin_metadata/chaitin-waf" -X PUT \
-H 'X-API-KEY: ${ADMIN_API_KEY}' \
-d '{
"nodes": [
{
"host": "172.22.222.5",
"port": 8000
}
]
}'

创建一个路由并在路由上启用 chaitin-waf 以阻止被识别为恶意的请求:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "chaitin-waf-route",
"uri": "/anything",
"plugins": {
"chaitin-waf": {
"mode": "block",
"append_waf_resp_header": true,
"append_waf_debug_header": true
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

❶ 将 mode 设置为 block 以阻止被识别为恶意的请求。

❷ 将 append_waf_resp_header 设置为 true 以包含与 WAF 相关的标准响应头。

❸ 将 append_waf_debug_header 设置为 true 以包含与 WAF 相关的调试响应头。

向路由发送标准请求:

curl -i "http://127.0.0.1:9080/anything"

你应该收到 HTTP/1.1 200 OK 响应。

向路由发送带有 SQL 注入的请求:

curl -i "http://127.0.0.1:9080/anything" -d 'a=1 and 1=1'

你应该看到类似以下的 HTTP/1.1 403 Forbidden 响应:

...
X-APISIX-CHAITIN-WAF-STATUS: 403
X-APISIX-CHAITIN-WAF-ACTION: reject
X-APISIX-CHAITIN-WAF-SERVER: 172.22.222.5
X-APISIX-CHAITIN-WAF: yes
X-APISIX-CHAITIN-WAF-TIME: 3
...

{"code": 403, "success":false, "message": "blocked by Chaitin SafeLine Web Application Firewall", "event_id": "276be6457d8447a4bf1f792501dfba6c"}

监控恶意意图请求

此示例展示了如何与 Chaitin WAF 集成以监控所有带有 chaitin-waf 的路由而不拒绝,并在特定路由上拒绝潜在的恶意请求。

使用插件元数据配置 Chaitin WAF 连接详细信息(相应地更新地址)并配置模式:

curl "http://127.0.0.1:9180/apisix/admin/plugin_metadata/chaitin-waf" -X PUT \
-H 'X-API-KEY: ${ADMIN_API_KEY}' \
-d '{
"nodes": [
{
"host": "172.22.222.5",
"port": 8000
}
],
"mode": "monitor"
}'

❶ 在插件元数据中将 mode 设置为 monitor。如果未在路由上指定 mode,这将适用于所有 chaitin-waf 插件实例。

创建一个路由并在路由上启用 chaitin-waf 而不做任何配置:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "chaitin-waf-route",
"uri": "/anything",
"plugins": {
"chaitin-waf": {}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

向路由发送标准请求:

curl -i "http://127.0.0.1:9080/anything"

你应该收到 HTTP/1.1 200 OK 响应。

向路由发送带有 SQL 注入的请求:

curl -i "http://127.0.0.1:9080/anything" -d 'a=1 and 1=1'

你应该同样收到 HTTP/1.1 200 OK 响应,因为请求在 monitor 模式下未被阻止,但在日志条目中观察到以下内容:

2025/09/09 11:44:08 [warn] 115#115: *31683 [lua] chaitin-waf.lua:385: do_access(): chaitin-waf monitor mode: request would have been rejected, event_id: 49bed20603e242f9be5ba6f1744bba4b, client: 172.20.0.1, server: _, request: "POST /anything HTTP/1.1", host: "127.0.0.1:9080"

如果你在路由上显式配置 mode,它将优先于插件元数据中的配置。例如,如果你创建一个如下路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "chaitin-waf-route",
"uri": "/anything",
"plugins": {
"chaitin-waf": {
"mode": "block"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

向路由发送标准请求:

curl -i "http://127.0.0.1:9080/anything"

你应该收到 HTTP/1.1 200 OK 响应。

向路由发送带有 SQL 注入的请求:

curl -i "http://127.0.0.1:9080/anything" -d 'a=1 and 1=1'

你应该看到类似以下的 HTTP/1.1 403 Forbidden 响应:

...
X-APISIX-CHAITIN-WAF-STATUS: 403
X-APISIX-CHAITIN-WAF-ACTION: reject
X-APISIX-CHAITIN-WAF: yes
X-APISIX-CHAITIN-WAF-TIME: 3
...

{"code": 403, "success":false, "message": "blocked by Chaitin SafeLine Web Application Firewall", "event_id": "c3eb25eaa7ae4c0d82eb8ceebf3600d0"}