<?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/v0.4/</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/v0.4/index.xml" rel="self" type="application/rss+xml"/><item><title>API Reference</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/reference/api/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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/v0.4/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/v0.4/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/v0.4/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/v0.4/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/v0.4/reference/api/#rulesetlist"&gt;RuleSetList&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="driverconfig"&gt;DriverConfig&lt;/h3&gt;
&lt;p&gt;DriverConfig defines the driver configuration for the Engine.&lt;/p&gt;
&lt;p&gt;Exactly one driver must be specified.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Validation:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MinProperties: 0&lt;/li&gt;
&lt;/ul&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/v0.4/reference/api/#enginespec"&gt;EngineSpec&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;istio&lt;/code&gt; &lt;em&gt;&lt;a href="https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/reference/api/#istiodriverconfig"&gt;IstioDriverConfig&lt;/a&gt;&lt;/em&gt;&lt;/td&gt;
 &lt;td&gt;istio configures the Engine to integrate with Istio service mesh.&lt;/td&gt;
 &lt;td&gt;&lt;/td&gt;
 &lt;td&gt;MinProperties: 0 &lt;br /&gt;Optional: {} &lt;br /&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="engine"&gt;Engine&lt;/h3&gt;
&lt;p&gt;Engine represents an instance of a Web Application Firewall (WAF) engine.&lt;/p&gt;</description></item><item><title>Architecture</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/explanation/architecture/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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 rules from ConfigMaps 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/v0.4/tutorials/getting-started-kubernetes/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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/v0.4/howto/install-kubernetes-helm/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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 Gateway API CRDs&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="add-the-helm-repository"&gt;Add the Helm Repository&lt;/h2&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;h2 id="install-with-default-values"&gt;Install with Default Values&lt;/h2&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;h2 id="customize-the-installation"&gt;Customize the Installation&lt;/h2&gt;
&lt;p&gt;Override default values by passing a values file or individual settings:&lt;/p&gt;</description></item><item><title>Install on OpenShift via OperatorHub</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/howto/install-openshift-operatorhub/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/howto/install-openshift-operatorhub/</guid><description>&lt;p&gt;This guide covers installing the Coraza Kubernetes Operator on OpenShift Container Platform using the OperatorHub.&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;OpenShift Service Mesh or Istio installed with Gateway API support&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="install-from-operatorhub-web-console"&gt;Install from OperatorHub (Web Console)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Log in to the OpenShift web console as a cluster administrator.&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Operators &amp;gt; OperatorHub&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Search for &lt;strong&gt;Coraza Kubernetes Operator&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the operator tile and click &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose the update channel, installation mode, and approval strategy.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Install&lt;/strong&gt; and wait for the operator to reach the &lt;strong&gt;Succeeded&lt;/strong&gt; phase.&lt;/li&gt;
&lt;/ol&gt;
&lt;!-- TODO: Replace with the published CatalogSource details when available. --&gt;
&lt;h2 id="install-from-operatorhub-cli"&gt;Install from OperatorHub (CLI)&lt;/h2&gt;
&lt;p&gt;If the operator is available in your cluster&amp;rsquo;s default catalog, create a Subscription resource:&lt;/p&gt;</description></item><item><title>Creating Firewall Rules</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/howto/creating-firewall-rules/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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, stored in ConfigMaps, and aggregated by a RuleSet resource.&lt;/p&gt;
&lt;h2 id="writing-rules-in-configmaps"&gt;Writing Rules in ConfigMaps&lt;/h2&gt;
&lt;p&gt;Each ConfigMap must contain a key named &lt;code&gt;rules&lt;/code&gt; with SecLang directives as its value.&lt;/p&gt;
&lt;p&gt;A basic ConfigMap 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;v1&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;ConfigMap&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;data&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 ConfigMap 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/v0.4/tutorials/getting-started-openshift/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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;&lt;a href="https://docs.openshift.com/container-platform/latest/service_mesh/v2x/installing-ossm.html"&gt;OpenShift Service Mesh&lt;/a&gt; or Istio installed with Gateway API support&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;h2 id="step-1-install-the-operator"&gt;Step 1: Install the Operator&lt;/h2&gt;
&lt;p&gt;You can install the Coraza Kubernetes Operator using either the OpenShift web console or the CLI.&lt;/p&gt;</description></item><item><title>Helm Chart Values</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/reference/helm-values/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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.istio.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;Create the release namespace as a chart-managed resource with Pod Security Standard labels.&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/v0.4/explanation/rule-processing/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/explanation/rule-processing/</guid><description>&lt;p&gt;This page explains the lifecycle of firewall rules from ConfigMap to enforcement in the WASM plugin.&lt;/p&gt;
&lt;h2 id="rule-aggregation"&gt;Rule Aggregation&lt;/h2&gt;
&lt;p&gt;A RuleSet references an ordered list of ConfigMaps. Each ConfigMap must contain a key named &lt;code&gt;rules&lt;/code&gt; with SecLang directives as its value. The operator reads these ConfigMaps in the specified order and concatenates their contents to form a single rule body.&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/v0.4/howto/deploying-waf-engine/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/howto/deploying-waf-engine/</guid><description>&lt;p&gt;An Engine resource references a RuleSet and attaches the Coraza WAF to one or more Gateways 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 workload selector that matches 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;driver&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;istio&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;wasm&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;mode&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;workloadSelector&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;matchLabels&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;gateway.networking.k8s.io/gateway-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;ruleSetCacheServer&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;pollIntervalSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&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;workloadSelector&lt;/code&gt; determines which Gateway pods the WAF attaches to. Kubernetes Gateway API implementations typically label Gateway pods with &lt;code&gt;gateway.networking.k8s.io/gateway-name&lt;/code&gt;. Use the label that matches your Gateway:&lt;/p&gt;</description></item><item><title>kubectl-coraza CLI</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/reference/kubectl-coraza/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/reference/kubectl-coraza/</guid><description>&lt;p&gt;&lt;code&gt;kubectl-coraza&lt;/code&gt; is a kubectl plugin for generating Kubernetes manifests from OWASP CoreRuleSet files.&lt;/p&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 Kubernetes ConfigMaps, a Secret, and a RuleSet resource from CoreRuleSet rule files.&lt;/p&gt;
&lt;h4 id="required-flags"&gt;Required Flags&lt;/h4&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Flag&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;--rules-dir&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Directory containing CoreRuleSet &lt;code&gt;*.conf&lt;/code&gt; and optional &lt;code&gt;*.data&lt;/code&gt; files. The directory is not traversed recursively.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--version&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;CoreRuleSet version (e.g., &lt;code&gt;4.24.1&lt;/code&gt; or &lt;code&gt;v4.24.1&lt;/code&gt;). The leading &lt;code&gt;v&lt;/code&gt; is normalized automatically.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="optional-flags"&gt;Optional Flags&lt;/h4&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;-n&lt;/code&gt;, &lt;code&gt;--namespace&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;(none)&lt;/td&gt;
 &lt;td&gt;Set &lt;code&gt;metadata.namespace&lt;/code&gt; on all generated objects.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--ruleset-name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;default-ruleset&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Name of the generated RuleSet resource.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--data-secret-name&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;coreruleset-data&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Name of the generated Secret for &lt;code&gt;*.data&lt;/code&gt; files.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--ignore-rules&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;(none)&lt;/td&gt;
 &lt;td&gt;Comma-separated rule IDs to exclude from generated output.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--ignore-unsupported-rules&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;wasm&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Unsupported-rule profile to exclude. Set to &lt;code&gt;none&lt;/code&gt; to include all rules.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--ignore-pmFromFile&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Strip SecRule lines that use the &lt;code&gt;@pmFromFile&lt;/code&gt; directive.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--include-test-rule&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Append the X-CRS-Test rule block to the base-rules ConfigMap. Used by conformance tests.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--name-prefix&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;(none)&lt;/td&gt;
 &lt;td&gt;Prefix for generated ConfigMap names.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--name-suffix&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;(none)&lt;/td&gt;
 &lt;td&gt;Suffix for generated ConfigMap names.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--dry-run&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;(none)&lt;/td&gt;
 &lt;td&gt;Set to &lt;code&gt;client&lt;/code&gt; for preview output without cluster access.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;--skip-size-check&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;&lt;code&gt;false&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Allow oversized payloads. Not recommended &amp;ndash; etcd may still reject large objects.&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id="output"&gt;Output&lt;/h4&gt;
