fix: pin a Kafka version the operator supports, and add the API's producer

Strimzi 1.2.0 supports 4.2.0 through 4.3.1; the manifest still asked for 4.1.0,
so the cluster sat NotReady with the reason only visible in the Kafka CR's
status — the operator logs said nothing. Pinned to 4.3.1, and metadataVersion
removed rather than guessed: the operator derives it, and a stale spelling there
is the same failure one release later.

Adds a KafkaUser for classic-models-api: Write and Describe on the
classic-models. prefix, and no Read. It publishes domain events and consumes
nothing, and a producer that can read every topic exfiltrates every other
domain's events if it is ever compromised.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Stéphane Tailland
2026-08-30 16:12:30 +02:00
parent e99cc49b8a
commit 5fad740b7f
4 changed files with 37 additions and 5 deletions
+2 -2
View File
@@ -16,8 +16,8 @@ GROUP ?= my-group
MAX ?= 10 MAX ?= 10
PARTITIONS ?= 1 PARTITIONS ?= 1
REPLICAS ?= 1 REPLICAS ?= 1
KAFKA_VER ?= 4.1.0 KAFKA_VER ?= 4.3.1
METADATA_VER ?= 4.1-IV0 METADATA_VER ?= 4.3-IV0
KUBECTL := kubectl -n $(NAMESPACE) KUBECTL := kubectl -n $(NAMESPACE)
KEXEC := $(KUBECTL) exec $(BROKER) -- KEXEC := $(KUBECTL) exec $(BROKER) --
+7 -1
View File
@@ -9,7 +9,7 @@ Single-broker Kafka cluster for dev/test, deployed via the [Strimzi](https://str
``` ```
kafka namespace kafka namespace
├── strimzi-cluster-operator Strimzi operator — reconciles Kafka/KafkaUser/KafkaTopic CRs ├── strimzi-cluster-operator Strimzi operator — reconciles Kafka/KafkaUser/KafkaTopic CRs
├── kafka-dual-role-0 Kafka 4.1.0 broker (KRaft, controller + broker in one pod) ├── kafka-dual-role-0 Kafka 4.3.1 broker (KRaft, controller + broker in one pod)
└── kafka-entity-operator Topic Operator + User Operator (manages topics and users) └── kafka-entity-operator Topic Operator + User Operator (manages topics and users)
``` ```
@@ -40,6 +40,12 @@ kafka-kafka-bootstrap.kafka.svc.cluster.local:9093
|---|---|---| |---|---|---|
| `kafka-admin` | `kafka-admin` | Super user — unrestricted access | | `kafka-admin` | `kafka-admin` | Super user — unrestricted access |
| `kafka-client` | `kafka-client` | Application user — Read/Write all topics and groups | | `kafka-client` | `kafka-client` | Application user — Read/Write all topics and groups |
| `classic-models-api` | `classic-models-api` | Producer for `classic-models.*` — **Write and Describe only**, no Read |
`classic-models-api` publishes domain events and consumes nothing, so it is
write-only and prefix-scoped. A producer that can also read every topic is a
producer that exfiltrates every other domain's events if it is ever
compromised.
Strimzi stores credentials in Kubernetes secrets. Each secret contains two keys: Strimzi stores credentials in Kubernetes secrets. Each secret contains two keys:
- `password` — the SCRAM password - `password` — the SCRAM password
+27
View File
@@ -52,3 +52,30 @@ spec:
operations: operations:
- Describe - Describe
- Write - Write
---
# The classic-models API, which publishes domain events and consumes nothing.
#
# Write-only and topic-scoped: a producer that can also read every topic is a
# producer that can exfiltrate every other domain's events if it is ever
# compromised. Describe is needed for metadata; it does not grant reads.
apiVersion: kafka.strimzi.io/v1
kind: KafkaUser
metadata:
name: classic-models-api
namespace: kafka
labels:
strimzi.io/cluster: kafka
spec:
authentication:
type: scram-sha-512
authorization:
type: simple
acls:
- resource:
type: topic
name: classic-models.
patternType: prefix
operations:
- Write
- Describe
+1 -2
View File
@@ -36,8 +36,7 @@ metadata:
strimzi.io/kraft: enabled strimzi.io/kraft: enabled
spec: spec:
kafka: kafka:
version: 4.1.0 version: 4.3.1
metadataVersion: "4.1-IV0"
listeners: listeners:
- name: tls - name: tls
port: 9093 port: 9093