Skip to content

Latest commit

 

History

History
255 lines (219 loc) · 14.2 KB

chaitin-waf.md

File metadata and controls

255 lines (219 loc) · 14.2 KB
title keywords description
chaitin-waf
Apache APISIX
API Gateway
Plugin
WAF
This document contains basic information about the Apache APISIX `chaitin-waf` plugin.

Description

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.

Response Headers

Depending on the plugin configuration, it is optional to add additional response headers.

The response headers are listed below:

  • X-APISIX-CHAITIN-WAF: Whether APISIX forwards the request to the WAF server.
    • yes: forwarded
    • no: no forwarded
    • unhealthy: matches the match variables, but no WAF server is available.
    • err: an error occurred during the execution of the plugin. Also with X-APISIX-CHAITIN-WAF-ERROR request header
    • waf-err: Error while interacting with the WAF server. Also with X-APISIX-CHAITIN-WAF-ERROR request header
    • timeout: Timeout for request to the WAF server
  • X-APISIX-CHAITIN-WAF-ERROR: Debug header. WAF error message
  • X-APISIX-CHAITIN-WAF-TIME: The time in milliseconds that APISIX spent interacting with WAF.
  • X-APISIX-CHAITIN-WAF-STATUS: The status code returned to APISIX by the WAF server.
  • X-APISIX-CHAITIN-WAF-ACTION: Processing result returned to APISIX by the WAF server.
    • pass: request valid and passed
    • reject: request rejected by WAF service
  • X-APISIX-CHAITIN-WAF-SERVER: Debug header. Picked WAF server.

Plugin Metadata

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
     }
  ]
}'

Attributes

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 Plugin

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"}

Delete Plugin

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
       }
   }
}'