&lt;p&gt;The command writes YAML to stdout. Each generated object is separated by &lt;code&gt;---&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Istio WASM Integration</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/explanation/istio-wasm-integration/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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/v0.4/reference/operator-cli-flags/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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/v0.4/howto/using-coreruleset/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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 Kubernetes ConfigMaps and RuleSet resources 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/v0.4/reference/status-conditions/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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="ready"&gt;Ready&lt;/h3&gt;
&lt;p&gt;The Engine is deployed and attached to one or more Gateways.&lt;/p&gt;</description></item><item><title>Using Data Files with Rules</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/howto/using-data-files/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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 supports this through Secrets of type &lt;code&gt;coraza/data&lt;/code&gt;.&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;. To make this file available to the operator, store it in a Secret.&lt;/p&gt;</description></item><item><title>Configuring Failure Policies</title><link>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/howto/configuring-failure-policies/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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;driver&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;istio&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;wasm&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;mode&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;workloadSelector&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;matchLabels&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;gateway.networking.k8s.io/gateway-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;ruleSetCacheServer&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;pollIntervalSeconds&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;15&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/v0.4/explanation/known-limitations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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/v0.4/howto/monitoring-prometheus/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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/v0.4/explanation/security-model/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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;ConfigMaps, Secrets&lt;/td&gt;
 &lt;td&gt;get, list, watch&lt;/td&gt;
 &lt;td&gt;Read firewall rules and data files.&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 workload selectors.&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;list, watch&lt;/td&gt;
 &lt;td&gt;Discover Gateways for Engine status reporting.&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/v0.4/howto/upgrading/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://networking-incubator.github.io/coraza-kubernetes-operator/v0.4/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>