Identity and Access Management

用量

本页面简要介绍了 Identity and Access Management (IAM),以及如何使用它控制 Cloud Storage 中的存储桶、代管式文件夹和对象资源的访问权限。

概览

借助 IAM,您可以控制谁有权访问您的 Google Cloud 项目中的资源。资源包括 Cloud Storage 存储桶、存储桶中的托管式文件夹、存储桶中存储的对象,以及 Compute Engine 实例等其他 Google Cloud 实体。

主账号指的是 IAM 适用的“谁”。主账号可以是个人用户、群组、网域,甚至是全体公众。主账号被授予角色,使他们能够在 Cloud Storage 以及整个 Google Cloud 中执行操作。每个角色都是一项或多项权限的集合。权限是 IAM 的基本单位:每项权限允许您执行一种特定的操作。

例如,storage.objects.create 权限允许您创建对象。此权限包含在某些角色中,例如 Storage Object Creator (roles/storage.objectCreator)(该角色授予在存储桶中创建对象所需的权限)以及 Storage Object Admin (roles/storage.objectAdmin)(该角色授予使用对象的各种权限)。

您在资源上设置的 IAM 角色集合称为 IAM 政策。这些角色授予的访问权限适用于设置了该政策的资源以及该资源中包含的所有资源。例如,您可以为存储桶设置 IAM 政策,用于为用户提供对该存储桶及其对象的管理控制权。您还可以为整个项目设置 IAM 政策,让其他用户能够查看该项目任何存储桶中的对象。

如果您有 Google Cloud 组织资源,则还可以使用 IAM 拒绝政策拒绝对资源的访问。当拒绝政策附加到资源时,该政策中的主账号不能使用指定的权限访问该资源或其中的任何子资源,无论它们被授予什么角色。拒绝政策会替换任何 IAM 允许政策。

权限

权限允许主账号对 Cloud Storage 中的存储桶、托管式文件夹或对象执行特定操作。例如,storage.buckets.list 权限允许主账号列出项目中的存储桶。您不能直接为主账号授予权限,而应授予捆绑了一项或多项权限的角色

如需查看适用于 Cloud Storage 的 IAM 权限的参考列表,请参阅适用于 Cloud Storage 的 IAM 权限

角色

角色包含一个或多个权限。例如,Storage Object Viewer (roles/storage.objectViewer) 角色包含 storage.objects.getstorage.objects.list 权限。您可以为主账号授予角色,以允许他们对项目中的存储桶、托管式文件夹和对象执行操作。

如需查看适用于 Cloud Storage 的 IAM 角色的参考列表,请参阅适用于 Cloud Storage 的 IAM 角色

在项目级层、存储桶级层或代管式文件夹级层授予角色

您可以在项目级层、存储桶级层或代管式文件夹级层为主账号授予角色。这些角色授予的权限会在整个资源层次结构中以累加方式应用。您可以在资源层次结构的不同级层授予角色,从而在权限模型中实现更精细的权限。

例如,假设您希望为用户授予读取项目内任何存储桶中的对象的权限,但仅在存储桶 A 中创建对象。为实现此目的,您可以为用户授予项目的 Storage Object Viewer (roles/storage.objectViewer) 角色(允许用户读取存储在项目内任何存储桶中的任何对象),以及存储桶 A 的 Storage Object Creator (roles/storage.objectCreator) 角色(允许用户仅在该存储桶中创建对象)。

某些角色可以在资源层次结构的所有级层使用。在项目级层使用时,这些角色提供的权限适用于项目中的所有存储桶、文件夹和对象。在存储桶级层使用时,这些权限仅适用于特定存储桶以及其中的文件夹和对象。此类角色的示例包括 Storage Admin (roles/storage.admin) 角色、Storage Object Viewer (roles/storage.objectViewer) 角色和 Storage Object Creator (roles/storage.objectCreator) 角色。

某些角色只能在一个级层应用。例如,您只能在存储桶级层或代管文件夹级层应用 Storage Legacy Object Owner (roles/storage.legacyObjectOwner) 角色。允许您控制 IAM 拒绝政策的 IAM 角色只能在组织级层应用。

与 ACL 的关系

除了 IAM 之外,如果您未为存储桶启用统一存储桶级访问权限功能,那么您的存储桶和对象可以使用称为访问控制列表 (ACL) 的旧版访问权限控制系统。一般而言,您应避免使用 ACL,并且应为存储桶启用统一存储桶级访问权限。本部分介绍了在允许使用存储桶及其中的对象的 ACL 时应注意的事项。

旧版存储桶 IAM 角色与存储桶 ACL 协同工作:当您添加或移除旧版存储桶角色时,与存储桶关联的 ACL 会反映您的更改。同样地,更改特定于存储桶的 ACL 时,也会更新该存储桶相应的旧版存储桶 IAM 角色。

旧版存储桶角色 等效 ACL
Storage Legacy Bucket Reader (roles/storage.legacyBucketReader) 存储桶读取者
Storage Legacy Bucket Writer (roles/storage.legacyBucketWriter) 存储桶写入者
Storage Legacy Bucket Owner (roles/storage.legacyBucketOwner) 存储桶所有者

