API 网关安全防护是微服务架构下将安全能力前移的关键手段,Apache APISIX 作为云原生 API 网关,能在流量入口统一完成身份认证、限流限频与 WAF 拦截,避免每个后端服务各自重复实现。本文介绍 APISIX 的部署与安全插件配置,包括 IP 黑名单、key-auth 认证、limit-req 限流与 ModSecurity WAF 集成,附可直接复制执行的命令。
适用场景
- 微服务集群对外统一入口,需在网关层做认证与限流
- API 被恶意调用、撞库或高频爬取,需要限频防护
- 需要在入口拦截 SQL 注入、XSS 等 Web 攻击,统一 WAF 策略
- 替换传统 Nginx 配置,用声明式配置管理多服务路由与安全规则
前置条件
- Docker 20.10+ 或裸机安装(本指南以 Docker Compose 为例)
- 服务器内存建议 2GB+(APISIX 与 etcd 依赖)
- 防火墙开放 9080(HTTP 入口)与 9180(Admin API,建议仅内网)
原理说明
APISIX 基于 OpenResty(Nginx + LuaJIT)构建,核心模型是路由 → 插件链 → 上游:请求先匹配 Route,按顺序执行绑定的插件(Plugin),最后转发到 Upstream 后端。安全能力全部由插件提供:ip-restriction 做 IP 黑白名单,key-auth 校验 API Key,limit-req 按令牌桶算法限流,modsecurity 插件将 OWASP CRS 规则集成到网关做 Web 攻击拦截。插件配置通过 Admin API 动态下发,无需重启网关即可生效。
操作步骤
1. Docker Compose 部署
cat > docker-compose.yml <<'EOF'
version: "3.8"
services:
etcd:
image: bitnami/etcd:3.5
environment:
- ALLOW_NONE_AUTHENTICATION=yes
- ETCD_ADVERTISE_CLIENT_URLS=http://etcd:2379
apisix:
image: apache/apisix:3.9.0-debian
ports:
- "9080:9080"
- "9180:9180"
volumes:
- ./apisix_conf/config.yaml:/usr/local/apisix/conf/config.yaml:ro
depends_on: [etcd]
EOF
docker compose up -d
curl http://127.0.0.1:9080/apisix/admin/routes -H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" | head -c 200
Admin API 默认 Key 为 edd1c9f034335f136f87ad84b625c8f1,生产环境必须修改 config.yaml 中的 admin_key。
2. 创建上游与路由
curl -X PUT http://127.0.0.1:9180/apisix/admin/upstreams/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -d '{
"type": "roundrobin",
"nodes": {"httpbin.org:80": 1}
}'
curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -d '{
"uri": "/anything",
"upstream_id": 1
}'
# 验证转发
curl http://127.0.0.1:9080/anything
3. 配置 limit-req 限流插件
curl -X PUT http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -d '{
"uri": "/anything",
"upstream_id": 1,
"plugins": {
"limit-req": {
"rate": 2,
"burst": 4,
"rejected_code": 429,
"key_type": "var",
"key": "remote_addr"
}
}
}'
# 连续快速请求 7 次,第 7 次应返回 429
for i in $(seq 1 7); do curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9080/anything; done
rate 为每秒允许的请求数,burst 为突发缓冲量,超出后直接返回 429。按客户端 IP 限流可有效抵御 CC 攻击与爬虫。
4. 配置 key-auth 认证
# 创建消费者并分配 Key
curl -X PUT http://127.0.0.1:9180/apisix/admin/consumers \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -d '{
"username": "app1",
"plugins": {"key-auth": {"key": "secret-app-key-001"}}
}'
# 路由绑定认证插件
curl -X PATCH http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -d '{
"plugins": {"key-auth": {}}
}'
# 不带 Key 返回 401,带 Key 正常
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9080/anything
curl -s -o /dev/null -w "%{http_code}\n" -H "apikey: secret-app-key-001" http://127.0.0.1:9080/anything
5. 配置 IP 黑名单
curl -X PATCH http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -d '{
"plugins": {"ip-restriction": {"blacklist": ["1.2.3.4", "10.0.0.0/8"]}}
}'
# 来自黑名单 IP 的请求返回 403
6. 集成 ModSecurity WAF
# 准备 OWASP CRS 规则(挂载到容器)
mkdir -p ./crs && cd ./crs
git clone --depth 1 https://github.com/coreruleset/coreruleset.git .
cp crs-setup.conf.example crs-setup.conf
# 修改 config.yaml 启用 modsecurity 插件并重启
docker compose restart apisix
# 在路由上启用 WAF 插件
curl -X PATCH http://127.0.0.1:9180/apisix/admin/routes/1 \
-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -d '{
"plugins": {"modsecurity": {
"deployment": "advance",
"modsecurity_config": "/usr/local/apisix/conf/crs-setup.conf"
}}
}'
# 测试 SQL 注入拦截:应返回 403
curl -s -o /dev/null -w "%{http_code}\n" "http://127.0.0.1:9080/anything?id=1%27%20OR%20%271%27%3D%271"
配置验证
- 不带认证 Key 访问返回 401,带正确 Key 返回 200
- 循环请求触发限流,超出 rate+burst 的请求返回 429
- 黑名单 IP 访问返回 403,白名单逻辑反向验证
- SQL 注入 payload 被 modsecurity 插件拦截返回 403,正常请求不受影响
docker compose ps各容器 healthy;Admin API 修改后curl http://127.0.0.1:9080/anything立即生效无需重启
常见问题
FAQ 1:APISIX 与直接用 Nginx 配置限流有什么区别?
Nginx 的 limit_req 写在静态配置中,改规则需 reload;APISIX 的插件通过 Admin API 动态下发并同步到 etcd,秒级生效且支持按路由、按消费者、按上游精细化控制,还可在控制台 Dashboard 可视化配置,适合多服务多团队的网关场景。
FAQ 2:modsecurity 插件会影响性能吗?
会,OWASP CRS 全量规则对每个请求做正则匹配,QPS 会明显下降。建议只对写接口或登录接口开启 WAF 插件,读接口用 limit-req 即可;或将 modsecurity 插件部署为独立插件链,按路由差异化挂载。
FAQ 3:Admin API 暴露公网有什么风险?
风险极高——攻击者可删除路由、关闭认证、添加恶意上游实现流量劫持。务必仅监听内网端口(9180 不对公网开放),更换 admin_key 并限制来源 IP;结合审计日志(access 日志)监控 Admin API 的异常调用。
总结
APISIX 让 API 安全策略实现”一处配置、全网生效”:key-auth 守住入口身份、limit-req 遏制高频滥用、ip-restriction 阻断恶意来源、modsecurity 拦截注入类攻击。建议按接口重要程度分级挂载插件:公开读接口做限流,敏感写接口叠加认证与 WAF,并将 Admin API 严格内网化,即可构建可靠的网关层安全防线。