kong网关集成Safeline WAF 插件

kong网关集成Safeline WAF 插件

Kong是一款轻量级、快速且灵活的开源API网关,提供了强大的插件系统。Safeline WAF(Web应用防火墙)是雷池社区版提供的一款开源Web应用防火墙,能够防护SQL注入、XSS攻击、恶意爬虫等常见Web攻击。

部署环境规划

主机清单:

主机名 IP地址 操作系统
kong 192.168.73.12 Ubuntu 24.04
safeline 192.168.73.11 Ubuntu 24.04
http-https-echo 192.168.73.11 Ubuntu 24.04

整体架构示意图

前置要求:

  • 每台机器已安装docker及docker compose环境
  • 已部署kong网关(基于APT源部署)

部署示例后端服务

http-https-echo 是一个非常实用的用于调试的 Docker 镜像,它可以将接收到的 HTTP 请求的各种详细信息(如请求头、请求体、查询参数等)以 JSON 格式返回给客户端。

bash 复制代码
docker run -d --name http-https-echo -p 8080:8080 mendhak/http-https-echo:31

这会在本地 8080 端口运行一个服务,用于接收 HTTP 请求并返回请求详情(包括头和正文)。您可以通过以下命令验证服务是否正常运行:

bash 复制代码
curl http://192.168.73.11:8080

预期返回 JSON 格式的响应,包含请求的头、方法和正文等信息。

注册服务到kong

将 http-https-echo 注册为 Kong 的服务 (Service)

bash 复制代码
curl -i -X POST http://192.168.73.12:8001/services \
  --data name=echo-service \
  --data url='http://192.168.73.11:8080'

为服务创建路由 (Route)

bash 复制代码
curl -i -X POST http://192.168.73.12:8001/services/echo-service/routes \
  --data 'name=echo-route' \
  --data 'paths[]=/echo' \
  --data "methods[]=GET" \
  --data "methods[]=POST" \
  --data 'strip_path=true'

通过 Kong 代理访问服务并验证,会看到一个 HTTP 200 OK 的响应,并且响应体是一个 JSON 对象,其中包含了您发送的请求的详细信息,例如:

json 复制代码
root@http-https-echo:~# curl -i -X GET http://192.168.73.12:8000/echo
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 751
Connection: keep-alive
X-Powered-By: Express
ETag: W/"2ef-+dzq6+Pv75IqQzbh/OyiSyNvank"
Date: Wed, 23 Jul 2025 16:35:21 GMT
Server: kong/3.9.1
X-Kong-Upstream-Latency: 4
X-Kong-Proxy-Latency: 0
Via: 1.1 kong/3.9.1
X-Kong-Request-Id: 13c8ae66ff702e6f93710d2bf307a315

{
  "path": "/",
  "headers": {
    "via": "1.1 kong/3.9.1",
    "host": "192.168.73.11:8080",
    "connection": "keep-alive",
    "x-forwarded-for": "127.0.0.1",
    "x-forwarded-proto": "http",
    "x-forwarded-host": "localhost",
    "x-forwarded-port": "8000",
    "x-forwarded-path": "/echo",
    "x-forwarded-prefix": "/echo",
    "x-real-ip": "127.0.0.1",
    "x-kong-request-id": "13c8ae66ff702e6f93710d2bf307a315",
    "user-agent": "curl/8.5.0",
    "accept": "*/*"
  },
  "method": "GET",
  "body": "",
  "fresh": false,
  "hostname": "localhost",
  "ip": "127.0.0.1",
  "ips": [
    "127.0.0.1"
  ],
  "protocol": "http",
  "query": {},
  "subdomains": [],
  "xhr": false,
  "os": {
    "hostname": "8e1197a87aeb"
  },
  "connection": {}
}

部署Safeline

一键安装:3 分钟即可完成自动安装。在http-https-echo节点执行

bash 复制代码
bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release/latest/manager.sh)"

命令执行成功则代表雷池安装成功,现在你可以访问雷池控制台了

bash 复制代码
......
[INFO  10:55:45]: 正在启动 Docker 容器
[INFO  10:55:56]: 雷池 WAF 安装完成
[INFO  10:55:56]: 等待 mgt 启动
[INFO  10:56:01]: 等待 mgt 启动
[INFO  10:56:06]: 等待 mgt 启动
[INFO  10:56:11]: 等待 mgt 启动
[INFO  10:56:16]: 等待 mgt 启动
[INFO  10:56:21]: 等待 mgt 启动
[INFO  10:56:27]: 等待 mgt 启动
[INFO  10:56:32]: 设置 admin
[INFO  10:56:33]: 
[INFO] Initial username:admin
[INFO] Initial password:82dOMjk7
[INFO] Done
[INFO  10:56:33]: 雷池 WAF 管理面板: https://192.168.73.11:9443/
[INFO  10:56:33]: 雷池 WAF 管理面板: https://0.0.0.0:9443/

查看安装目录

bash 复制代码
root@http-https-echo:~# ls /data/safeline/
docker-compose.yaml  logs  resources

访问管理面板

配置SafeLine 插件检测引擎地址和端口

要为特定服务启用 SafeLine 插件,需配置 detector_hostsafeline_port 参数,这两个参数分别对应 SafeLine 检测引擎的地址和端口,与初始设置时的配置一致。

调整saveline配置,暴露检测引擎地址和端口,增加 8000:8000 端口映射

