<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Coraza Kubernetes Operator</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/</link><description>Recent content on Coraza Kubernetes Operator</description><generator>Hugo</generator><language>en-us</language><atom:link href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/index.xml" rel="self" type="application/rss+xml"/><item><title>API Reference</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/</guid><description>&lt;!-- This file is auto-generated by crd-ref-docs. Do not edit manually. --&gt;
&lt;!-- Regenerate with: make docs.api --&gt;
&lt;h2 id="packages"&gt;Packages&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/#wafk8scorazaiov1alpha1"&gt;waf.k8s.coraza.io/v1alpha1&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="wafk8scorazaiov1alpha1"&gt;waf.k8s.coraza.io/v1alpha1&lt;/h2&gt;
&lt;p&gt;Package v1alpha1 contains API Schema definitions for the waf v1alpha1 API group.&lt;/p&gt;
&lt;h3 id="resource-types"&gt;Resource Types&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/#engine"&gt;Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/#enginelist"&gt;EngineList&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/#ruledata"&gt;RuleData&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/#ruledatalist"&gt;RuleDataList&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/#ruleset"&gt;RuleSet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/#rulesetlist"&gt;RuleSetList&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/#rulesource"&gt;RuleSource&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/#rulesourcelist"&gt;RuleSourceList&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="datareference"&gt;DataReference&lt;/h3&gt;
&lt;p&gt;DataReference is a reference to a RuleData object in the same namespace
as the RuleSet.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Appears in:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/api/#rulesetspec"&gt;RuleSetSpec&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Field&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Validation&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;name&lt;/code&gt; &lt;em&gt;string&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;name is the name of the RuleData in the same namespace as the RuleSet.&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;MaxLength: 253 &lt;br /&gt;MinLength: 1 &lt;br /&gt;Required: {} &lt;br /&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="driverconfig"&gt;DriverConfig&lt;/h3&gt;
&lt;p&gt;DriverConfig configures how the WAF filter is deployed into the target.
When omitted from the Engine spec, the operator uses a default driver
(currently wasm for Istio).&lt;/p&gt;</description></item><item><title>Architecture</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/explanation/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/explanation/architecture/</guid><description>&lt;p&gt;The Coraza Kubernetes Operator uses a two-controller architecture with a shared in-memory cache to deliver firewall rules to WASM plugins running in Envoy sidecars.&lt;/p&gt;
&lt;h2 id="high-level-overview"&gt;High-Level Overview&lt;/h2&gt;
&lt;p&gt;The operator manages two custom resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RuleSet&lt;/strong&gt; &amp;ndash; Aggregates SecLang from &lt;strong&gt;RuleSource&lt;/strong&gt; resources (and optional &lt;strong&gt;RuleData&lt;/strong&gt; for &lt;code&gt;@pmFromFile&lt;/code&gt; files) and compiles them into a cached, validated ruleset.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Engine&lt;/strong&gt; &amp;ndash; Attaches a RuleSet to one or more Gateways by deploying a Coraza WASM plugin into Envoy.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The data flows through these components:&lt;/p&gt;</description></item><item><title>Getting Started on Kubernetes</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/tutorials/getting-started-kubernetes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/tutorials/getting-started-kubernetes/</guid><description>&lt;p&gt;This tutorial walks you through installing the Coraza Kubernetes Operator on a Kubernetes cluster, creating firewall rules, and verifying that the WAF is filtering traffic.&lt;/p&gt;
&lt;p&gt;By the end, you will have a working WAF protecting a sample application behind a Kubernetes Gateway.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before you begin, ensure you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Kubernetes cluster running &lt;strong&gt;v1.32 or later&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://istio.io/latest/docs/setup/"&gt;Istio&lt;/a&gt; installed with &lt;a href="https://gateway-api.sigs.k8s.io/"&gt;Gateway API CRDs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://helm.sh/docs/intro/install/"&gt;Helm 3&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/tools/"&gt;kubectl&lt;/a&gt; configured to access your cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="step-1-install-the-operator"&gt;Step 1: Install the Operator&lt;/h2&gt;
&lt;p&gt;Add the Helm repository and install the operator:&lt;/p&gt;</description></item><item><title>Install on Kubernetes with Helm</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/install-kubernetes-helm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/install-kubernetes-helm/</guid><description>&lt;p&gt;This guide covers installing the Coraza Kubernetes Operator using Helm on a standard Kubernetes cluster.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Kubernetes cluster running &lt;strong&gt;v1.32 or later&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://istio.io/latest/docs/setup/"&gt;Istio&lt;/a&gt; installed with &lt;a href="https://gateway-api.sigs.k8s.io/"&gt;Gateway API CRDs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://helm.sh/docs/intro/install/"&gt;Helm 3&lt;/a&gt; installed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="install-from-the-helm-repository"&gt;Install from the Helm Repository&lt;/h2&gt;
&lt;p&gt;Add the Helm repository hosted on GitHub Pages and install:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm repo add coraza-kubernetes-operator &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; https://networking-incubator.github.io/coraza-kubernetes-operator/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm upgrade --install coraza-kubernetes-operator &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; coraza-kubernetes-operator/coraza-kubernetes-operator &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --namespace coraza-system &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --create-namespace
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="pin-a-specific-version"&gt;Pin a Specific Version&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm upgrade --install coraza-kubernetes-operator &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; coraza-kubernetes-operator/coraza-kubernetes-operator &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --namespace coraza-system &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --create-namespace &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --version &amp;lt;chart-version&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;&amp;lt;chart-version&amp;gt;&lt;/code&gt; with the desired version (e.g. &lt;code&gt;0.1.0&lt;/code&gt;). Available versions are listed on the &lt;a href="https://github.com/networking-incubator/coraza-kubernetes-operator/releases"&gt;releases page&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Install on OpenShift</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/install-openshift-operatorhub/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/install-openshift-operatorhub/</guid><description>&lt;p&gt;This guide covers installing the Coraza Kubernetes Operator on OpenShift Container Platform.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;OpenShift Container Platform &lt;strong&gt;v4.20 or later&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Cluster administrator privileges&lt;/li&gt;
&lt;li&gt;Gateway API enabled on your cluster (see &lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/install-openshift-operatorhub/#enable-gateway-api"&gt;Enable Gateway API&lt;/a&gt; below)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.redhat.com/en/documentation/red_hat_openshift_service_mesh/3.0/html-single/gateways/index"&gt;OpenShift Service Mesh&lt;/a&gt; or Istio installed with Gateway API support&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="enable-gateway-api"&gt;Enable Gateway API&lt;/h3&gt;
&lt;p&gt;On OpenShift 4.20 and later, the Gateway API CRDs are included by default. You must create the &lt;code&gt;openshift-default&lt;/code&gt; GatewayClass, which is the &lt;a href="https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/ingress_and_load_balancing/configuring-ingress-cluster-traffic#ingress-gateway-api"&gt;officially supported GatewayClass&lt;/a&gt; provided by the OpenShift Ingress Operator:&lt;/p&gt;</description></item><item><title>Creating Firewall Rules</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/creating-firewall-rules/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/creating-firewall-rules/</guid><description>&lt;p&gt;Firewall rules in the Coraza Kubernetes Operator are written using &lt;a href="https://github.com/owasp-modsecurity/ModSecurity/wiki/Reference-Manual-%28v3.x%29"&gt;ModSecurity SecLang&lt;/a&gt; syntax. Rule text is stored in &lt;strong&gt;RuleSource&lt;/strong&gt; resources; a &lt;strong&gt;RuleSet&lt;/strong&gt; lists RuleSource (and optional RuleData) names in order and drives compilation and caching.&lt;/p&gt;
&lt;h2 id="writing-rules-in-rulesources"&gt;Writing rules in RuleSources&lt;/h2&gt;
&lt;p&gt;Each &lt;strong&gt;RuleSource&lt;/strong&gt; has &lt;code&gt;spec.rules&lt;/code&gt;: a string containing SecLang directives (use a &lt;code&gt;|&lt;/code&gt; block scalar in YAML for multiline text).&lt;/p&gt;
&lt;p&gt;A basic RuleSource with Coraza engine configuration:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;waf.k8s.coraza.io/v1alpha1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;RuleSource&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;base-rules&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;rules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; SecRuleEngine On
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; SecRequestBodyAccess On
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; SecResponseBodyAccess Off
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; SecAuditLog /dev/stdout
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; SecAuditLogFormat JSON
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; SecAuditEngine RelevantOnly&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A RuleSource with a SQL injection detection rule:&lt;/p&gt;</description></item><item><title>Getting Started on OpenShift</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/tutorials/getting-started-openshift/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/tutorials/getting-started-openshift/</guid><description>&lt;p&gt;This tutorial walks you through installing the Coraza Kubernetes Operator on OpenShift Container Platform, creating firewall rules, and verifying that the WAF is filtering traffic.&lt;/p&gt;
&lt;p&gt;By the end, you will have a working WAF protecting a sample application behind an OpenShift Gateway.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before you begin, ensure you have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An OpenShift Container Platform cluster running &lt;strong&gt;v4.20 or later&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Gateway API enabled on your cluster (see &lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/dev/tutorials/getting-started-openshift/#enable-gateway-api"&gt;Enable Gateway API&lt;/a&gt; below)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.redhat.com/en/documentation/red_hat_openshift_service_mesh/3.0/html-single/gateways/index"&gt;OpenShift Service Mesh&lt;/a&gt; or Istio installed with Gateway API support&lt;/li&gt;
&lt;li&gt;&lt;a href="https://helm.sh/docs/intro/install/"&gt;Helm 3&lt;/a&gt; installed&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;oc&lt;/code&gt; CLI configured to access your cluster&lt;/li&gt;
&lt;li&gt;Cluster administrator privileges&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="enable-gateway-api"&gt;Enable Gateway API&lt;/h3&gt;
&lt;p&gt;On OpenShift 4.19 and later, the Gateway API CRDs are included by default. You must create the &lt;code&gt;openshift-default&lt;/code&gt; GatewayClass, which is the &lt;a href="https://docs.redhat.com/en/documentation/openshift_container_platform/4.21/html/ingress_and_load_balancing/configuring-ingress-cluster-traffic#ingress-gateway-api"&gt;officially supported GatewayClass&lt;/a&gt; provided by the OpenShift Ingress Operator:&lt;/p&gt;</description></item><item><title>Helm Chart Values</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/helm-values/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/helm-values/</guid><description>&lt;p&gt;The Coraza Kubernetes Operator Helm chart is located at &lt;code&gt;charts/coraza-kubernetes-operator/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="values-reference"&gt;Values Reference&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Key&lt;/th&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;replicas&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;int&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Number of operator replicas. A PodDisruptionBudget with &lt;code&gt;minAvailable: 1&lt;/code&gt; is created automatically when greater than 1.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;image.repository&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;ghcr.io/networking-incubator/coraza-kubernetes-operator&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Container image repository.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;image.tag&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;latest&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Container image tag.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;image.pullPolicy&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;IfNotPresent&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Image pull policy.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;imagePullSecrets&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;list&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Image pull secrets for private registries.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;resources.requests.cpu&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;10m&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;CPU request.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;resources.requests.memory&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;128Mi&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Memory request.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;resources.limits.cpu&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;500m&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;CPU limit.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;resources.limits.memory&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;256Mi&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Memory limit.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;metrics.enabled&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Enable the controller-runtime metrics endpoint (HTTPS on port 8443).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;metrics.certSecret&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Name of a Secret with TLS cert/key for metrics. When empty, a self-signed certificate is generated.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;metrics.certName&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tls.crt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Key name of the certificate file inside &lt;code&gt;certSecret&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;metrics.keyName&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tls.key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Key name of the private key file inside &lt;code&gt;certSecret&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;metrics.caName&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Key name of a CA certificate inside &lt;code&gt;certSecret&lt;/code&gt; for ServiceMonitor TLS verification.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;metrics.serviceMonitor.enabled&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Create a Prometheus ServiceMonitor resource.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;logging.development&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Use console encoder with debug level (development mode). When false, the production settings below apply.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;logging.encoder&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;json&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Log encoding format (&lt;code&gt;json&lt;/code&gt; or &lt;code&gt;console&lt;/code&gt;). Only used when &lt;code&gt;development&lt;/code&gt; is false.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;logging.level&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;info&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Minimum log level (&lt;code&gt;debug&lt;/code&gt;, &lt;code&gt;info&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt;). Only used when &lt;code&gt;development&lt;/code&gt; is false.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;logging.stacktraceLevel&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;error&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Minimum level for stack traces (&lt;code&gt;info&lt;/code&gt;, &lt;code&gt;error&lt;/code&gt;, &lt;code&gt;panic&lt;/code&gt;). Only used when &lt;code&gt;development&lt;/code&gt; is false.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;logging.timeEncoding&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;rfc3339nano&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Timestamp format (&lt;code&gt;epoch&lt;/code&gt;, &lt;code&gt;millis&lt;/code&gt;, &lt;code&gt;nano&lt;/code&gt;, &lt;code&gt;iso8601&lt;/code&gt;, &lt;code&gt;rfc3339&lt;/code&gt;, &lt;code&gt;rfc3339nano&lt;/code&gt;). Only used when &lt;code&gt;development&lt;/code&gt; is false.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;istio.revision&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Istio control plane revision label. When empty, no revision label is set on managed resources.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;defaultWasmImage&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Default WASM plugin OCI URL when an Engine omits &lt;code&gt;spec.driver.wasm.image&lt;/code&gt;. When empty, uses the operator&amp;rsquo;s built-in default.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;createNamespace&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Manage the release namespace with Pod Security Standard labels. Requires &lt;code&gt;--create-namespace&lt;/code&gt; on first install.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;openshift.enabled&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;bool&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Omit &lt;code&gt;runAsUser&lt;/code&gt;, &lt;code&gt;fsGroup&lt;/code&gt;, and &lt;code&gt;fsGroupChangePolicy&lt;/code&gt; from the pod security context for OpenShift SCC compatibility.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;podSecurityStandard.version&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;string&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;latest&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Kubernetes version for Pod Security Standard labels (&lt;code&gt;latest&lt;/code&gt; or &lt;code&gt;vX.YZ&lt;/code&gt;).&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;nodeSelector&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;object&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Node selector constraints.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;tolerations&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;list&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Tolerations.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;affinity&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;object&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;{}&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Affinity rules.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;topologySpreadConstraints&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;list&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;[]&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Topology spread constraints for pod scheduling.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="platform-requirements"&gt;Platform Requirements&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Platform&lt;/th&gt;
 &lt;th&gt;Minimum Version&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Kubernetes&lt;/td&gt;
 &lt;td&gt;v1.32+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;OpenShift Container Platform&lt;/td&gt;
 &lt;td&gt;v4.20+&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="openshift-values-example"&gt;OpenShift Values Example&lt;/h2&gt;
&lt;p&gt;For OpenShift installations, use the following values overlay:&lt;/p&gt;</description></item><item><title>Rule Processing</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/explanation/rule-processing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/explanation/rule-processing/</guid><description>&lt;p&gt;This page explains the lifecycle of firewall rules from &lt;strong&gt;RuleSource&lt;/strong&gt; / &lt;strong&gt;RuleData&lt;/strong&gt; to enforcement in the WASM plugin.&lt;/p&gt;
&lt;h2 id="rule-aggregation"&gt;Rule aggregation&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;RuleSet&lt;/strong&gt; lists &lt;strong&gt;RuleSource&lt;/strong&gt; names in &lt;code&gt;spec.sources&lt;/code&gt;. Each RuleSource stores SecLang in &lt;code&gt;spec.rules&lt;/code&gt;. The operator fetches each RuleSource in list order and concatenates the strings into one aggregate body (with newlines between fragments).&lt;/p&gt;
&lt;p&gt;The order matters because SecLang directives are evaluated sequentially. Engine configuration directives (such as &lt;code&gt;SecRuleEngine On&lt;/code&gt;) must appear before detection rules.&lt;/p&gt;</description></item><item><title>Deploying a WAF Engine</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/deploying-waf-engine/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/deploying-waf-engine/</guid><description>&lt;p&gt;An Engine resource references a RuleSet and attaches the Coraza WAF to a Gateway via an Istio WasmPlugin.&lt;/p&gt;
&lt;h2 id="creating-an-engine"&gt;Creating an Engine&lt;/h2&gt;
&lt;p&gt;The minimum Engine configuration requires a RuleSet reference and a target that identifies your Gateway:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;waf.k8s.coraza.io/v1alpha1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Engine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-engine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ruleSet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-ruleset&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Gateway&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-gateway&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Istio&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="selecting-a-gateway"&gt;Selecting a Gateway&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;target.name&lt;/code&gt; identifies the Gateway resource in the same namespace. The operator derives the workload label selector using the GEP-1762 convention (&lt;code&gt;gateway.networking.k8s.io/gateway-name&lt;/code&gt; label).&lt;/p&gt;</description></item><item><title>kubectl-coraza CLI</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/kubectl-coraza/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/kubectl-coraza/</guid><description>&lt;p&gt;&lt;code&gt;kubectl-coraza&lt;/code&gt; is a kubectl plugin for generating Kubernetes manifests (RuleSource, RuleData, RuleSet) from OWASP CoreRuleSet files.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The operator validates and compiles rules after you apply manifests; this tool does not compile Coraza rules.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;Build from source:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/networking-incubator/coraza-kubernetes-operator.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; coraza-kubernetes-operator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copy &lt;code&gt;bin/kubectl-coraza&lt;/code&gt; to a directory on your &lt;code&gt;PATH&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;cp bin/kubectl-coraza /usr/local/bin/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once installed, the plugin is available as &lt;code&gt;kubectl coraza&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="commands"&gt;Commands&lt;/h2&gt;
&lt;h3 id="kubectl-coraza-generate-coreruleset"&gt;&lt;code&gt;kubectl coraza generate coreruleset&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;Generate &lt;strong&gt;RuleSource&lt;/strong&gt; resources (one per &lt;code&gt;*.conf&lt;/code&gt; file), an optional &lt;strong&gt;RuleData&lt;/strong&gt; resource for &lt;code&gt;*.data&lt;/code&gt; files, and a &lt;strong&gt;RuleSet&lt;/strong&gt; that references them.&lt;/p&gt;</description></item><item><title>Istio WASM Integration</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/explanation/istio-wasm-integration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/explanation/istio-wasm-integration/</guid><description>&lt;p&gt;The Coraza Kubernetes Operator integrates with Istio by deploying a WebAssembly (WASM) plugin into Envoy proxies attached to Kubernetes Gateways. This page explains how that integration works.&lt;/p&gt;
&lt;h2 id="how-istio-wasmplugin-works"&gt;How Istio WasmPlugin Works&lt;/h2&gt;
&lt;p&gt;Istio provides a &lt;a href="https://istio.io/latest/docs/reference/config/proxy_extensions/wasm-plugin/"&gt;WasmPlugin&lt;/a&gt; resource that instructs Envoy to load and execute a WASM module. The operator creates WasmPlugin resources to inject the Coraza WAF into the request processing pipeline.&lt;/p&gt;
&lt;p&gt;When a WasmPlugin is applied, Istio:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Downloads the WASM binary from the specified OCI registry.&lt;/li&gt;
&lt;li&gt;Loads it into the Envoy proxy as a filter.&lt;/li&gt;
&lt;li&gt;Routes HTTP requests through the WASM filter before forwarding them to the backend.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="the-coraza-proxy-wasm-plugin"&gt;The coraza-proxy-wasm Plugin&lt;/h2&gt;
&lt;p&gt;The WASM module used by the operator is &lt;a href="https://github.com/networking-incubator/coraza-proxy-wasm"&gt;coraza-proxy-wasm&lt;/a&gt;. It is a purpose-built Envoy WASM filter that:&lt;/p&gt;</description></item><item><title>Operator CLI Flags</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/operator-cli-flags/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/operator-cli-flags/</guid><description>&lt;p&gt;The operator manager binary accepts the following command-line flags. When deployed via Helm, these are configured through the chart values and passed as container arguments.&lt;/p&gt;
&lt;h2 id="flags"&gt;Flags&lt;/h2&gt;
&lt;h3 id="core"&gt;Core&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Flag&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--metrics-bind-address&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Address for the metrics endpoint. Use &lt;code&gt;:8443&lt;/code&gt; for HTTPS or &lt;code&gt;0&lt;/code&gt; to disable.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--health-probe-bind-address&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;:8081&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Address for the health and readiness probe endpoint.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--leader-elect&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Enable leader election for controller manager. Required for running multiple replicas.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--operator-name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;(none)&lt;/td&gt;
 &lt;td&gt;Helm release name. When set, the operator creates Istio ServiceEntry and DestinationRule prerequisites at startup.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="tls-certificates"&gt;TLS Certificates&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Flag&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--metrics-cert-path&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;(none)&lt;/td&gt;
 &lt;td&gt;Directory containing the metrics server TLS certificate.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--metrics-cert-name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tls.crt&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Filename of the metrics certificate.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--metrics-cert-key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;tls.key&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Filename of the metrics private key.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="ruleset-cache"&gt;RuleSet Cache&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Flag&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--cache-gc-interval&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;5m&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;How often to check for and remove stale cache entries.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--cache-max-age&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;24h&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Maximum age before a cache entry is considered stale.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--cache-max-size&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;104857600&lt;/code&gt; (100 MB)&lt;/td&gt;
 &lt;td&gt;Maximum total size of all cached rules in bytes.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--cache-server-port&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;18080&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Port for the RuleSet cache HTTP server.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--envoy-cluster-name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;(required)&lt;/td&gt;
 &lt;td&gt;Envoy cluster name pointing to the cache server.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="istio-integration"&gt;Istio Integration&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Flag&lt;/th&gt;
 &lt;th&gt;Default&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--istio-revision&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;(none)&lt;/td&gt;
 &lt;td&gt;Istio revision label value for managed Istio resources.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--default-wasm-image&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Built-in default&lt;/td&gt;
 &lt;td&gt;OCI reference for the Coraza WASM plugin used when an Engine omits the &lt;code&gt;image&lt;/code&gt; field. Can also be set via the &lt;code&gt;CORAZA_DEFAULT_WASM_IMAGE&lt;/code&gt; environment variable.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="environment-variables"&gt;Environment Variables&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Variable&lt;/th&gt;
 &lt;th&gt;Required&lt;/th&gt;
 &lt;th&gt;Description&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;POD_NAMESPACE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Yes&lt;/td&gt;
 &lt;td&gt;The namespace in which the operator is running. Typically set via the Kubernetes downward API.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;CORAZA_DEFAULT_WASM_IMAGE&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;No&lt;/td&gt;
 &lt;td&gt;Override the default WASM plugin OCI image. Equivalent to &lt;code&gt;--default-wasm-image&lt;/code&gt;.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="logging"&gt;Logging&lt;/h2&gt;
&lt;p&gt;The operator uses &lt;a href="https://github.com/uber-go/zap"&gt;Zap&lt;/a&gt; via controller-runtime. Logging behavior is controlled through Helm values rather than direct CLI flags:&lt;/p&gt;</description></item><item><title>Using the OWASP CoreRuleSet</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/using-coreruleset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/using-coreruleset/</guid><description>&lt;p&gt;The &lt;a href="https://coreruleset.org/"&gt;OWASP CoreRuleSet (CRS)&lt;/a&gt; is a widely used set of attack detection rules for ModSecurity-compatible WAFs. The &lt;code&gt;kubectl-coraza&lt;/code&gt; plugin can generate &lt;strong&gt;RuleSource&lt;/strong&gt;, &lt;strong&gt;RuleData&lt;/strong&gt;, and &lt;strong&gt;RuleSet&lt;/strong&gt; manifests from CRS rule files.&lt;/p&gt;
&lt;div class="alert alert-warning" role="alert"&gt;&lt;div class="h4 alert-heading" role="heading"&gt;Important&lt;/div&gt;
&lt;p&gt;This project does not provide, maintain, or support CoreRuleSet rules. Users must supply their own rules. The tools described here are provided for convenience.&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="install-the-kubectl-coraza-plugin"&gt;Install the kubectl-coraza Plugin&lt;/h2&gt;
&lt;p&gt;Build the plugin from the operator repository:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone https://github.com/networking-incubator/coraza-kubernetes-operator.git
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; coraza-kubernetes-operator
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;make build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This produces &lt;code&gt;bin/kubectl-coraza&lt;/code&gt;. Copy it to a directory on your &lt;code&gt;PATH&lt;/code&gt;:&lt;/p&gt;</description></item><item><title>Status Conditions and Troubleshooting</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/status-conditions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/reference/status-conditions/</guid><description>&lt;p&gt;Both Engine and RuleSet resources report their state through standard Kubernetes conditions. This page describes each condition type and provides troubleshooting guidance.&lt;/p&gt;
&lt;h2 id="condition-types"&gt;Condition Types&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Type&lt;/th&gt;
 &lt;th&gt;Meaning&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Ready&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The resource has been successfully processed and is operational.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Progressing&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The resource is being created or updated.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;Degraded&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;The resource failed to reach or maintain its desired state.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each condition includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;status&lt;/strong&gt;: &lt;code&gt;True&lt;/code&gt;, &lt;code&gt;False&lt;/code&gt;, or &lt;code&gt;Unknown&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reason&lt;/strong&gt;: A programmatic identifier (CamelCase) explaining the condition.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;message&lt;/strong&gt;: A human-readable description.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;lastTransitionTime&lt;/strong&gt;: When the condition last changed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;observedGeneration&lt;/strong&gt;: The resource generation that was observed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="engine-conditions"&gt;Engine Conditions&lt;/h2&gt;
&lt;h3 id="accepted"&gt;Accepted&lt;/h3&gt;
&lt;p&gt;The Engine&amp;rsquo;s target Gateway has been validated. Only one Engine may target a given Gateway at a time. When multiple Engines reference the same Gateway, the oldest one (by creation timestamp) wins; if timestamps are equal, the lexicographically first name wins. The losing Engines receive &lt;code&gt;Accepted=False&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Using Data Files with Rules</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/using-data-files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/using-data-files/</guid><description>&lt;p&gt;Some SecLang rules use the &lt;code&gt;@pmFromFile&lt;/code&gt; directive to match against patterns stored in external data files. The Coraza Kubernetes Operator provides these files from &lt;strong&gt;RuleData&lt;/strong&gt; resources, referenced by the &lt;strong&gt;RuleSet&lt;/strong&gt; &lt;code&gt;spec.data&lt;/code&gt; list.&lt;/p&gt;
&lt;h2 id="when-to-use-data-files"&gt;When to use data files&lt;/h2&gt;
&lt;p&gt;Use data files when your rules reference &lt;code&gt;@pmFromFile&lt;/code&gt;. For example:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SecRule ARGS &amp;#34;@pmFromFile bad-patterns.data&amp;#34; \
 &amp;#34;id:3001,phase:2,deny,status:403,msg:&amp;#39;Blocked pattern detected&amp;#39;&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This rule reads patterns from a file named &lt;code&gt;bad-patterns.data&lt;/code&gt;. Store that file in a &lt;strong&gt;RuleData&lt;/strong&gt; &lt;code&gt;spec.files&lt;/code&gt; map (filename → content).&lt;/p&gt;</description></item><item><title>Configuring Failure Policies</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/configuring-failure-policies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/configuring-failure-policies/</guid><description>&lt;p&gt;The Engine &lt;code&gt;failurePolicy&lt;/code&gt; field determines how traffic is handled when the WAF is not ready or encounters an error during rule evaluation.&lt;/p&gt;
&lt;h2 id="available-policies"&gt;Available Policies&lt;/h2&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Policy&lt;/th&gt;
 &lt;th&gt;Behavior&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;fail&lt;/code&gt; (default)&lt;/td&gt;
 &lt;td&gt;Block all traffic when the WAF is not ready or encounters an error. This prioritizes security.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;allow&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Allow traffic through when the WAF is not ready or encounters an error. This prioritizes availability.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="setting-the-failure-policy"&gt;Setting the Failure Policy&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;waf.k8s.coraza.io/v1alpha1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Engine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-engine&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;spec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;failurePolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;fail&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ruleSet&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-ruleset&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;target&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Gateway&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-gateway&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Istio&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="when-to-use-each-policy"&gt;When to Use Each Policy&lt;/h2&gt;
&lt;h3 id="use-fail-when"&gt;Use &lt;code&gt;fail&lt;/code&gt; when:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Security is the highest priority.&lt;/li&gt;
&lt;li&gt;You prefer to block traffic rather than risk allowing unfiltered requests.&lt;/li&gt;
&lt;li&gt;The application behind the Gateway can tolerate brief outages during WAF startup or rule updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="use-allow-when"&gt;Use &lt;code&gt;allow&lt;/code&gt; when:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Availability is the highest priority.&lt;/li&gt;
&lt;li&gt;You prefer to serve traffic unfiltered rather than block it during WAF startup.&lt;/li&gt;
&lt;li&gt;The WAF provides defense-in-depth alongside other security controls.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="changing-the-policy"&gt;Changing the Policy&lt;/h2&gt;
&lt;p&gt;You can change the failure policy on an existing Engine at any time:&lt;/p&gt;</description></item><item><title>Known Limitations</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/explanation/known-limitations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/explanation/known-limitations/</guid><description>&lt;p&gt;This page describes known limitations when running the Coraza WAF with Istio using WASM mode. These limitations are specific to the WASM execution environment and do not apply to all deployment modes.&lt;/p&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;Out of approximately 3,300 OWASP CoreRuleSet conformance tests, 190 tests (6%) are currently excluded, resulting in a &lt;strong&gt;94% pass rate&lt;/strong&gt;. The excluded tests fall into four categories:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Category&lt;/th&gt;
 &lt;th&gt;Tests&lt;/th&gt;
 &lt;th&gt;Impact&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Enhanced Security&lt;/td&gt;
 &lt;td&gt;45&lt;/td&gt;
 &lt;td&gt;Positive &amp;ndash; Envoy provides additional protection.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Tool Limitations&lt;/td&gt;
 &lt;td&gt;113&lt;/td&gt;
 &lt;td&gt;Requires alternative controls or monitoring.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Coraza/WASM Bugs&lt;/td&gt;
 &lt;td&gt;13&lt;/td&gt;
 &lt;td&gt;Requires fixes in Coraza or coraza-proxy-wasm.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Under Investigation&lt;/td&gt;
 &lt;td&gt;19&lt;/td&gt;
 &lt;td&gt;Requires further analysis.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="operator-behavior"&gt;Operator Behavior&lt;/h2&gt;
&lt;p&gt;The RuleSet controller automatically detects and rejects any RuleSet containing rules listed in this document. When unsupported rules are found:&lt;/p&gt;</description></item><item><title>Monitoring with Prometheus</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/monitoring-prometheus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/monitoring-prometheus/</guid><description>&lt;p&gt;The Coraza Kubernetes Operator exposes Prometheus metrics over HTTPS for monitoring the RuleSet cache server.&lt;/p&gt;
&lt;h2 id="enabling-the-metrics-endpoint"&gt;Enabling the Metrics Endpoint&lt;/h2&gt;
&lt;p&gt;Metrics are enabled by default. The endpoint is served over HTTPS on port &lt;strong&gt;8443&lt;/strong&gt; with TLS 1.3 and requires authentication via a Kubernetes ServiceAccount token.&lt;/p&gt;
&lt;p&gt;To disable metrics:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# values.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="enabling-the-servicemonitor"&gt;Enabling the ServiceMonitor&lt;/h2&gt;
&lt;p&gt;If you use the &lt;a href="https://prometheus-operator.dev/"&gt;Prometheus Operator&lt;/a&gt;, enable the ServiceMonitor to automatically discover the metrics endpoint:&lt;/p&gt;</description></item><item><title>Security Model</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/explanation/security-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/explanation/security-model/</guid><description>&lt;p&gt;This page describes the security model of the Coraza Kubernetes Operator, including RBAC permissions, network security, and authentication mechanisms.&lt;/p&gt;
&lt;h2 id="rbac-permissions"&gt;RBAC Permissions&lt;/h2&gt;
&lt;p&gt;The operator requires two sets of RBAC permissions:&lt;/p&gt;
&lt;h3 id="cluster-scoped-permissions-clusterrole"&gt;Cluster-Scoped Permissions (ClusterRole)&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Resource&lt;/th&gt;
 &lt;th&gt;Verbs&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;waf.k8s.coraza.io&lt;/code&gt; &lt;strong&gt;rulesources&lt;/strong&gt;, &lt;strong&gt;ruledata&lt;/strong&gt;&lt;/td&gt;
 &lt;td&gt;get, list, watch&lt;/td&gt;
 &lt;td&gt;Read SecLang and data file content for RuleSet reconciliation.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Pods&lt;/td&gt;
 &lt;td&gt;list, watch&lt;/td&gt;
 &lt;td&gt;Discover Gateway pods matching Engine target names.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ServiceAccounts&lt;/td&gt;
 &lt;td&gt;create, get, list, patch, update, watch&lt;/td&gt;
 &lt;td&gt;Manage service accounts for cache authentication.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ServiceAccounts/token&lt;/td&gt;
 &lt;td&gt;create&lt;/td&gt;
 &lt;td&gt;Issue tokens for WASM plugin authentication.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Events&lt;/td&gt;
 &lt;td&gt;create, patch&lt;/td&gt;
 &lt;td&gt;Record events on managed resources.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Deployments&lt;/td&gt;
 &lt;td&gt;get&lt;/td&gt;
 &lt;td&gt;Read operator deployment metadata.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;TokenReviews, SubjectAccessReviews&lt;/td&gt;
 &lt;td&gt;create&lt;/td&gt;
 &lt;td&gt;Authenticate and authorize metrics endpoint access.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Leases&lt;/td&gt;
 &lt;td&gt;create, delete, get, list, patch, update, watch&lt;/td&gt;
 &lt;td&gt;Leader election.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;WasmPlugins (Istio)&lt;/td&gt;
 &lt;td&gt;create, delete, get, list, patch, update, watch&lt;/td&gt;
 &lt;td&gt;Manage Istio WASM plugin resources.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Gateways (Gateway API)&lt;/td&gt;
 &lt;td&gt;get, list, watch&lt;/td&gt;
 &lt;td&gt;Discover and validate Gateways for Engine target resolution.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;ServiceEntries, DestinationRules (Istio)&lt;/td&gt;
 &lt;td&gt;create, get, patch, update&lt;/td&gt;
 &lt;td&gt;Create Istio prerequisites for cache server mesh connectivity.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="namespace-scoped-permissions-role"&gt;Namespace-Scoped Permissions (Role)&lt;/h3&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Resource&lt;/th&gt;
 &lt;th&gt;Verbs&lt;/th&gt;
 &lt;th&gt;Purpose&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;NetworkPolicies&lt;/td&gt;
 &lt;td&gt;create, delete, get, list, patch, update, watch&lt;/td&gt;
 &lt;td&gt;Manage network policies for cache server access.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The operator follows the principle of least privilege. It does not request permissions beyond what is needed for its controllers.&lt;/p&gt;</description></item><item><title>Upgrading the Operator</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/upgrading/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/dev/howto/upgrading/</guid><description>&lt;h2 id="upgrading-with-helm"&gt;Upgrading with Helm&lt;/h2&gt;
&lt;p&gt;To upgrade to the latest version:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm upgrade coraza-kubernetes-operator &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; coraza-kubernetes-operator/coraza-kubernetes-operator &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --namespace coraza-system
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To upgrade to a specific version:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;helm upgrade coraza-kubernetes-operator &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; coraza-kubernetes-operator/coraza-kubernetes-operator &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --namespace coraza-system &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --version 0.3.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Helm automatically applies any CRD changes included in the new chart version.&lt;/p&gt;
&lt;h2 id="upgrading-on-openshift-olm"&gt;Upgrading on OpenShift (OLM)&lt;/h2&gt;
&lt;p&gt;If you installed the operator through OperatorHub with automatic approval, OLM handles upgrades automatically when new versions are published to the catalog.&lt;/p&gt;</description></item></channel></rss>