title: chaitin-waf keywords:
chaitin-waf plugin.After enabling the chaitin-waf plugin, the traffic will be forwarded to the Chaitin WAF service for the detection and prevention of various web application attacks, ensuring the security of the application and user data.
Depending on the plugin configuration, it is optional to add additional response headers.
The response headers are listed below:
| Name | Type | Required | Default value | Description |
|---|---|---|---|---|
| nodes | array(object) | true | A list of addresses for the Chaitin SafeLine WAF service. | |
| nodes[0].host | string | true | The address of Chaitin SafeLine WAF service. Supports IPV4, IPV6, Unix Socket, etc. | |
| nodes[0].port | string | false | 80 | The port of Chaitin SafeLine WAF service. |
| config | object | false | Configuration of the Chaitin SafeLine WAF service. The parameters configured here will be used when route is not configured. | |
| config.connect_timeout | integer | false | 1000 | connect timeout, in milliseconds |
| config.send_timeout | integer | false | 1000 | send timeout, in milliseconds |
| config.read_timeout | integer | false | 1000 | read timeout, in milliseconds |
| config.req_body_size | integer | false | 1024 | request body size, in KB |
| config.keepalive_size | integer | false | 256 | maximum concurrent idle connections to the SafeLine WAF detection service |
| config.keepalive_timeout | integer | false | 60000 | idle connection timeout, in milliseconds |
An example configuration is as follows.
curl http://127.0.0.1:9180/apisix/admin/plugin_metadata/chaitin-waf -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "nodes":[ { "host": "unix:/path/to/safeline/resources/detector/snserver.sock", "port": 8000 } ] }'
| Name | Type | Required | Default value | Description |
|---|---|---|---|---|
| match | array[object] | false | The list of matching rules, default is empty | |
| match.vars | array[array] | false | List of variables to match for filtering requests for conditional traffic split. It is in the format {variable operator value}. For example, {"arg_name", "==", "json"}. The variables here are consistent with NGINX internal variables. For details on supported operators, lua-resty-expr. | |
| append_waf_resp_header | bool | false | true | Whether to add response headers |
| append_waf_debug_header | bool | false | false | Whether or not to add debugging headers, effective when add_header is true. |
| config | object | false | Configuration of the Chaitin SafeLine WAF service. When the route is not configured, the parameters configured in the metadata are used. | |
| config.connect_timeout | integer | false | connect timeout, in milliseconds | |
| config.send_timeout | integer | false | send timeout, in milliseconds | |
| config.read_timeout | integer | false | read timeout, in milliseconds | |
| config.req_body_size | integer | false | request body size, in KB | |
| config.keepalive_size | integer | false | maximum concurrent idle connections to the SafeLine WAF detection service | |
| config.keepalive_timeout | integer | false | idle connection timeout, in milliseconds |
A sample configuration is shown below, using httpbun.org as the example backend, which can be replaced as needed:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/*", "plugins": { "chaitin-waf": { "match": [ { "vars": [ ["http_waf","==","true"] ] } ] } }, "upstream": { "type": "roundrobin", "nodes": { "httpbun.org:80": 1 } } }'
Test the above example configuration.
If the match condition is not met, the request can be reached normally:
curl -H "Host: httpbun.org" http://127.0.0.1:9080/get -i HTTP/1.1 200 OK Content-Type: application/json Content-Length: 408 Connection: keep-alive X-APISIX-CHAITIN-WAF: no Date: Wed, 19 Jul 2023 09:30:42 GMT X-Powered-By: httpbun/3c0dc05883dd9212ac38b04705037d50b02f2596 Server: APISIX/3.3.0 { "args": {}, "headers": { "Accept": "*/*", "Connection": "close", "Host": "httpbun.org", "User-Agent": "curl/8.1.2", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Host": "httpbun.org", "X-Forwarded-Port": "9080", "X-Forwarded-Proto": "http", "X-Real-Ip": "127.0.0.1" }, "method": "GET", "origin": "127.0.0.1, 122.231.76.178", "url": "http://httpbun.org/get" }
Potential injection requests are also forwarded as is and encounter a 404 error:
curl -H "Host: httpbun.org" http://127.0.0.1:9080/getid=1%20AND%201=1 -i HTTP/1.1 404 Not Found Content-Type: text/plain; charset=utf-8 Content-Length: 19 Connection: keep-alive X-APISIX-CHAITIN-WAF: no Date: Wed, 19 Jul 2023 09:30:28 GMT X-Content-Type-Options: nosniff X-Powered-By: httpbun/3c0dc05883dd9212ac38b04705037d50b02f2596 Server: APISIX/3.3.0 404 page not found
Normal requests are still reachable when the match condition is met:
curl -H "Host: httpbun.org" -H "waf: true" http://127.0.0.1:9080/get -i HTTP/1.1 200 OK Content-Type: application/json Content-Length: 427 Connection: keep-alive X-APISIX-CHAITIN-WAF-TIME: 2 X-APISIX-CHAITIN-WAF-STATUS: 200 X-APISIX-CHAITIN-WAF: yes X-APISIX-CHAITIN-WAF-ACTION: pass Date: Wed, 19 Jul 2023 09:29:58 GMT X-Powered-By: httpbun/3c0dc05883dd9212ac38b04705037d50b02f2596 Server: APISIX/3.3.0 { "args": {}, "headers": { "Accept": "*/*", "Connection": "close", "Host": "httpbun.org", "User-Agent": "curl/8.1.2", "Waf": "true", "X-Forwarded-For": "127.0.0.1", "X-Forwarded-Host": "httpbun.org", "X-Forwarded-Port": "9080", "X-Forwarded-Proto": "http", "X-Real-Ip": "127.0.0.1" }, "method": "GET", "origin": "127.0.0.1, 122.231.76.178", "url": "http://httpbun.org/get" }
Potential attack requests will be intercepted and returned a 403 error:
curl -H "Host: httpbun.org" -H "waf: true" http://127.0.0.1:9080/getid=1%20AND%201=1 -i HTTP/1.1 403 Forbidden Date: Wed, 19 Jul 2023 09:29:06 GMT Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive X-APISIX-CHAITIN-WAF: yes X-APISIX-CHAITIN-WAF-TIME: 2 X-APISIX-CHAITIN-WAF-ACTION: reject X-APISIX-CHAITIN-WAF-STATUS: 403 Server: APISIX/3.3.0 Set-Cookie: sl-session=UdywdGL+uGS7q8xMfnJlbQ==; Domain=; Path=/; Max-Age=86400 {"code": 403, "success":false, "message": "blocked by Chaitin SafeLine Web Application Firewall", "event_id": "51a268653f2c4189bfa3ec66afbcb26d"}
To remove the chaitin-waf plugin, you can delete the corresponding JSON configuration from the Plugin configuration. APISIX will automatically reload and you do not have to restart for this to take effect:
$ curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/*", "upstream": { "type": "roundrobin", "nodes": { "httpbun.org:80": 1 } } }'