通过本文您可以全面了解 Google Cloud Platform (GCP) 的存储服务、如何访问存储桶以及如何确保按照预期配置存储桶。原文地址:https://blog.lightspin.io/gcp-buckets-publicly-accessible
Google Cloud Storage 是 Google 的存储服务,用于存储和检索具有高可靠性、高性能和可用性的数据。对于许多公司和组织而言,存储服务在安全性方面往往是一个弱点,因为它们通常包含敏感信息,但很难正确配置。
通过本文,您可以全面了解 Google Cloud Platform (GCP) 的存储服务、如何访问存储桶以及如何确保按照预期配置存储桶。
简介
GCP 的 Cloud Storage 服务可让您创建存储桶并在其中存储对象。与所有其他 GCP 资源一样,每个存储桶都遵循以下结构的项目中:
在存储桶中,您可以创建数据对象并管理对其层次结构的每个级别的访问权限,从项目级别开始,深入到存储桶/对象级别(取决于存储桶的配置)。
在我们深入探讨如何在 GCP 中访问存储桶和对象之前,您应该了解并熟悉以下几个术语:
基本/原始角色
旧角色早于身份访问管理 (IAM)。它们包含大量权限并且非常强大。三个基本角色是所有者、编辑者和查看者,按权力的降序排列。当您检查存储桶的权限时,您会看到自动添加了一些 IAM 绑定。其中包括项目所有者、编辑者和查看者的绑定。
例如:新创建的存储桶的 IAM 权限:
gsutil iam get gs://MY-BUCKET
allUsers
代表互联网上任何人的特殊标识符。并非所有资源类型都支持此主体类型,其中包括项目资源,这意味着您不能将项目级别的权限分配给所有用户。
allAuthenticatedUsers
一个特殊标识符,代表互联网上所有已通过 Google 帐户进行身份验证的服务帐户和用户。这包括个人 Gmail 帐户。不包括未经身份验证的用户,例如匿名访问者。并非所有资源类型都支持此主体类型,其中包括项目资源,这意味着您无法将项目级权限分配给 allAuthenticatedUsers。
访问 GCP 存储分区
在管理对存储桶和对象的访问时,您可以在 IAM 和访问控制列表 (ACL) 之间进行选择。
IAM – 所有 GCP 资源中的权限机制。IAM 使您能够精细地授予对特定资源的访问权限并阻止对其他资源的访问。如果您不熟悉 IAM,请查看GCP 的文档。
ACL – 一种用于定义谁可以访问您的存储桶和对象以及他们拥有什么级别的访问权限的机制。ACL 由两部分组成,权限和范围(或被授予者)。前者指的是可以执行的动作(如读取和写入),后者定义了“谁”(用户、组等)。有关 ACL 的更多信息,请访问GCP 的文档。
IAM 权限与 ACL 尽管 IAM 权限和 ACL 似乎是两种不同的机制,但它们是相同的。添加 ACL 时,它会转换为 IAM 权限。每个 ACL 的访问级别相当于一个 IAM 角色:
这是一个简短的演示:
我们先来看看新存储桶的 IAM 和 ACL。
gsutil iam get gs://MY-BUCKET
gsutil acl get gs://MY-BUCKET
现在,让我们添加一个ACL,为存储桶级别的所有用户提供读取访问权限。
gsutil acl ch -u AllUsers:R gs://MY-BUCKET
让我们再次检查存储桶的 IAM 和 ACL。
gsutil acl get gs://MY-BUCKET
gsutil iam get gs://MY-BUCKET
我们可以看到,当我们存储桶的 ACL 更新时,IAM 也(自动)更新了。
使用某些存储桶配置,可以为同一存储桶中的不同对象设置不同的访问级别。当我们在对象级别使用 ACL 和 IAM 权限时,它们之间的关系保持一致。
要记住的另一件事是,反过来(例如,从 IAM 到 ACL)并不是那么简单:
- 将存储桶的旧角色(ACL 角色)之一分配为存储桶级别的 IAM 权限将显示在存储桶的 ACL 中。
- 在存储桶级别将对象的旧角色(ACL 角色)之一分配为 IAM 权限,不会出现在存储桶的 ACL 或对象的 ACL 中(尽管它适用于它们)。
- 在存储桶(或对象)级别将非存储旧角色(可以是预定义角色或自定义角色,具有或不具有存储权限)的角色分配为 IAM 权限,不会出现在 ACL 中。
这里还值得一提的是storage.buckets.setIamPolicy。如果用户对存储桶具有此权限,则他可以添加和删除与存储桶及其对象相关的权限。例如,他可以为自己分配包含storage.buckets.和storage.objects.的“roles/storage.admin”角色. 这相当于授予对存储桶及其对象的完全访问权限。由于 GCP 的资源是分层组织的,因此可以通过存储桶的 IAM 策略控制对象的权限。每个资源都从它之前的所有资源继承权限。对象在层次结构中低于它们所在的存储桶,因此在存储桶级别授予的每个权限都将应用于存储桶的所有对象。
访问控制类型
创建存储桶时,您需要选择是使用统一访问还是细粒度访问来应用权限:
统一
统一存储桶级访问权限仅允许您使用 IAM 来管理权限。IAM 权限将应用于存储桶中包含的所有对象。它还允许您使用在使用 ACL 时不可用的功能,例如 IAM 条件和云审计日志。
细粒度
通过细粒度访问,您可以将 IAM 和 ACL 用于存储桶以及单个对象。重要的是要理解,这仍然意味着如果您在存储桶级别授予读取对象等权限,它将适用于它包含的所有对象。
公共存储桶
在 GCP Cloud Storage 中,创建的存储桶不允许公开访问。至于对象,则取决于它们的存储桶。如果在存储桶级别授予对对象的公共访问权限,则每个对象(旧的或新的)都将是公共的。否则,默认情况下它们将无法公开访问。
要公开存储桶,您需要向“allUsers”或“allAuthenticatedUsers”组授予所需的权限。例如,如果我想向每个人授予对特定对象的读取权限,我可以运行以下命令:
使用ACL:
gsutil acl ch -u AllUsers:R gs://BUCKET_NAME/OBJECT_NAME
使用IAM:
gsutil iam ch allUsers:legacyObjectReader gs://BUCKET_NAME/OBJECT_NAME
作为直接结果,如果您不向“allUsers”或“allAuthenticatedUsers”组授予任何存储权限,您的存储桶将保持私有状态。对于安全措施,GCP 提供了强制执行公共访问预防的能力。使用此功能会撤销现有的公共访问权限(IAM 和 ACL)并防止添加允许公共访问的新权限。不管存储桶访问控制是细粒度还是统一,任何现有的 IAM 策略和授予“allUsers”和“allAuthenticatedUsers”访问权限的 ACL 都将被覆盖(但不会被删除)。
GCP 公共存储桶评估
GCP 为每个存储桶提供公共访问评估,并将其呈现在管理控制台中。
访问权限分为三个级别:
- 对互联网公开
- 受对象 ACL的约束
- 不公开
下面是一个简单的流程图:
如何提高您的存储桶和对象的可见性
为了帮助您处理这些问题,Lightspin 创建了一个开源 Python 工具,您可以使用它来全面了解您的存储桶和对象。它为您提供有关可公开访问的存储桶和对象的信息,以及对它们的实际访问级别。看看吧!