Hi Spyros,
thank you very much for the link ... it looks very interesting! It would be great if your suggested approach would be included as standard feature of ZAP!
In our case, I think the issue lies on the Ingress configuration. We use the standard Nginx Ingress Controller with the following settings in NGINX configuration file "/etc/nginx/conf.d/kubernetes_ssl.conf" :
location /zap/ {
proxy_pass http://127.0.0.1:30421/;
add_header X-Forwarded-Prefix "/zap" always;
proxy_set_header X-Forwarded-Prefix "/zap";
}
A very similar setup to the Nginx setup showed above is also used successfully to expose a web application outside the ingress.
However, when we try to access ZAP from outside Kubernetes, by using an URL like "https://<kubernetes_ingress_ip>/zap/", we get the following error message:
ZAP Error [java.net.ConnectException]: Connection refused (Connection refused)
Stack Trace:
java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:140)
at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:125)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:728)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:449)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:201)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.parosproxy.paros.network.HttpSender.executeMethod(HttpSender.java:418)
at org.parosproxy.paros.network.HttpSender.runMethod(HttpSender.java:653)
at org.parosproxy.paros.network.HttpSender.send(HttpSender.java:609)
at org.parosproxy.paros.network.HttpSender.sendAuthenticated(HttpSender.java:585)
at org.parosproxy.paros.network.HttpSender.sendAuthenticated(HttpSender.java:573)
at org.parosproxy.paros.network.HttpSender.sendAndReceive(HttpSender.java:478)
at org.parosproxy.paros.network.HttpSender.sendAndReceive(HttpSender.java:448)
at org.parosproxy.paros.core.proxy.ProxyThread.processHttp(ProxyThread.java:564)
at org.parosproxy.paros.core.proxy.ProxyThread.run(ProxyThread.java:335)
at java.lang.Thread.run(Thread.java:748)
By looking at the error message, it looks like the outside request arrives to ZAP but something goes wrong after that.
I have added below the deployment files currently used for ZAP container and service.
Can you please have a look and let me know if you spot something wrong?
Many thanks in advance!
Best regards,
Nuvo
### service.yaml ###
apiVersion: v1
kind: Service
metadata:
name: zap
spec:
selector:
run: zap-global
ports:
- port: 8094
targetPort: 8094
type: NodePort
### zap-deployment.yaml ###
apiVersion: apps/v1
kind: Deployment
metadata:
name: zap-global
spec:
replicas: 1
selector:
matchLabels:
run: zap-global
template:
metadata:
labels:
run: zap-global
spec:
containers:
- name: zap-global
command: ["zap.sh", "-daemon", "-port", "8094", "-host", "0.0.0.0", "-config", "api.disablekey=true", "-config", "api.addrs.addr.name=.*", "-config", "api.addrs.addr.regex=true"]
image: owasp/zap2docker-weekly
imagePullPolicy: Always
ports:
- containerPort: 8094
protocol: TCP
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "mkdir /zap/wrk"]