Best tools to control destructive Kafka operations
ComparisonsThe best tools to control destructive Kafka operations work at two layers: the broker, where delete.topic.enable, ACLs and a pluggable authorizer such as Apache Ranger or OPA decide what any client may do, and the workflow, where GitOps tools, Klaw and Kafka UIs with review steps decide whether a permitted change should run. No single tool covers both.
Apache Kafka itself gives you an on-off switch for topic deletion and an authorizer. Everything else on this page is built on top of those two, which is why the rubric starts with where a control enforces, not with how good its interface looks. For the wider governance picture, the complete Kafka guide and the page on stream governance cover the layers this page does not.
At a glance
Twelve options are scored here on this page's five weighted criteria, 90 points in all. The rubric is weighted: Review before execution counts three times, Record of the attempt counts three times, and Where it enforces, Granularity and Default posture count once. The five listed first, of twelve, each out of 90: Kpow 80, which takes its best score on Review before execution (10 out of 10) and its lowest on Where it enforces (2 out of 10); Klaw 73, License: Apache 2.0; Terraform with the Kafka provider 51; kafka-gitops and Julie Ops 51; Strimzi 48.
What counts as a destructive Kafka operation
A destructive Kafka operation is any change the cluster will carry out immediately and cannot reverse on its own: deleting a topic, deleting or truncating records, resetting a consumer group’s offsets, shrinking retention, or reassigning partitions to the wrong brokers. Each one is a single Admin API call, and Kafka’s authorizer answers each one with allow or deny, nothing in between.
Deleting a topic removes the log and every record in it. Resetting offsets leaves the data alone but moves a consumer group’s position, so a downstream service either replays weeks of events or skips them. Shortening retention.ms looks like a config edit and turns into data loss at the next log cleanup, hours after the change was approved. If you need the mechanics of removing data deliberately, Tom Crowley, Factor House’s founding engineer, walks through deleting records in Kafka with topic deletion, truncation and tombstones side by side. That is the diagnosis side of this job. This page is the choosing side.
Offset resets deserve their own mention because they are the destructive operation people do not think of as destructive. Chad Harris’s standing advice from the Kafka operational issues talk is to use latest in production and make offset resets a deliberate, manual operation. A control that treats an offset reset as a routine edit has missed half the problem. The tools for doing resets safely are compared in Kafka offset management tools, and topic create, delete and config tools in Kafka topic management tools.
Tools compared
Each cell says why, not just whether. “Tool-only” in the first column means the control does not stop a client that talks to the cluster directly.
| Rank | Option | Where it enforces | Review before execution | Granularity | Default posture | Record of the attempt | Source |
|---|---|---|---|---|---|---|---|
| 1 | Kpow | Tool-only | Yes. Any action can carry a Stage effect, and an admin who also holds that permission approves or denies it |
Per action (TOPIC_DELETE, TOPIC_TRUNCATE, GROUP_EDIT and so on) and per resource, with wildcard patterns |
Anything no policy allows is implicitly denied | Every request, approval and denial in the audit log, with webhook notifications | Kpow staged mutations |
| 2 | delete.topic.enable=false |
Broker. Deletion requests are rejected for every client | None. It is a switch, not a review | Topic deletion only, cluster-wide, all or nothing | Protection is off by default: delete.topic.enable defaults to true |
Rejected requests surface as client errors, nothing more | Apache Kafka broker configs |
| 3 | CreateTopicPolicy and AlterConfigPolicy | Controller. Validates create-topic and alter-config requests from any client | None. Code decides, no person does | Whatever your Java class checks, for creates and config changes only. There is no delete policy | Not set: both default to null | Rejections go back to the client. Logging is up to your class | Apache Kafka broker configs, KIP-108 |
| 4 | Klaw | Tool-only | Yes. Topic create, update and delete, and ACL requests, all go through approval | Per team and environment, with more than 35 permissions | Requests need an approver by design | Audit of all topic, ACL, schema and connector requests | Klaw |
| 5 | OPA authorizer plugin | Broker. Each request is sent to an OPA policy | None at request time. Policy changes can go through code review | Anything a Rego policy can express | Fail-closed if OPA is unreachable, by default | Whatever OPA decision logging you configure | opa-kafka-plugin |
| 6 | Native Kafka ACLs | Broker, through the configured authorizer | None | Per principal, operation and resource, with literal or prefixed patterns | Resources with no ACL are restricted to super users, unless allow.everyone.if.no.acl.found=true |
Denials logged at INFO to kafka-authorizer.log by default |
Apache Kafka authorization and ACLs |
| 7 | Apache Ranger Kafka plugin | Broker. Replaces the authorizer with Ranger's | None | Central policies across Kafka and the rest of the data stack | Depends on the policies you define | Ranger's centralised audit of access decisions | Apache Ranger, plugin source |
| 8 | Terraform with the Kafka provider | Tool-only | Yes, as plan review on a pull request | Per topic and ACL resource, plus prevent_destroy on critical topics |
Plans will destroy a removed resource unless prevent_destroy is set |
Git history and plan output | terraform-provider-kafka, Terraform lifecycle |
| 9 | kafka-gitops and Julie Ops | Tool-only | Yes, as a pull request | Topics, ACLs and derived service ACLs from a desired-state file | kafka-gitops has a --no-delete flag. Both projects are effectively unmaintained |
Git history | kafka-gitops, Julie Ops |
| 10 | Strimzi Topic and User Operators with GitOps | Tool-only for people who can still reach the cluster directly. Topics and ACLs are Kubernetes resources | Yes, as a pull request on the resource, if your repo requires review | Per topic and per user resource | Deleting a KafkaTopic deletes the topic, guarded by a finalizer while the operator runs | Git history of the resource | Strimzi deploying guide |
| 11 | Kafbat UI | Tool-only | None | RBAC per resource and action, plus a per-cluster read-only flag | Read-only is off by default | Audit to a Kafka topic or the console, alter operations only by default | Kafbat UI docs |
| 12 | AKHQ | Tool-only | None | Roles per resource type and action, scoped by regex patterns | Security is disabled by default, so an anonymous user has full access until you enable it | Opt-in audit events written to a Kafka topic you choose | AKHQ docs |
| 13 | Confluent Control Center | Confluent Platform components, through role bindings managed by the Metadata Service | None. A permission model, not a review step | Role bindings per resource, but its RBAC overview says "RBAC roles do not support DENY rules" | Not stated | Not stated for Control Center itself | Confluent's documentation, RBAC overview page |
| 14 | Conduktor Console | Tool-only | For cross-team access requests. Its docs say topic creation that passes policy needs no approval | Application ownership plus RBAC | Depends on setup | Console audit log, exportable from a Kafka topic | Conduktor's documentation, Self-service concepts page |
The pattern in the table is the point. The broker-level rows are the only ones that stop a direct kafka-topics.sh --delete, and none of them offers a human review. Every row that offers a review is tool-only. A production setup that takes destructive operations seriously uses one of each.
Kafka UIs and management platforms with role-based guardrails
Rank 1 Kpow
80 out of 90 Total
Try Kpow in the live demo No signup needed.
- Type
- Kafka UI
- Policy effects
- Allow, Deny or Stage
- Edition
- RBAC, staged mutations and audit log are Enterprise
- Where it enforces
- 2 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 10 out of 10
- Granularity
- 9 out of 10
- Default posture
- 9 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 10 out of 10
Why these scores for Kpow
- Where it enforces 2 out of 10
- It is tool-only, and the page says “a person who holds those credentials outside Kpow bypasses every staged mutation”.
- Review before execution 10 out of 10
- Any action can carry a Stage effect, including the GROUP_EDIT offset changes the page calls the overlooked destructive operation, and the approver must also hold the permission.
- Granularity 9 out of 10
- Policies are per action (TOPIC_DELETE, TOPIC_TRUNCATE, GROUP_EDIT) and per resource with wildcards, criterion 3 quotes Kpow RBAC as more granular than Kafka ACLs, and OPA ties.
- Default posture 9 out of 10
- Anything no policy allows is implicitly denied, and bulk actions are disabled by default.
- Record of the attempt 10 out of 10
- Every request, approval and denial is recorded in the audit log, with webhook notifications, matching criterion 5 word for word.
Kpow treats a destructive action as something to route rather than just permit or refuse.
How it controls destructive operations: an RBAC policy can give any action one of three effects: Allow, Deny or Stage. A staged action does not run. It becomes a request that an admin reviews under Settings, and the staged mutations documentation is specific that the admin approving it “must also be allowed to invoke” the same mutation, so an approver cannot sign off on something they could not have done themselves. A webhook can notify the right channel when a request arrives, and the full history of approvals and denials lands in the audit log. Where multiple policies apply to one resource, Deny wins, and where no policy matches, the action is implicitly denied. Bulk actions, such as deleting 300 topics in one request, are disabled by default and need both BULK_ACTION and the underlying permission, so you can let someone delete a topic without letting them delete a hundred. Temporary policies cover the break-glass case: an admin grants an elevated action for a fixed window, capped at seven days by default, and cannot grant anything above their own permissions.
Where it falls short: it is a tool-only control, like every workflow option here. Kpow’s own Kafka credentials need enough ACLs to do what its users are allowed to do, so a person who holds those credentials outside Kpow bypasses every staged mutation. Pair it with broker ACLs that keep human principals away from Delete and Alter. Kpow also has no config guardrails of its own for retention floors or partition limits, and an AlterConfigPolicy on the controller is the place for that today.
Staying patched: Kpow’s release notes name the CVEs each release remediates, and the 96.4 image built on 5 August 2026 bundles 311 dependencies of which one carries a high or critical advisory, none of them published before that release. That is not a claim to patch faster than a community project: Kpow’s own dependency remediation has run from 14 to 128 days, and the current image still ships CVE-2026-75595 in netty, a 9.1 critical public since 19 August 2026, unpatched. What a licence buys here is not a different deployment model, because Kpow is self-hosted too. It is a company contracted to ship the fix. Every dependency figure on this page was read on 24 September 2026 from the published artefacts and from nvd.nist.gov.
Compare Kpow vs AKHQKpow vs Kafbat UI
Rank 2 73 out of 90 Total
- Type
- Self-service governance portal
- License
- Apache 2.0
- Permissions
- More than 35, per team and environment
- Where it enforces
- 2 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 9 out of 10
- Granularity
- 8 out of 10
- Default posture
- 9 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 9 out of 10
Why these scores for Klaw
- Where it enforces 2 out of 10
- The control is tool-only, and the page says “it governs requests made through Klaw”.
- Review before execution 9 out of 10
- Topic create, update and delete, and ACL requests all go through approval, and the page names no offset-reset approval, which Kpow’s any-action Stage covers.
- Granularity 8 out of 10
- Permissions are per team and environment, more than 35 of them, and environments enforce naming prefixes and suffixes.
- Default posture 9 out of 10
- Requests need an approver by design.
- Record of the attempt 9 out of 10
- It keeps an audit of all topic, ACL, schema and connector requests, and also reconciles the cluster and emails differences.
What it is: an open-source, Apache 2.0 self-service governance portal.
How it controls destructive operations: its README lists topic create, update, delete and promote, and ACL create and delete, as approval workflows, with more than 35 configurable permissions, environments that enforce naming prefixes and suffixes, and an audit of every request. It also reconciles the cluster against its own records and emails differences.
Where it falls short: it governs requests made through Klaw. Klaw is maintained under the Aiven-Open GitHub organisation.
Staying patched: Klaw is Apache-2.0 under Aiven, with a published security policy and the patch record to match it. Three CVEs, and the fix shipped the same day for CVE-2026-25999 in February 2026 and the next day for the two published in May 2026. Seven releases in two years, most recently v2.10.6 in September 2026. Community-maintained is not the same as unmaintained, and this is the end of that range where it shows.
Rank 9 Kafbat UI
27 out of 90 Total
- Type
- Open-source Kafka UI
- License
- Apache 2.0
- Latest release
- v1.5.0
- Where it enforces
- 2 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 0 out of 10
- Granularity
- 7 out of 10
- Default posture
- 3 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 5 out of 10
Why these scores for Kafbat UI
- Where it enforces 2 out of 10
- It is tool-only.
- Review before execution 0 out of 10
- There is none, and the page says “no review step”.
- Granularity 7 out of 10
- RBAC is per resource and action, though the read-only flag is all or nothing for a cluster.
- Default posture 3 out of 10
- Read-only is off by default.
- Record of the attempt 5 out of 10
- Audit is written to a Kafka topic or the console, alter operations only by default.
What it is: the actively maintained fork of the original kafka-ui project, Apache 2.0, latest release v1.5.0.
How it controls destructive operations: per-cluster read-only: true prevents write operations from the UI, and its RBAC grants actions per resource, including ACL view and edit. Its audit log writes to a topic or the console, and the default level logs alter operations only.
Where it falls short: no review step, and the read-only flag is all or nothing for a cluster.
Staying patched: Kafbat UI released v1.5.0 in April 2026 and has not shipped since. In the 157 days since, at least 20 high or critical advisories have been published against libraries that release bundles, including the same netty critical CVE-2026-75595 that the current Kpow image carries. Only 150 of its 266 bundled jars resolved to a Maven coordinate, so that count is a floor and the state of the release itself is unmeasured. Kafbat does publish a security policy, which AKHQ and Kafdrop do not, and the one CVE filed against its own code, CVE-2025-49127, was already fixed in the release that preceded the advisory. Six releases in two years.
Compare Kpow vs Kafbat UIAKHQ vs Kafbat UIConduktor vs Kafbat UIKafbat UI review
Rank 10 AKHQ
22 out of 90 Total
- Type
- Open-source Kafka UI
- License
- Apache 2.0
- Latest release
- 0.28.0, August 2026
- Where it enforces
- 1 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 0 out of 10
- Granularity
- 8 out of 10
- Default posture
- 1 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 4 out of 10
Why these scores for AKHQ
- Where it enforces 1 out of 10
- It is tool-only, and without the JWT signing secret, group restrictions apply in the UI only and the API does not enforce them.
- Review before execution 0 out of 10
- It has none, and the page’s own prose says “no review step”.
- Granularity 8 out of 10
- Roles are per resource type and action (DELETE, UPDATE_OFFSET), scoped by regex patterns.
- Default posture 1 out of 10
- Security is disabled by default and the anonymous user has full access, and a reader default group is possible but opt-in.
- Record of the attempt 4 out of 10
- Audit events to a Kafka topic are opt-in, and the page says “reading the trail is something you build”.
What it is: an open-source Kafka UI, Apache 2.0, latest release 0.28.0 in August 2026.
How it controls destructive operations: groups bind roles to resource types (topics, topic data, consumer groups, connectors, schemas, ACLs) and actions such as DELETE and UPDATE_OFFSET, with regex patterns scoping which resources a group can touch. Its authentication docs say that by default security is disabled and anonymous users have full access, and that setting the default group to reader gives you a read-only application. Its group docs also warn that if the JWT signing secret is not set, group restrictions apply in the UI only and the API does not enforce them.
Where it falls short: no review step, and audit is an opt-in stream of events to a Kafka topic, so reading the trail is something you build.
Staying patched: AKHQ has no CVE filed against its own code, and that is the wrong number to plan against. Release 0.28.0, cut on 6 August 2026, bundles 270 libraries and 18 of them carry a high or critical advisory. Sixteen were already public, with fixed versions already on Maven Central, on the day it shipped, and five are netty advisories Kpow had remediated three weeks earlier in 96.2: CVE-2026-44249, CVE-2026-45416, CVE-2026-45674, CVE-2026-47691 and CVE-2026-50010. The oldest has been open 108 days. That is exposure and remediation latency rather than a working attack, and every figure resolves against the published jar and nvd.nist.gov. Four releases in two years, and no security policy at any path GitHub reads.
Confluent Control Center
confluent.io
17 out of 90 Total
- Type
- Management UI
- Scope
- Confluent Platform only
- Control model
- Role bindings from the Metadata Service
- Where it enforces
- 4 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 0 out of 10
- Granularity
- 5 out of 10
- Default posture
- 2 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 2 out of 10
Why these scores for Confluent Control Center
- Where it enforces 4 out of 10
- Role bindings are held by the Metadata Service rather than by Control Center itself, so it reaches further than the tool-only rows, and the page does not say it stops a client that talks to the cluster directly, so it stays below every broker row.
- Review before execution 0 out of 10
- It has none, and the page describes a permission model only, with no approval step between a permitted destructive request and the cluster.
- Granularity 5 out of 10
- Role bindings are per resource, but its own RBAC overview says “RBAC roles do not support DENY rules”, so a delete cannot be carved out of a broader role the way Kpow’s per-action Deny or a Rego policy can.
- Default posture 2 out of 10
- The page states nothing about what Control Center allows before anyone configures roles, so this is scored low on absent evidence rather than a documented open default.
- Record of the attempt 2 out of 10
- The page names no audit record of destructive actions taken in Control Center, so this is scored low on absent evidence. Confluent Server’s own audit logs are a separate broker-side option, scored on the Kafka audit logging tools comparison.
What it is: the management UI for Confluent Platform.
How it controls destructive operations: through Confluent’s RBAC, which Confluent’s documentation, RBAC overview page, describes as role bindings managed by the Metadata Service. The same page states that “RBAC roles do not support DENY rules”, which matters when you want to carve a delete permission out of a broader role.
Where it falls short: it applies to Confluent Platform deployments.
Compare Kpow vs Confluent Control CenterAKHQ vs Confluent Control CenterConfluent Control Center review
Rank 12 Conduktor Console
conduktor.io
46 out of 90 Total
- Type
- Commercial Kafka console
- Approval covers
- Cross-team access requests
- Where it enforces
- 2 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 4 out of 10
- Granularity
- 6 out of 10
- Default posture
- 5 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 7 out of 10
Why these scores for Conduktor Console
- Where it enforces 2 out of 10
- Its control is tool-only.
- Review before execution 4 out of 10
- Review covers cross-team access requests only, and topic creation that passes policy “is a direct API call” with no approval.
- Granularity 6 out of 10
- It has application ownership plus RBAC, with policies that constrain requests.
- Default posture 5 out of 10
- It depends on setup.
- Record of the attempt 7 out of 10
- The console audit log is exportable from a Kafka topic.
What it is: a commercial Kafka console.
How it controls destructive operations: Conduktor’s documentation, Self-service concepts page, describes application ownership, policies that constrain requests, cross-team access requests approved by the owning team, and every change going into Git. The same page says topic creation that passes policy “is a direct API call” with no approval workflow.
Where it falls short on this rubric: the review step covers access requests between teams rather than every destructive action.
Access control and governance tools
Rank 6 Apache Ranger
45 out of 90 Total
- Type
- Central security policy and audit
- Enforced on
- Broker, replaces the authorizer
- Where it enforces
- 10 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 0 out of 10
- Granularity
- 6 out of 10
- Default posture
- 5 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 8 out of 10
Why these scores for Apache Ranger
- Where it enforces 10 out of 10
- It enforces at the broker, replacing the authorizer with Ranger’s, one of the broker-level rows that stop a direct delete.
- Review before execution 0 out of 10
- There is none, and the page says “it has no review step”.
- Granularity 6 out of 10
- Policies are central across Kafka and the rest of the data stack, and the page states no finer action model.
- Default posture 5 out of 10
- It depends on the policies you define.
- Record of the attempt 8 out of 10
- Ranger’s centralised audit records access decisions.
What it is: an Apache framework for central security policy and audit across a data platform, with a Kafka plugin that implements Kafka’s Authorizer interface.
How it controls destructive operations: the same policy console that governs HDFS or Hive governs topic and consumer group permissions, and Ranger centralises auditing of access decisions.
Where it falls short: it is a large system to run for Kafka alone, and it has no review step.
Staying patched: Apache Ranger is Apache-2.0 and actively developed, with a published security policy, and it carries the exposure of a large, long-lived project: an NVD keyword search returns 36 CVEs across its history. It publishes tags rather than GitHub releases, so the build you run is one you cut and patch yourself.
Rank 7 Open Policy Agent
44 out of 90 Total
- Type
- Broker authorizer plugin
- Requires
- Kafka 3.8.0 or later
- Latest release
- v1.5.1, March 2023
- Where it enforces
- 10 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 1 out of 10
- Granularity
- 9 out of 10
- Default posture
- 7 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 5 out of 10
Why these scores for Open Policy Agent
- Where it enforces 10 out of 10
- It enforces at the broker, with each request sent to an OPA policy, one of the broker-level rows that stop a direct delete.
- Review before execution 1 out of 10
- There is none at request time, though policy changes can go through code review, and nothing pauses a request for a person.
- Granularity 9 out of 10
- A Rego policy can express anything, so you can deny DeleteTopics by naming rule or allow it only in a maintenance window.
- Default posture 7 out of 10
- It is fail-closed if OPA is unreachable, by default.
- Record of the attempt 5 out of 10
- Decision logging is whatever you configure in OPA.
What it is: a broker plugin that sends each authorization decision to an OPA policy written in Rego. The plugin README lists Kafka 3.8.0 or later and a default of fail-closed when OPA cannot be reached: authorizer.class.name=org.openpolicyagent.kafka.OpaAuthorizer and opa.authorizer.allow.on.error=false.
How it controls destructive operations: you can deny DeleteTopics for any topic matching a naming rule, or allow it only in a maintenance window, because policy is code.
Where it falls short: the plugin’s last release was v1.5.1 in March 2023, and nothing in it pauses a request for a person to look at.
Staying patched: Open Policy Agent is Apache-2.0, actively maintained, with a published security policy and three repository advisories, most recently CVE-2025-46569 in May 2025, a high-severity Rego injection through the Data API path. The project has produced its own fixes, but nobody is contracted to produce the next one.
Rank 8 Native Kafka ACLs
43 out of 90 Total
- Type
- Built-in authorization
- Enforced on
- Broker
- No matching ACL
- Super users only, by default
- Where it enforces
- 10 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 0 out of 10
- Granularity
- 7 out of 10
- Default posture
- 8 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 6 out of 10
Why these scores for Native Kafka ACLs
- Where it enforces 10 out of 10
- It enforces at the broker, through the configured authorizer, and the page says “the broker-level rows are the only ones that stop a direct kafka-topics.sh --delete”.
- Review before execution 0 out of 10
- There is none, and ACLs know who is asking, not whether this request is sensible.
- Granularity 7 out of 10
- ACLs are per principal, operation and resource, literal or prefixed, and criterion 3 says Kpow RBAC is more granular than Kafka ACLs.
- Default posture 8 out of 10
- Resources with no ACL are restricted to super users unless allow.everyone.if.no.acl.found=true.
- Record of the attempt 6 out of 10
- Denials are logged at INFO to kafka-authorizer.log by default, denials only, in a broker log.
What it is: Kafka’s built-in authorization, managed with kafka-acls.sh or the Admin API.
How it controls destructive operations: restrict the Delete and Alter operations on topics, and Delete on consumer groups, to a small set of principals, ideally a break-glass service account that no person uses day to day. Any resource without a matching ACL is restricted to super users unless you set allow.everyone.if.no.acl.found=true. Leave that at its default of false in production.
Where it falls short: ACLs know who is asking, not whether this request is sensible, so a principal that holds Delete can delete anything its pattern covers. The Kafka ACL page has the copy-paste commands.
GitOps and infrastructure as code
Terraform with the Kafka provider
51 out of 90 Total
- Type
- Community Terraform provider
- Latest release
- v0.13.1
- Where it enforces
- 2 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 8 out of 10
- Granularity
- 7 out of 10
- Default posture
- 3 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 5 out of 10
Why these scores for Terraform with the Kafka provider
- Where it enforces 2 out of 10
- Enforcement is tool-only, and prevent_destroy only protects against Terraform.
- Review before execution 8 out of 10
- Yes, it is plan review on a pull request.
- Granularity 7 out of 10
- It is per topic and ACL resource, plus prevent_destroy on critical topics.
- Default posture 3 out of 10
- Plans will destroy a removed resource unless prevent_destroy is set.
- Record of the attempt 5 out of 10
- Git history and plan output are the record.
What it is: the community Mongey/terraform-provider-kafka, with kafka_topic and kafka_acl resources, latest release v0.13.1.
How it controls destructive operations: plan review on a pull request, and Terraform’s lifecycle setting on the resources you cannot afford to lose: lifecycle { prevent_destroy = true }. Terraform’s documentation describes prevent_destroy as causing Terraform to reject any plan that would destroy the resource.
Where it falls short: prevent_destroy only protects against Terraform, and the setting disappears if someone deletes the resource block along with it.
Staying patched: The Mongey Terraform Kafka provider is MIT. The repository was last pushed in August 2026 but it has not cut a release in 367 days, since v0.13.1 in September 2025, so anything fixed on its main branch is not in the provider you download.
kafka-gitops and Julie Ops
github.com/devshawn/kafka-gitops, github.com/kafka-ops/julie
51 out of 90 Total
- Type
- Desired-state GitOps tools
- Status
- Effectively unmaintained
- Where it enforces
- 2 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 8 out of 10
- Granularity
- 6 out of 10
- Default posture
- 4 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 5 out of 10
Why these scores for kafka-gitops and Julie Ops
- Where it enforces 2 out of 10
- They are tool-only.
- Review before execution 8 out of 10
- Yes, as a pull request, and the page says Julie Ops disables direct pushes to master.
- Granularity 6 out of 10
- Topics, ACLs and derived service ACLs are read from a desired-state file.
- Default posture 4 out of 10
- The --no-delete flag in kafka-gitops is opt-in, and Julie Ops states none.
- Record of the attempt 5 out of 10
- Git history is the record.
What they are: desired-state tools for topics and ACLs. kafka-gitops generates the ACLs a Kafka Streams or Connect service needs from a service definition and has a --no-delete flag. Julie Ops documents a pull-request change process with direct pushes to master disabled.
Where they fall short: kafka-gitops last released in February 2021, and Julie Ops’ maintainer describes the project as in “hibernation”. Kafka Security Manager, a Conduktor-sponsored open-source ACL controller that reverts ACLs added outside its source of truth, sits in the same category, and its last release was in January 2022.
Staying patched: kafka-gitops is Apache-2.0, last released 0.2.15 in February 2021 and last pushed in April 2023. JulieOps is MIT, last released v4.4.1 in October 2022 and last pushed in June 2024, with its own README describing the project as in hibernation. Nothing in either is being patched, so every advisory against what they bundle is yours to carry.
Rank 5 Strimzi
48 out of 90 Total
- Type
- Kubernetes operator (CNCF)
- Resources
- KafkaTopic, KafkaUser
- Where it enforces
- 2 out of 10
- Review before execution ×3 weight, this criterion counts 3 times toward the total
- 7 out of 10
- Granularity
- 6 out of 10
- Default posture
- 4 out of 10
- Record of the attempt ×3 weight, this criterion counts 3 times toward the total
- 5 out of 10
Why these scores for Strimzi
- Where it enforces 2 out of 10
- It is tool-only for people who can still reach the cluster directly, and anyone with direct cluster access bypasses it.
- Review before execution 7 out of 10
- Yes, as a pull request on the resource, if your repo requires review.
- Granularity 6 out of 10
- It is per topic and per user resource.
- Default posture 4 out of 10
- Deleting a KafkaTopic deletes the topic, guarded by a finalizer while the operator runs.
- Record of the attempt 5 out of 10
- Git history of the resource records merged changes, not denied attempts.
What it is: the CNCF operator for running Kafka on Kubernetes, with a Topic Operator for KafkaTopic resources and a User Operator for KafkaUser resources and their ACLs.
How it controls destructive operations: topics and ACLs become resources in Git, so changes arrive as reviewed pull requests. The Topic Operator adds a finalizer so that deleting a KafkaTopic is processed properly, and Strimzi’s deploying guide notes that if you set delete.topic.enable=false those finalizers are never removed by the operator.
Where it falls short: deleting the KafkaTopic resource deletes the topic, so the guard is your review process, and anyone with direct cluster access bypasses it.
Staying patched: Strimzi is community-maintained under the CNCF and it answers the patching question better than most vendors do. Thirty-eight releases in two years, six published CVEs, each with a coordinated-disclosure advisory, and on the last three batches the fixed release shipped the same day the advisory was published: 0.49.1 in December 2025, 0.50.1 in February 2026 and 1.0.1 in June 2026. Open source is not the risk here. The absence of a contract is, and Strimzi shows how little that has cost so far.
Mutation interceptors and proxies
Kafka’s only built-in request interceptors are the two policy plugins, set on the controller:
create.topic.policy.class.name=com.example.TopicCreatePolicy
alter.config.policy.class.name=com.example.AlterConfigPolicy
Apache Kafka’s broker config reference says both “run on the controller instead of the broker”. A create-topic policy can enforce replication factor and naming. An alter-config policy can refuse a retention.ms below a floor, which is the one config-level destructive change a broker-side plugin can actually block. There is no delete-topic policy. KIP-170 proposed one and is marked retired, superseded by KIP-201, which is still under discussion. For deletes, your broker-side options are delete.topic.enable, ACLs, or a custom or third-party authorizer such as Ranger or OPA.
How Factor House approaches it
Kpow treats a destructive action as something to route rather than just permit or refuse. An RBAC policy can give any action one of three effects: Allow, Deny or Stage. A staged action does not run. It becomes a request that an admin reviews under Settings, and the staged mutations documentation is specific that the admin approving it “must also be allowed to invoke” the same mutation, so an approver cannot sign off on something they could not have done themselves. A webhook can notify the right channel when a request arrives, and the full history of approvals and denials lands in the audit log.
policies:
- resource: ["cluster", "*", "group", "payments_*"]
effect: "Stage"
actions: ["GROUP_EDIT"]
role: "kafka-users"
- resource: ["cluster", "*"]
effect: "Allow"
actions: ["GROUP_EDIT"]
role: "kafka-admins"
That example, adapted from the RBAC documentation, makes offset changes on payments groups a two-person operation for everyone outside the admin role. Where multiple policies apply to one resource, Deny wins, and where no policy matches, the action is implicitly denied. Bulk actions, such as deleting 300 topics in one request, are disabled by default and need both BULK_ACTION and the underlying permission, so you can let someone delete a topic without letting them delete a hundred. Temporary policies cover the break-glass case: an admin grants an elevated action for a fixed window, capped at seven days by default, and cannot grant anything above their own permissions.
Kpow does not win on every point of this rubric. It is a tool-only control, like every workflow option here. Kpow’s own Kafka credentials need enough ACLs to do what its users are allowed to do, so a person who holds those credentials outside Kpow bypasses every staged mutation. Pair it with broker ACLs that keep human principals away from Delete and Alter. Kpow also has no config guardrails of its own for retention floors or partition limits. Tom was direct about that with Factor House’s own team: “We don’t offer retention + configuration guardrails”. An AlterConfigPolicy on the controller is the place for that today. Multi-tenancy does add a narrower guardrail, because a user inside a tenant can only create resources that fall within that tenant’s prefixes or suffixes.
The same Stage effect works in Flex for Apache Flink. The Flex staged mutations documentation shows FLINK_JOB_EDIT staged for a users role, so editing or cancelling a running job goes through the same request, review and audit path. For how tenancy, RBAC and staged approvals fit together across teams, see Kpow multi-tenancy.
To see where these controls apply, open the Kpow demo and explore the topic, consumer group and ACL screens on a live cluster, then decide which actions on them your own roles should get as Allow, Deny or Stage.
Kpow live demo
Try approval-gated Kafka changes
Explore Kpow in a live environment and see the destructive operations that staged mutations can hold for approval.
For platform and security teams who have to show who can do what.
Try the Kpow demoFAQ
Can I stop a Kafka topic from being deleted at the broker?
Yes. Set delete.topic.enable=false on every broker, and deletion requests are rejected for all clients. It is a read-only broker setting, so changing it needs a restart, and it blocks legitimate deletes too. For selective protection, deny the Delete operation with ACLs or a custom authorizer instead.
Does RBAC in a Kafka UI stop someone deleting a topic from the CLI?
No. A UI’s RBAC only governs requests made through that UI. The broker only sees the credentials on the connection, so the CLI path is closed by broker ACLs, delete.topic.enable, or an authorizer such as Ranger or OPA.
What is the difference between a staged mutation and an ACL?
An ACL decides whether a principal may run an operation at all, and the broker answers immediately. A staged mutation takes an operation the user is allowed to request and holds it until an admin who also holds that permission approves or denies it, with the decision recorded in the audit log.
Is there a Kafka policy plugin that blocks topic deletion?
Not in Apache Kafka. CreateTopicPolicy and AlterConfigPolicy exist, and a proposed delete policy in KIP-170 was retired without shipping. Deletes are controlled with delete.topic.enable, ACLs, or a replacement authorizer.
How these tools were scored
Every option below is scored on the same five criteria, in this order. The figure above separates the two kinds of control, because most tools on this page are one or the other and the difference decides what they can catch.
1. Where it enforces. A control on the broker or controller holds for every client, including a shell on a jump host with admin credentials. A control inside a tool holds only for requests that go through that tool, which makes this criterion more important than any feature list. In the same talk Chad Harris described how even teams running CI and automated GitOps keep a break-glass path for changing broker config directly when something is on fire, and the change that goes in through that door does not always make it back into GitOps. Every workflow tool on this page has that side door, and the broker-level controls are what close it.
2. Review before execution. Does a second person see the specific request before it runs? A permission check cannot do this, because it only knows who is asking. A pull request, a Klaw request or a staged mutation can.
3. Granularity. Can you allow a topic config change but deny a topic delete, or allow offset resets only on groups with a given prefix? Tom Crowley, Factor House’s founding engineer, has put the difference plainly when explaining Kpow to customers: Kafka ACLs govern what a principal can do on the cluster, and Kpow’s own RBAC is “much more granular and work[s] across all resources configured (ksql, connect, schema etc) - unlike Kafka’s ACLs”. The finer the action model, the less you have to take away to block the dangerous part.
4. Default posture. What happens before anyone configures anything? A tool that ships wide open turns every new deployment into a destructive-operations risk until someone notices. Chad Harris set up Factor House’s own AWS accounts with a read-only role for exactly this reason, so he could, in his words at the time, “fearlessly inspect the environment state and reverse engineer some terraform, without fear of deleting everything”. Read-only by default is the posture to look for.
5. Record of the attempt. When a destructive request is approved, denied or blocked, is there a record with the user, the request and the outcome? A denial nobody can see does not help the next review. Kafka audit logging tools compares where those records can come from.
Every option is scored from 0 to 10 on each criterion, from the evidence and sources this page cites, and the reason for each score is on its card. The criteria are weighted: Where it enforces counts once, Review before execution counts three times, Granularity counts once, Default posture counts once and Record of the attempt counts three times, for a total out of 90. Review before execution and Record of the attempt count three times here, because a destructive operation nobody approved and nobody logged is the one you find out about from a customer. Where it enforces, granularity and default posture count once, and the first of those is where the tool-only options on this page are weakest. This page is published by Factor House, which makes Kpow. Every option is scored on the same rubric and the same sources: Kpow's per-criterion scores are set the same way as every other option's and are not adjusted, and the weights apply to every option alike. Kpow ranks first on its total of 80 out of 90. The other options follow by total. Conduktor Console is listed last whatever its total; on its total of 46 it would place sixth.