参考 APISIX 联动雷池 的准备工作。
使用 ConfigMap 配置 Safeline 插件需要的检测引擎 host 和 port,内容如下:
# safeline.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: safeline
namespace: ingress-nginx
data:
host: "detector_host" # 雷池检测引擎的地址, 参考准备工作
port: "8000"
使用 ingress-nginx 创建 ConfigMap:
kubectl create namespace ingress-nginx
kubectl apply -f safeline.yaml
使用 helm 安装 Ingress-Nginx,参考 Ingress-Nginx 官方文档
使用下面的 values.yaml 进行镜像替换和插件配置:
# values.yaml
controller:
kind: DaemonSet
image:
registry: docker.io
image: chaitin/ingress-nginx-controller
tag: v1.10.1
digest: ""
extraEnvs:
- name: SAFELINE_HOST
valueFrom:
configMapKeyRef:
name: safeline
key: host
- name: SAFELINE_PORT
valueFrom:
configMapKeyRef:
name: safeline
key: port
service:
externalTrafficPolicy: Local # 便于获取真实客户端 IP
config:
plugins: safeline
admissionWebhooks:
patch:
image:
registry: docker.io
image: chaitin/ingress-nginx-kube-webhook-certgen
tag: v1.4.1
digest: ""
执行安装命令
helm upgrade --install ingress-nginx ingress-nginx \
--repo https://kubernetes.github.io/ingress-nginx \
--namespace ingress-nginx --create-namespace \
-f values.yaml
如果你想自行构建 Ingress-Nginx 镜像,可以参考下面的 Dockerfile:
FROM registry.k8s.io/ingress-nginx/controller:v1.10.1
USER root
RUN apk add --no-cache make gcc unzip wget
# install luaroncks
RUN wget https://luarocks.org/releases/luarocks-3.11.0.tar.gz && \
tar zxpf luarocks-3.11.0.tar.gz && \
cd luarocks-3.11.0 && \
./configure && \
make && \
make install && \
cd .. && \
rm -rf luarocks-3.11.0 luarocks-3.11.0.tar.gz
RUN luarocks install ingress-nginx-safeline && \
ln -s /usr/local/share/lua/5.1/safeline /etc/nginx/lua/plugins/safeline
USER www-data
参考上面的 Dockerfile 使用 luarocks 安装 Safeline 插件到 nginx 的默认插件目录。
使用上面的 safeline.yaml 创建 ConfigMap:
kubectl apply -f safeline.yaml
在 Ingress-Nginx 的插件配置中启用 Safeline :
# ingress-nginx-controller-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
data:
plugins: "safeline"
在 Ingress-Nginx 的 Deployment/DaemonSet 中添加环境变量便于插件读取:
# ingress-nginx-controller-deployment.yaml
...
env:
- name: SAFELINE_HOST
valueFrom:
configMapKeyRef:
name: safeline
key: host
- name: SAFELINE_PORT
valueFrom:
configMapKeyRef:
name: safeline
key: port
配置 nginx service 的 externalTrafficPolicy 为 Local,以便获取真实客户端 IP
通过构造恶意请求测试 Safeline 插件是否生效,例如:
curl http://localhost:80/ -H "Host: example.com" -H "User-Agent: () { :; }; echo; echo; /bin/bash -c 'echo hello'"
你会看到返回 403 Forbidden,说明 Safeline 插件生效了。
{
"code": 403,
"success": false,
"message": "blocked by Chaitin SafeLine Web Application Firewall",
"event_id": "18e0f220f7a94127acb21ad3c1b4ac47"
}
在雷池的控制台界面,可以看到雷池记录了完整的攻击信息。
如果在使用过程中遇到问题,可以在加入 SDK 讨论群