在没有公共 IP 的私有 VPC 中使用 S3 端点时限制对单个服务器的 S3 访问

在没有公共 IP 的私有 VPC 中使用 S3 端点时限制对单个服务器的 S3 访问

问题

当实例没有公共 IP 地址并且您在 VPC 中使用 S3 端点时,如何将对 S3 存储桶的访问限制到单个 AWS 实例?

背景和细节

我们有一个 VPC,它有一个虚拟专用网关,它通过 VPN 连接到我们的本地数据中心。VPC 没有互联网网关。服务器没有公共 IP 地址。有一个正确设置的 S3 端点和路由表。假设有一个包含三个实例的子网。我们有两个 S3 存储桶尚未创建,它们将被加密。

我们希望限制实例 A S3 存储桶 A 和实例 B 对 S3 存储桶 B 的访问。实例 C 不应访问任何一个存储桶。

我们还需要能够从公共互联网上传信息到存储桶。这种访问只能通过特定 IP 进行,使用存储桶策略可以轻松实现。不过这可能会对解决方案产生影响。

AWS 文档上的此页面

您不能使用 IAM 策略或存储桶策略来允许从 VPC IPv4 CIDR 范围(私有 IPv4 地址范围)进行访问。VPC CIDR 块可以重叠或相同,这可能会导致意外结果。因此,您不能在 IAM 策略中使用 aws:SourceIp 条件来通过 VPC 终端节点向 Amazon S3 发出请求。这适用于用户和角色的 IAM 策略以及任何存储桶策略。如果语句包含 aws:SourceIp 条件,则该值无法与任何提供的 IP 地址或范围匹配。您可以改为执行以下操作:

  • 使用您的路由表来控制哪些实例可以通过终端节点访问 Amazon S3 中的资源。
  • 对于存储桶策略,您可以限制对特定终端节点或特定 VPC 的访问。有关更多信息,请参阅使用 Amazon S3 存储桶策略。

我们不能使用路由表,因为我们有两个需要访问不同存储桶的实例。

我也读过这一页,这对我们的情况没有帮助。

选项:KMS 密钥

我怀疑如果我们为每个存储桶提供自己的 KMS 密钥,并将密钥的访问权限限制到相应的实例,那么只有该实例才能访问解密的数据。我认为这会起作用,但存在一些复杂性,而且我不能 100% 确定,因为我没有对 KMS 做过太多工作。

这种方法的优点是默认拒绝,通过配置允许。由于帐户的用户数量,我们不能依赖配置来默认拒绝,正如 Alex 在下面非常有帮助地建议的那样。

想法、意见或建议

有没有人有其他建议或想法可以跟进?或者对 KMS 想法有什么想法/进一步的细节?

答案1

我的建议是使用实例角色。这些角色可以由在特定实例上运行的应用程序通过查询元数据服务来承担 - AWS 工具原生支持此功能 - 允许在该实例上运行的应用程序使用这些凭证。有关它们的更多详细信息这里

然后,您将拥有一个针对实例 A 的唯一角色和另一个针对实例 B 的唯一角色,然后查看此帖子,了解如何使用存储桶策略根据特定角色限制对存储桶的访问。这里

这可能应该能满足您的需要。虽然 KMS 也是一种方法,但可能更复杂。您还可以将实例移动到不同的 VPC 中,并使用端点策略根据源 VPC 限制访问 - 但这会非常混乱并会带来其他复杂情况。

相关内容