bash 复制代码
root@http-https-echo:~# cat /data/safeline/docker-compose.yaml
services:
  detect:
    container_name: safeline-detector
    restart: always
    image: ${IMAGE_PREFIX}/safeline-detector${REGION}${ARCH_SUFFIX}:${IMAGE_TAG}
    volumes:
      - ${SAFELINE_DIR}/resources/detector:/resources/detector
      - ${SAFELINE_DIR}/logs/detector:/logs/detector
      - /etc/localtime:/etc/localtime:ro
    environment:
      - LOG_DIR=/logs/detector
    ports:
      - 8000:8000
    networks:
      safeline-ce:
        ipv4_address: ${SUBNET_PREFIX}.5

调整配置文件

bash 复制代码
root@http-https-echo:~# cat /data/safeline/resources/detector/detector.yml 
bind_addr: 0.0.0.0 
listen_port: 8000

启用Safeline插件

可通过 LuaRocks 安装自定义插件。Lua 插件以 .rock 格式包分发,这些包自成一体,支持从本地或远程服务器进行安装。

如果您通过官方软件包安装了 Kong,系统中应该已包含 LuaRocks 工具。

项目地址:https://github.com/chaitin/kong-safeline

在kong网关节点,安装 SafeLine 插件请按以下步骤操作:

bash 复制代码
root@kong:~# luarocks install kong-safeline

查看插件源文件

bash 复制代码
root@kong:~# ls /usr/local/share/lua/5.1/kong/plugins/safeline
handler.lua  schema.lua

接着在 kong.conf 配置文件中添加以下内容以启用 SafeLine 插件:

bash 复制代码
root@kong:~# cat /etc/kong/kong.conf
plugins = bundled,safeline

该配置行将 SafeLine 添加至已启用插件列表,与官方发行版中捆绑的插件共同生效。

最后,重启 Kong 网关:

bash 复制代码
systemctl restart kong

检查插件是否加载成功,确认返回的插件列表存在safeline

json 复制代码
root@kong:~# curl -s http://192.168.73.12:8001/plugins/enabled | jq |grep safeline
{
  "enabled_plugins": [
    "grpc-gateway",
    "grpc-web",
    "pre-function",
    "post-function",
    "azure-functions",
    "zipkin",
    "opentelemetry",
    "ai-proxy",
    "ai-prompt-decorator",
    "ai-prompt-template",
    "ai-prompt-guard",
    "ai-request-transformer",
    "ai-response-transformer",
    "standard-webhooks",
    "modify-headers-and-body",
    "safeline",
    "redirect",
    "jwt",
    "acl",
    "correlation-id",
    "cors",
    "oauth2",
    "tcp-log",
    "udp-log",
    "file-log",
    "http-log",
    "key-auth",
    "hmac-auth",
    "basic-auth",
    "ip-restriction",
    "request-transformer",
    "response-transformer",
    "request-size-limiting",
    "rate-limiting",
    "response-ratelimiting",
    "syslog",
    "loggly",
    "datadog",
    "ldap-auth",
    "statsd",
    "bot-detection",
    "aws-lambda",
    "request-termination",
    "prometheus",
    "proxy-cache",
    "session",
    "acme"
  ]
}

在echo-service服务上启用SafeLine

bash 复制代码
curl -X POST http://192.168.73.12:8001/services/echo-service/plugins \
  --data "name=safeline" \
  --data "config.host=192.168.73.11" \
  --data "config.port=8000" \
  --data "config.mode=block"

测试防护效果

验证 SafeLine 是否生效时,可通过向 Kong 发送模拟 SQL 注入攻击的请求进行测试。若 SafeLine 已成功保护您的服务,您将收到 403 Forbidden 响应。

原始请求路径

bash 复制代码
curl -X GET "http://192.168.73.12:8000/echo?name=1' or '1'='1"

对 URL 中的参数进行 URL 编码

bash 复制代码
curl -X GET "http://192.168.73.12:8000/echo?name=1%27%20or%20%271%27=%271"

解释:

  • ' => %27
  • 空格 => %20
  • 整个 payload 1' or '1'='1 被编码为 1%27%20or%20%271%27=%271

如果被雷池 WAF 成功拦截,你将看到返回 HTTP 403 和如下 JSON:

json 复制代码
root@http-https-echo:~# curl -s -X GET "http://192.168.73.12:8000/echo?name=1%27%20or%20%271%27=%271" | jq
{
  "code": 403,
  "success": false,
  "message": "blocked by Chaitin SafeLine Web Application Firewall",
  "event_id": "ca7057c6de5345d1a84df984dcefab07"
}

此外,还可以查看 [SafeLine 控制面板]以查看被拦截攻击的完整记录。

详情信息

相关推荐
tnan25229 天前
记录docker使用kong consul postgresql配置dns异常解决
docker·kong·consul
William一直在路上21 天前
KONG API Gateway中的核心概念
网络·gateway·kong
悟能不能悟1 个月前
kong是什么
kong
freesharer2 个月前
kong网关基于header分流灰度发布
kong
JohnGox3 个月前
KONG根据请求参数限流
kong·限流
星释3 个月前
使用API网关Kong配置反向代理和负载均衡
运维·负载均衡·kong
莱茵不哈哈3 个月前
OpenResty 深度解析:构建高性能 Web 服务的终极方案
nginx·lua·kong·openresty·conf
泽济天下3 个月前
【工作记录】Kong Gateway入门篇之简介
gateway·kong
泽济天下3 个月前
【工作记录】Kong Gateway 入门篇之部署及简单测试
gateway·kong