#18418·rook

多站点管理员/公共 RGW 会将所有数据泄露到应用程序中

作者: kyrofa创建于 2026年9月17日更新于 2026年9月17日
标签feature

这是对 #14544 和 #15043 的跟进,这两个问题都已在 #15064 中解决。 我需要具有公开可路由的 S3 存储桶。然而,为了尽可能减少攻击面,我只希望公开暴露 S3。我不希望暴露 Swift 等,当然也不希望暴露管理 API。我使用了文档中描述的多站点方法(尽管我只有一个站点)来部署一对共享池 RGW 实例: 1. 一个内部 RGW,其中包含管理 API 和与之关联的存储类,用于配置 ObjectBucketClaim(OBC) 2. 一个外部 RGW,仅暴露 s3 API,没有存储类,以及允许公开访问的 HTTP 路由 我希望这是一个实现细节,最终从消费应用程序的角度来看不会改变任何事情:我创建了一个 OBC,然后就有了一个秘密和配置映射,使我能够通过 BUCKET_HOST 等访问它。这就是事情出错的地方: BUCKET_HOST 指向 (1)。好吧,在 (2) 的整个目的在于能够将预签名 URL 交给 (2) 并返回应用程序的用户,以便他们可以从自己的设备上访问它。将 URL 交给 (1) 是毫无意义的,因为它是一个内部服务。事实上,应用程序本身只使用 S3,它实际上不需要了解 (1) 除了最初的 OBC 之外! 对此的"明显"解决方案是使用 advertiseEndpointspec.hosting 配置中为内部 RGW 指向外部 RGW,这(我相信)将适当设置 BUCKET_HOST。然而,根据 文档,Rook 本身使用该广告的端点来执行管理操作,即访问它并期望找到管理 API。好吧,在 (2) 的整个目的在于不使用管理 API。显然这不是一个解决方案。 因此,今天,任何使用此功能的应用程序都需要真正了解它不应使用 OBC 配置映射中的 BUCKET_HOST,而实际上应该使用完全不同的 URL 来访问 S3。换句话说,此配置泄露了存在两个 RGW 的事实,一个用于配置,一个用于公开访问。我认为在理想情况下,这对应用程序来说是完全透明的,并且集群维护者可以在私有 ObjectStore CRD 中指定消费应用程序应该使用的访问 URL,而不干扰 Rook 的内部操作。