所有其他存储桶级 IAM 角色(包括旧版对象 IAM 角色)独立于 ACL 运行。同样,所有项目级 IAM 角色独立于 ACL 运行。例如,如果您为用户提供 Storage Object Viewer (roles/storage.objectViewer) 角色,则 ACL 保持不变。

由于对象 ACL 独立于 IAM 角色运行,因此不会出现在 IAM 政策的层次结构中。在评估谁有权访问您的某个对象时,除了检查项目级和存储桶级 IAM 政策之外,还要确保检查对象的 ACL

IAM 拒绝政策与 ACL

IAM 拒绝政策适用于 ACL 授予的访问权限。例如,如果您创建拒绝主账号对项目的 storage.objects.get 权限的拒绝政策,则该主账号无法查看该项目中的对象,即使它们被授予对个别对象的 READER 权限也是如此。

用于更改 ACL 的 IAM 权限

您可以使用 IAM 向主账号授予更改对象上的 ACL 所需的权限。以下 storage.buckets 权限组合在一起,允许用户处理存储桶 ACL 和默认对象 ACL:.get.getIamPolicy.setIamPolicy.update

同样地,以下 storage.objects 权限组合在一起,允许用户处理对象 ACL:.get.getIamPolicy.setIamPolicy.update

自定义角色

虽然 IAM 包含许多涵盖了常见用例的预定义角色,您可能还是想要定义自己的角色(包含您指定的一组权限)。为此,IAM 提供了自定义角色

主账号类型

主账号分为许多不同的类型。例如,Google 账号和 Google 群组代表两种常规类型,而 allAuthenticatedUsersallUsers 是两种特殊类型。如需查看 IAM 中的主账号类型列表,请参阅主账号标识符。如需详细了解一般意义上的主账号,请参阅与身份相关的概念

便利值

Cloud Storage 支持便利值,这是一个可以专门应用于 IAM 存储桶政策的特殊主账号集。您通常应该在生产环境中避免使用便利值,因为它们需要授予基本角色,不建议在生产环境中执行这样的操作。

便利值是由两部分组成的标识符,由基本角色和项目 ID 组成:

  • projectOwner:PROJECT_ID
  • projectEditor:PROJECT_ID
  • projectViewer:PROJECT_ID

便利值充当授予基本角色与 IAM 角色的主账号之间的桥梁:授予便利值的 IAM 角色,实际上也授予给指定项目 ID 的指定基本角色的所有主账号。

例如,假设 jane@example.com 和 john@example.com 拥有名为 my-example-project 的项目的 Viewer (roles/viewer) 基本角色,并且您在该项目中拥有名为 my-bucket 的存储桶。如果将 my-bucket 的 Storage Object Creator (roles/storage.objectCreator) 角色授予便利值 projectViewer:my-example-project,则 jane@example.com 和 john@example.com 均会获得与 my-bucket 的 Storage Object Creator 角色关联的权限。

您可以授予和撤消对存储桶便利值的访问权限,但请注意,Cloud Storage 在某些情况下会自动应用这些值。如需了解详情,请参阅 Cloud Storage 中基本角色的可修改行为

条件

IAM Conditions 允许您设置条件,控制如何向主账号授予权限或者拒绝向主账号授予权限。Cloud Storage 支持以下类型的条件特性:

  • resource.name:根据存储桶或对象名称授予或拒绝对存储桶和对象的访问权限。您还可以使用 resource.type 授予对存储分区或对象的访问权限,但这样做对于使用 resource.name 而言几乎是多余的。以下条件示例将 IAM 设置应用于具有相同前缀的所有对象:

    resource.name.startsWith('projects/_/buckets/BUCKET_NAME/objects/OBJECT_PREFIX')

  • 日期/时间:设置权限的失效日期。

    request.time < timestamp('2019-01-01T00:00:00Z')

这些条件表达式是使用通用表达式语言 (CEL) 子集的逻辑语句。您可以在存储桶 IAM 政策的角色绑定中指定条件。

请注意以下限制:

  • 您必须先对存储桶启用统一存储桶级层访问权限,然后才能在存储桶级层添加条件。尽管条件是在项目级允许的,但您应该迁移项目中的所有存储桶,以实现统一存储桶级访问权限,从而防止 Cloud Storage ACL 替换项目级 IAM 条件。您可以应用统一存储桶级访问权限限制条件,为您项目中的所有新存储桶启用统一存储桶级层访问权限。
  • 当使用 JSON API 针对具有条件的存储桶调用 getIamPolicysetIamPolicy 时,您必须将 IAM 政策版本设置为 3。
  • 由于 storage.objects.list 权限是在存储桶级别授予的,因此您无法使用 resource.name 条件属性来限制对存储桶中部分对象的对象列出权限。
  • 已过期的条件依然保留在 IAM 政策中,直到您将其移除。

与 Cloud Storage 工具结合使用

虽然无法通过 XML API 设置 IAM 权限,但获得 IAM 权限的用户仍可以使用 XML API 以及其他工具来访问 Cloud Storage。

如需了解哪些 IAM 权限允许用户使用不同的 Cloud Storage 工具执行操作,请参阅 Cloud Storage 的 IAM 参考文档

后续步骤