Monedula

本页由英文机器翻译而成。 阅读原文

monedula-acl-rbac-converter v0.10.0, AGPL-3.0

把 Kafka ACL 迁移到 RBAC,并验证访问权限

monedula-acl-rbac-converter 从 ACL 所在的任何地方读取你的 Kafka ACL,规划等效的 Confluent RBAC 角色绑定并加以应用,然后向 MDS 确认每一项原有权限是否仍然成立。只有在这之后,它才会写出删除旧 ACL 的脚本。

Go
go install github.com/monedula-dev/monedula-acl-rbac-converter/cmd/monedula-acl-rbac@latest
runs/<timestamp>/plan.json(节选)
{
  "schema_version": "1",
  "bindings": [
    {
      "id": "rb-b6fac2ae9aa0",
      "action": "CREATE",
      "principal": "User:svc-analytics",
      "role": "DeveloperRead",
      "scope": { "kafka_cluster": "lkc-demo-1" },
      "resource_patterns": [
        { "resource_type": "Topic", "name": "events.", "pattern_type": "PREFIXED" }
      ],
      "source_acl_ids": [11, 12]
    }
  ]
}
终端
RUN=runs/2026-05-21T10-00-00Zmonedula-acl-rbac extract --from text --input acls.txt --out $RUN/acls.jsonmonedula-acl-rbac plan --acls $RUN/acls.json --rules rules.yaml --principals principals.yaml --scopes scopes.yaml --out $RUN/plan.jsonmonedula-acl-rbac auth login --mds-url https://mds.example.commonedula-acl-rbac apply --plan $RUN/plan.json --mds-url https://mds.example.com --confirmmonedula-acl-rbac verify --plan $RUN/plan.json --mds-url https://mds.example.com# exit 0: every source ACL is still allowed; exit 5: some access is missing or unknown

plan.json 节选,来自仓库中的 examples/text-dump/expected/。

问题所在

ACL 与 RBAC 并非一一对应。

把现有集群迁移到 Confluent RBAC,意味着要把每一条 ACL 变成角色绑定。有些 ACL(例如 DENY 规则)根本不应被转换,有些匹配不到任何映射规则,而一条绑定也可能顺利应用却什么权限都不授予。如果手工完成,其中每一种情况都会悄无声息地失败。

9
ACL 来源,从运行中的集群到 Strimzi 和 CFK 清单
3
交付绑定的方式:shell 脚本、CFK 清单、MDS curl
~10k
每次运行处理的 ACL 数量,全部保存在内存中

工作原理

  1. 01

    提取 extract

    从九种来源中的任意一种读取 ACL,生成规范化的 acls.json。

  2. 02

    规划 plan

    用可覆盖的默认规则把它们映射为角色绑定,再由你阅读 report.txt。

  3. 03

    应用 apply

    在 MDS 中创建绑定。没有 --confirm,什么都不会改变。

  4. 04

    验证 verify

    向 MDS 确认每一项原有权限是否仍被允许。

  5. 05

    清理 delete-acls

    生成删除脚本及其回滚脚本,然后由你亲自运行。

  1. 源 ACL 运行中的集群;kafka-acls 转储;JSON、YAML、CSV;Strimzi;CFK;Kubernetes
  2. plan.json 每条 ACL 都已映射、未映射或被拒绝;带校验和
  3. 路径 A:apply 应用到 MDS,然后验证有效访问
    路径 B:emit 脚本,CFK 清单,MDS curl,交给你的流水线
  4. 清理 ACL 一份由你检查并运行的删除脚本
源 ACL 变成一份带校验和的计划;在旧 ACL 被清理之前,这份计划会被应用到 MDS,或输出给你的流水线。

有效访问,经过验证

verify 会针对每一条源 ACL 询问 MDS:原有的 principal、操作和资源现在是否真的被允许,而不只是检查是否存在一条绑定记录。集群 ID 不匹配时,生成的绑定能顺利应用,却什么权限也不授予;正是这项检查能发现这种问题。

