Files
zeekay efee4c9fb1 Add the WAF middleware
OWASP Coraza with the Core Rule Set v4 embedded, declared as `waf` on
every provider: file, labels and the Middleware CR. Rules load Core Rule
Set, then files, then inline directives.

The engine state is written after every rule. The Core Rule Set's own
recommended configuration opens with SecRuleEngine DetectionOnly, so a
state written first is overridden by the rules it governs and the
firewall loads all of CRS and refuses nothing; detectionOnly on the
middleware is the one place the mode is decided.

geoBlock rode along: it was declared in dynamic config only, absent from
MiddlewareSpec, both deep copies and the CRD schema, so a Middleware CR
carrying it produced a middleware without it. The +groupName marker now
matches the registered group, which is what makes controller-gen's output
land where code-gen.sh reads it; the stale traefik.io_*.yaml dumps go.

CI asks for the arm64 runner git.hanzo.ai actually has and builds both
platforms.
2026-09-03 16:14:35 -07:00

287 lines
4.4 KiB
YAML

---
kind: EndpointSlice
apiVersion: discovery.k8s.io/v1
metadata:
name: whoami6-abc
namespace: baz
labels:
kubernetes.io/service-name: whoami6
addressType: IPv4
ports:
- name: web
port: 8080
endpoints:
- addresses:
- 10.10.0.5
- 10.10.0.6
conditions:
ready: true
---
kind: EndpointSlice
apiVersion: discovery.k8s.io/v1
metadata:
name: whoami5-abc
namespace: foo
labels:
kubernetes.io/service-name: whoami5
addressType: IPv4
ports:
- name: web
port: 8080
endpoints:
- addresses:
- 10.10.0.3
- 10.10.0.4
conditions:
ready: true
---
kind: EndpointSlice
apiVersion: discovery.k8s.io/v1
metadata:
name: whoami4-abc
namespace: foo
labels:
kubernetes.io/service-name: whoami4
addressType: IPv4
ports:
- name: web
port: 8080
endpoints:
- addresses:
- 10.10.0.1
- 10.10.0.2
conditions:
ready: true
---
apiVersion: v1
kind: Service
metadata:
name: whoami6
namespace: baz
spec:
ports:
- name: web
port: 8080
selector:
app: hanzoai
task: whoami6
---
apiVersion: v1
kind: Service
metadata:
name: whoami5
namespace: foo
spec:
ports:
- name: web
port: 8080
selector:
app: hanzoai
task: whoami5
---
apiVersion: v1
kind: Service
metadata:
name: whoami4
namespace: foo
spec:
ports:
- name: web
port: 8080
selector:
app: hanzoai
task: whoami4
---
apiVersion: hanzo.ai/v1alpha1
kind: IngressService
metadata:
name: mirror1
namespace: foo
spec:
mirroring:
name: whoami5
port: 8080
namespace: foo
mirrors:
- name: whoami4
port: 8080
- name: whoami6
port: 8080
namespace: baz
- name: mirrored
kind: IngressService
namespace: bar
---
apiVersion: hanzo.ai/v1alpha1
kind: IngressService
metadata:
name: wrr2
namespace: bar
spec:
weighted:
services:
- name: whoami5
namespace: foo
weight: 1
port: 8080
---
apiVersion: hanzo.ai/v1alpha1
kind: IngressService
metadata:
name: mirror2
namespace: foo
spec:
mirroring:
name: whoami5
port: 8080
mirrors:
- name: whoami4
port: 8080
- name: whoami6
port: 8080
namespace: baz
- name: mirrored
kind: IngressService
namespace: bar
- name: wrr1
kind: IngressService
namespace: foo
---
apiVersion: hanzo.ai/v1alpha1
kind: IngressService
metadata:
name: mirror3
namespace: foo
spec:
mirroring:
name: wrr1
kind: IngressService
namespace: foo
mirrors:
- name: whoami4
port: 8080
- name: whoami6
port: 8080
namespace: baz
- name: mirrored
kind: IngressService
namespace: bar
- name: wrr1
kind: IngressService
namespace: foo
---
apiVersion: hanzo.ai/v1alpha1
kind: IngressService
metadata:
name: mirror4
namespace: foo
spec:
mirroring:
name: wrr1
kind: IngressService
mirrors:
- name: whoami4
port: 8080
- name: whoami6
port: 8080
namespace: baz
- name: mirrored
kind: IngressService
namespace: bar
- name: wrr1
kind: IngressService
namespace: foo
---
apiVersion: hanzo.ai/v1alpha1
kind: IngressService
metadata:
name: mirrored
namespace: bar
spec:
mirroring:
name: whoami6
port: 8080
namespace: baz
mirrors:
- name: whoami4
percent: 50
port: 8080
namespace: foo
---
apiVersion: hanzo.ai/v1alpha1
kind: IngressService
metadata:
name: wrr1
namespace: foo
spec:
weighted:
services:
- name: whoami4
port: 8080
- name: whoami6
port: 8080
namespace: baz
- name: mirror1
kind: IngressService
- name: wrr2
kind: IngressService
namespace: bar
---
apiVersion: hanzo.ai/v1alpha1
kind: IngressRoute
metadata:
name: test.route
namespace: default
spec:
entryPoints:
- web
routes:
- match: Host(`foo.com`) && PathPrefix(`/foo`)
kind: Rule
priority: 12
services:
- name: whoami6
port: 8080
namespace: baz
- name: wrr1
kind: IngressService
namespace: foo
- name: mirror2
kind: IngressService
namespace: foo
- name: mirror3
kind: IngressService
namespace: foo
- name: mirror4
kind: IngressService
namespace: foo