终端
monedula-acl-rbac verify \
  --plan runs/2026-05-21T10-00-00Z/plan.json \
  --mds-url https://mds.example.com \
  --mds-token-file ~/.confluent/token

每条 ACL 都落入三个列表之一

范围从不扩大:针对 Topic:foo* 的前缀 ACL 会变成针对 Topic:foo* 的绑定,绝不会变成集群范围的授权。计划带有校验和,过期或被修改的计划会被拒绝,直到你重新校验为止。

bindings
要创建的角色绑定,每条都列出它所替代的源 ACL ID
unmapped
没有任何规则能够转换的 ACL;如何处理由你决定
rejected
工具不会转换的 ACL,例如 DENY 规则

有 MDS 访问权限,或者没有

给工具 MDS 访问权限,它就会自己应用并验证绑定。或者让 MDS 凭据留在原处:把计划输出为 Confluent CLI 脚本、CFK ConfluentRolebinding 清单或 MDS curl 命令,交给你的流水线去应用,之后再从一台有 MDS 访问权限的主机上运行 verify。想快速看一眼时,convert 可以在一次调用中完成 extract、plan 和 emit。

选择路径(英文)

一次性转换
monedula-acl-rbac convert \
  --from yaml \
  --input acls.yaml \
  --scopes scopes.yaml \
  --rules rules.yaml \
  --principals principals.yaml \
  > bindings.sh

一个可以拿给审计员看的运行目录

每次运行都会把输入快照、生效的规则、计划、日志和回滚脚本保存在同一个目录中,并记录使用了哪个凭据来源。两次 apply 运行不会在同一个目录上发生竞争。

runs/2026-05-21T10-00-00Z/
  acls.json          source ACL snapshot
  plan.json          checksummed plan
  report.txt         what maps to what, and why
  would-apply.log    dry-run calls
  apply.log          what was created
  verify.json        effective-access results
  delete-acls.sh     generated, run by you

安装

Go
go install github.com/monedula-dev/monedula-acl-rbac-converter/cmd/monedula-acl-rbac@latest

适用于 Linux、macOS 和 Windows 的发布归档,连同经 cosign 签名的校验和文件和 SBOM,可在发布页面获取。参见安装并验证发布版本(英文)。

常见问题

monedula-acl-rbac-converter 免费吗?可以在工作中使用吗?
是的。它采用 AGPL-3.0 许可证,没有付费版本;在你自己的基础设施上运行它,并不要求你公开代码或配置:AGPL 义务在你分发它(无论是否经过修改)或让他人通过网络使用修改后的版本时适用。
它会删除我的 ACL 吗?
不会自行删除:apply 从不删除源 ACL,delete-acls 会写出一个 kafka-acls --remove 脚本及其回滚脚本,由你检查并运行。该脚本只包含通过 verify 的 ACL;如果没有任何 ACL 通过,delete-acls 会报错停止。参见删除已转换的 ACL(英文)。
DENY ACL 会怎样处理?
它们从不会被自动转换;计划会把它们列为已拒绝。delete-deny-acls 会生成一个脚本,在运行时为每条 ACL 重新检查有效权限;而通配 principal 的 DENY 永远无法通过该工具移除。参见移除 DENY ACL(英文)。
它能处理多少条 ACL?
每次运行最多处理约 10,000 条 ACL,全部保存在内存中。超出时,请按 principal 分批,每批使用一个运行目录。

支持

由工具的开发者提供帮助

我们可以帮助你在大规模环境中运行 monedula-acl-rbac-converter,从设计到日常运维。

隶属于
Monedula Flock

同一团队开发的更多 Apache Kafka 免费工具。关于 Flock

Go, AGPL-3.0, v1.0.0

monedula-gitops

一款面向 Apache Kafka 的 GitOps 工具:管理主题、访问权限、配额、schema、SCRAM 用户和 Confluent RBAC,可通过 CLI 或 Kubernetes operator 运行。